235 lines
7.5 KiB
C++
235 lines
7.5 KiB
C++
//------------------------------------------------------------------------------
|
|
// File: SampleCGB.h
|
|
//
|
|
// Desc: DirectShow sample code - definition of sample capture graph builder
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
#include <ks.h>
|
|
|
|
|
|
#ifndef KSCATEGORY_ENCODER
|
|
#define STATIC_KSCATEGORY_ENCODER\
|
|
0x19689bf6, 0xc384, 0x48fd, 0xad, 0x51, 0x90, 0xe5, 0x8c, 0x79, 0xf7, 0xb
|
|
DEFINE_GUIDSTRUCT("19689BF6-C384-48fd-AD51-90E58C79F70B", KSCATEGORY_ENCODER);
|
|
#define KSCATEGORY_ENCODER DEFINE_GUIDNAMED(KSCATEGORY_ENCODER)
|
|
#endif
|
|
|
|
#ifndef KSCATEGORY_MULTIPLEXER
|
|
#define STATIC_KSCATEGORY_MULTIPLEXER\
|
|
0x236C9559, 0xADCE, 0x4736, 0xBF, 0x72, 0xBA, 0xB3, 0x4E, 0x39, 0x21, 0x96
|
|
DEFINE_GUIDSTRUCT("236C9559-ADCE-4736-BF72-BAB34E392196", KSCATEGORY_MULTIPLEXER);
|
|
#define KSCATEGORY_MULTIPLEXER DEFINE_GUIDNAMED(KSCATEGORY_MULTIPLEXER)
|
|
#endif
|
|
|
|
#ifndef MEDIASUBTYPE_Mpeg2
|
|
#define STATIC_MEDIASUBTYPE_Mpeg2\
|
|
0x7DC2C665, 0x4033, 0x4CAF, 0x92, 0x73, 0xF7, 0xD7, 0x97, 0xFB, 0x24, 0x5C
|
|
DEFINE_GUIDSTRUCT("7DC2C665-4033-4CAF-9273-F7D797FB245C", MEDIASUBTYPE_Mpeg2);
|
|
#define MEDIASUBTYPE_Mpeg2 DEFINE_GUIDNAMED(MEDIASUBTYPE_Mpeg2)
|
|
#endif
|
|
|
|
#ifndef CLSID_Dump
|
|
#define STATIC_CLSID_Dump\
|
|
0x36a5f770, 0xfe4c, 0x11ce, 0xa8, 0xed, 0x00, 0xaa, 0x00, 0x2f, 0xea, 0xb5
|
|
DEFINE_GUIDSTRUCT("36a5f770-fe4c-11ce-a8ed-00aa002feab5", CLSID_Dump);
|
|
#define CLSID_Dump DEFINE_GUIDNAMED(CLSID_Dump)
|
|
#endif
|
|
|
|
|
|
|
|
class ISampleCaptureGraphBuilder
|
|
{
|
|
public:
|
|
|
|
public:
|
|
ISampleCaptureGraphBuilder()
|
|
{
|
|
AudPID_ = 0xC0;
|
|
VidPID_ = 0xE0;
|
|
HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER,
|
|
IID_ICaptureGraphBuilder2, (void**)&graphBuilder2_ );
|
|
ASSERT( S_OK == hr );
|
|
}
|
|
|
|
//
|
|
// OnFinalConstruct build the ICaptureGraphBuilder2
|
|
//
|
|
void ReleaseFilters( )
|
|
{
|
|
pMultiplexer_.Release();
|
|
pEncoder_.Release();
|
|
pMPEG2Demux_.Release();
|
|
pMediaControl_.Release();
|
|
pAudioPin_.Release();
|
|
pVideoPin_.Release();
|
|
|
|
}
|
|
|
|
public:
|
|
|
|
STDMETHOD(AllocCapFile)( LPCOLESTR lpwstr, DWORDLONG dwlSize );
|
|
|
|
STDMETHOD(ControlStream)( const GUID *pCategory,
|
|
const GUID *pType,
|
|
IBaseFilter *pFilter,
|
|
REFERENCE_TIME *pstart,
|
|
REFERENCE_TIME *pstop,
|
|
WORD wStartCookie,
|
|
WORD wStopCookie
|
|
);
|
|
|
|
STDMETHOD(CopyCaptureFile)( LPOLESTR lpwstrOld,
|
|
LPOLESTR lpwstrNew,
|
|
int fAllowEscAbort,
|
|
IAMCopyCaptureFileProgress *pCallback
|
|
);
|
|
|
|
STDMETHOD(FindInterface)(const GUID *pCategory,
|
|
const GUID *pType,
|
|
IBaseFilter *pf,
|
|
REFIID riid,
|
|
void **ppint
|
|
);
|
|
|
|
STDMETHOD(FindPin)( IUnknown *pSource,
|
|
PIN_DIRECTION pindir,
|
|
const GUID *pCategory,
|
|
const GUID *pType,
|
|
BOOL fUnconnected,
|
|
int num,
|
|
IPin **ppPin
|
|
);
|
|
|
|
|
|
STDMETHOD(GetFiltergraph)( IGraphBuilder **ppfg );
|
|
|
|
STDMETHOD(RenderStream)( const GUID *pCategory,
|
|
const GUID *pType,
|
|
IUnknown *pSource,
|
|
IBaseFilter *pIntermediate,
|
|
IBaseFilter *pSink
|
|
);
|
|
|
|
|
|
STDMETHOD(SetFiltergraph)( IGraphBuilder *pfg );
|
|
|
|
|
|
STDMETHOD(SetOutputFileName)(
|
|
const GUID *pType,
|
|
LPCOLESTR lpwstrFile,
|
|
IBaseFilter **ppf,
|
|
IFileSinkFilter **pSink
|
|
);
|
|
|
|
|
|
protected:
|
|
|
|
HRESULT CreateVideoPin( IMpeg2Demultiplexer *pIMpeg2Demux );
|
|
HRESULT CreateAudioPin( IMpeg2Demultiplexer *pIMpeg2Demux );
|
|
|
|
|
|
HRESULT ConfigureMPEG2Demux( IBaseFilter *pFilter);
|
|
|
|
HRESULT FindMPEG2Pin( IBaseFilter *pFilter, IPin** ppPin );
|
|
HRESULT FindPin(
|
|
IBaseFilter *pFilter,
|
|
const REGPINMEDIUM& regPinMedium,
|
|
PIN_DIRECTION direction,
|
|
BOOL video,
|
|
IPin **ppPin);
|
|
|
|
HRESULT GetMedium( IPin *pPin, REGPINMEDIUM& regPinMedium );
|
|
HRESULT AddMPEG2Demux( );
|
|
|
|
HRESULT FindEncoder( IEnumMoniker *pEncoders, REGPINMEDIUM pinMedium,
|
|
IBaseFilter **ppEncoder );
|
|
|
|
BOOL IsMPEG2Pin( IPin *pPin );
|
|
BOOL IsVideoPin( IPin *pPin );
|
|
BOOL IsAudioPin( IPin *pPin );
|
|
|
|
BOOL HasMediaType( IPin *pPin, REFGUID majorType );
|
|
|
|
HRESULT FindAudioPin( IBaseFilter *pFilter, IPin **ppPin );
|
|
HRESULT FindVideoPin( IBaseFilter *pFilter, IPin **ppPin );
|
|
|
|
//
|
|
// tries to build MPEG2 segment for pFilter capture filter
|
|
//
|
|
HRESULT BuildMPEG2Segment( IBaseFilter *pFilter );
|
|
//
|
|
// renders pPin to a MPEG2 demux
|
|
//
|
|
HRESULT RenderToMPEG2Demux( IPin *pPin );
|
|
//
|
|
// renders pin pPin with pinMedium to an encoder
|
|
//
|
|
HRESULT RenderToMPEG2Demux( IPin *pPin, const REGPINMEDIUM& pinMedium,
|
|
IEnumMoniker *pEncoders );
|
|
//
|
|
// renders pPin to a MPEG2 demux; there is no special medium, the encoder will be
|
|
// serched in the encoder category
|
|
//
|
|
HRESULT RenderToMPEG2Demux( IPin *pPin, IEnumMoniker *pEncoders );
|
|
//
|
|
// renders the encoder to a MPEG2 demux
|
|
//
|
|
HRESULT ConnectEncoderToMPEG2Demux( IBaseFilter *pEncoder,
|
|
const REGPINMEDIUM& pinMedium );
|
|
//
|
|
// renders the demux to a MPEG2 demux
|
|
//
|
|
HRESULT ConnectMultiplexerToMPEG2Demux( IBaseFilter *pEncoder,
|
|
IEnumMoniker *pMultiplexers );
|
|
//
|
|
// helper methods; connects a pin to a filter and a filter to another one
|
|
//
|
|
HRESULT ConnectPin( IPin *pPin, IBaseFilter *pFilter );
|
|
HRESULT ConnectFilters(IBaseFilter *pUpFilter,
|
|
IBaseFilter *pDownFilter);
|
|
|
|
//
|
|
// for audio pin; the multiplexer has already beem chosen
|
|
// if there is no encoder, the method fails
|
|
//
|
|
HRESULT ConnectAudioPinToMultiplexer(IPin *pPin,
|
|
IBaseFilter *pMultiplexer);
|
|
|
|
|
|
//
|
|
// helper methods - get the encoders using SystemDeviceEnum or IFilterMapper2
|
|
//
|
|
HRESULT GetEncodersByCategory( IEnumMoniker **ppEncoders );
|
|
HRESULT GetEncodersByEnumerating( IPin *pPin, const REGPINMEDIUM& pinMedium,
|
|
IEnumMoniker **ppEncoders );
|
|
|
|
//
|
|
// helper methods - get the multiplexers using SystemDeviceEnum or IFilterMapper2
|
|
//
|
|
HRESULT GetMultiplexersByCategory( IEnumMoniker **ppMultiplexers);
|
|
HRESULT GetMultiplexersByFilterMapper( IEnumMoniker **ppMultiplexers,
|
|
const REGPINMEDIUM& pinMedium );
|
|
|
|
|
|
SmartPtr<IBaseFilter> pMultiplexer_;
|
|
SmartPtr<IBaseFilter> pEncoder_;
|
|
SmartPtr<IBaseFilter> pMPEG2Demux_;
|
|
|
|
protected:
|
|
|
|
SmartPtr<ICaptureGraphBuilder2> graphBuilder2_;
|
|
SmartPtr<IGraphBuilder> graph_;
|
|
SmartPtr<IMediaControl> pMediaControl_;
|
|
|
|
ULONG VidPID_,
|
|
AudPID_;
|
|
|
|
private:
|
|
SmartPtr<IPin> pAudioPin_;
|
|
SmartPtr<IPin> pVideoPin_;
|
|
|
|
};
|