diff options
Diffstat (limited to 'AVStream/avssamp/video.h')
| -rw-r--r-- | AVStream/avssamp/video.h | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/AVStream/avssamp/video.h b/AVStream/avssamp/video.h new file mode 100644 index 00000000..36b9dbe5 --- /dev/null +++ b/AVStream/avssamp/video.h @@ -0,0 +1,221 @@ +/************************************************************************** + + AVStream Filter-Centric Sample + + Copyright (c) 1999 - 2001, Microsoft Corporation + + File: + + video.h + + Abstract: + + This file contains the video capture pin header. + + History: + + created 6/11/01 + +**************************************************************************/ + +class CVideoCapturePin : + public CCapturePin { + +private: + + // + // A scratch buffer to write into. Due to the fact that we're likely + // sitting upstream of the VMR and getting video memory, I don't want the + // image synthesizer writing to video memory a single byte at a time. + // This will be the buffer that the image synth uses. After a synthesis, + // the buffer will get copied into the data buffers for capture. + // + PUCHAR m_SynthesisBuffer; + + // + // The captured video info header. The settings for image synthesis will + // be based off this header. + // + PKS_VIDEOINFOHEADER m_VideoInfoHeader; + + // + // The image synthesizer. This object is used to construct synthesized + // image data in the video format specified by the connection format. + // + CImageSynthesizer *m_ImageSynth; + + // + // CaptureVideoInfoHeader(): + // + // This routine stashes the video info header set on the pin connection + // in the CVideoCapturePin object. This is used to determine necessary + // variables for image synthesis, etc... + // + PKS_VIDEOINFOHEADER + CaptureVideoInfoHeader ( + ); + +protected: + +public: + + // + // CVideoCapturePin(): + // + // Construct a new video capture pin. + // + CVideoCapturePin ( + IN PKSPIN Pin + ) : + CCapturePin (Pin) + { + } + + // + // ~CVideoCapturePin(): + // + // Destruct a video capture pin. + // + virtual + ~CVideoCapturePin ( + ) + { + } + + // + // CaptureFrame(): + // + // Called from the filter processing routine to indicate that the pin + // should attempt to trigger capture of a video frame. This routine + // will copy synthesized image data into the frame buffer and complete + // the frame buffer. + // + virtual + NTSTATUS + CaptureFrame ( + IN PKSPROCESSPIN ProcessPin, + IN ULONG Tick + ); + + // + // Pause(): + // + // Called when the video capture pin is transitioning into the pause + // state. This will instruct the capture filter to start the timer DPC's + // at the interval demanded by the video info header in the connection + // format. + // + virtual + NTSTATUS + Pause ( + IN KSSTATE FromState + ); + + // + // Acquire(): + // + // Called when the video capture pin is transitioning into the acquire + // state. This will create the necessary image synthesizer to begin + // synthesizing frame capture data when the pin transitions to the + // appropriate state. + // + virtual + NTSTATUS + Acquire ( + IN KSSTATE FromState + ); + + // + // Stop(): + // + // Called when the video capture pin is transitioning into a stop state. + // This simply destroys the image synthesizer in preparation for creating + // a new one next acquire. + // + virtual + NTSTATUS + Stop ( + IN KSSTATE FromState + ); + + /************************************************* + + Dispatch Functions + + *************************************************/ + + // + // DispatchCreate(): + // + // This is the creation dispatch for the video capture pin on the filter. + // It creates the CVideoCapturePin, associates it with the AVStream pin + // object and bags the class object for automatic cleanup when the + // pin is closed. + // + static + NTSTATUS + DispatchCreate ( + IN PKSPIN Pin, + IN PIRP Irp + ); + + // + // DispatchSetFormat(): + // + // This is the set data format dispatch for the pin. This will be called + // BEFORE pin creation to validate that a data format selected is a match + // for the range pulled out of our range list. It will also be called + // for format changes. + // + // If OldFormat is NULL, this is an indication that it's the initial + // call and not a format change. Even fixed format pins get this call + // once. + // + static + NTSTATUS + DispatchSetFormat ( + IN PKSPIN Pin, + IN PKSDATAFORMAT OldFormat OPTIONAL, + IN PKSMULTIPLE_ITEM OldAttributeList OPTIONAL, + IN const KSDATARANGE *DataRange, + IN const KSATTRIBUTE_LIST *AttributeRange OPTIONAL + ); + + // + // IntersectHandler(): + // + // This is the data intersection handler for the capture pin. This + // determines an optimal format in the intersection of two ranges, + // one local and one possibly foreign. If there is no compatible format, + // STATUS_NO_MATCH is returned. + // + static + NTSTATUS + IntersectHandler ( + IN PKSFILTER Filter, + IN PIRP Irp, + IN PKSP_PIN PinInstance, + IN PKSDATARANGE CallerDataRange, + IN PKSDATARANGE DescriptorDataRange, + IN ULONG BufferSize, + OUT PVOID Data OPTIONAL, + OUT PULONG DataSize + ); + + // + // CleanupSynth(): + // + // Called when the Image Synthesizer is removed from the object bag + // to be cleaned up. We simply delete the image synth. + // + static + void + CleanupSynth ( + IN CImageSynthesizer *ImageSynth + ) + { + delete ImageSynth; + } + +}; + |
