/* Copyright (c) 1998-1999 Microsoft Corporation */ #ifndef __MEDIA_STREAM_TERMINAL__ #define __MEDIA_STREAM_TERMINAL__ // // The CLSID that's used to create us. // EXTERN_C const CLSID CLSID_MediaStreamingTerminal_PRIVATE; #ifdef INSTANTIATE_GUIDS_NOW // {AED6483F-3304-11d2-86F1-006008B0E5D2} const GUID CLSID_MediaStreamingTerminal_PRIVATE = { 0xaed6483f, 0x3304, 0x11d2, { 0x86, 0xf1, 0x0, 0x60, 0x8, 0xb0, 0xe5, 0xd2 } }; #endif // INSTANTIATE_GUIDS_NOW /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // // The terminal object itself // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // forward declaration for the class being aggregated by CMediaTerminal class CMediaTerminalFilter; class CMediaTerminal : public CComCoClass, public CBaseTerminal, public ITPluggableTerminalInitialization, public ITAMMediaFormat, public IAMStreamConfig, public IAMBufferNegotiation, public CMSPObjectSafetyImpl { public: // REMOVE THESE when we derive from CSingleFilterTerminal. STDMETHOD(RunRenderFilter) (void) { return E_NOTIMPL; } STDMETHOD(StopRenderFilter) (void) { return E_NOTIMPL; } virtual HRESULT GetNumExposedPins( IN IGraphBuilder * pGraph, OUT DWORD * pdwNumPins ); virtual HRESULT GetExposedPins( OUT IPin ** ppPins ); public: BEGIN_COM_MAP(CMediaTerminal) COM_INTERFACE_ENTRY(ITPluggableTerminalInitialization) COM_INTERFACE_ENTRY(ITAMMediaFormat) COM_INTERFACE_ENTRY(IAMStreamConfig) COM_INTERFACE_ENTRY(IAMBufferNegotiation) COM_INTERFACE_ENTRY(IObjectSafety) COM_INTERFACE_ENTRY_CHAIN(CBaseTerminal) COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_pIUnkTerminalFilter.p) END_COM_MAP() DECLARE_PROTECT_FINAL_CONSTRUCT() DECLARE_GET_CONTROLLING_UNKNOWN() DECLARE_REGISTRY_RESOURCEID(IDR_MediaStreamingTerminal) // set the member variables inline CMediaTerminal(); #ifdef DEBUG virtual ~CMediaTerminal(); #endif // DEBUG HRESULT FinalConstruct(); void FinalRelease(); // ITPluggableTerminalInitialization STDMETHOD(InitializeDynamic) ( IN IID iidTerminalClass, IN DWORD dwMediaType, IN TERMINAL_DIRECTION Direction, IN MSP_HANDLE htAddress ); // IAMStreamConfig - this is for use by the filter graph end of the terminal // to configure the format and capture capabilities if relevant // the application is supposed to call DeleteMediaType(*ppmt) (on success) // implemented using the aggregated filter's public GetFormat method STDMETHOD(GetFormat)( OUT AM_MEDIA_TYPE **ppmt ); // implemented using the aggregated filter's public SetFormat method STDMETHOD(SetFormat)( IN AM_MEDIA_TYPE *pmt ); // IAMStreamConfig - Used by the MSP, queried from the output pin // if our pin is an input pin (we are a render MST) then these return VFW_E_INVALID_DIRECTION STDMETHOD(GetNumberOfCapabilities)( /*[out]*/ int *piCount, /*[out]*/ int *piSize // ); // pSCC of GetStreamC ) { return E_NOTIMPL; } STDMETHOD(GetStreamCaps)( /*[in]*/ int iIndex, // 0 to #caps-1 /*[out]*/ AM_MEDIA_TYPE **ppmt, /*[out]*/ BYTE *pSCC ) { return E_NOTIMPL; } // IAMBufferNegotiation - these return E_NOTIMPL STDMETHOD(GetAllocatorProperties)( OUT ALLOCATOR_PROPERTIES *pProperties ); STDMETHOD(SuggestAllocatorProperties)( IN const ALLOCATOR_PROPERTIES *pProperties ); // ITAMMediaFormat - the read/write user of the terminal uses this to // get and set the media format of the samples // since there is only one filter in this base class implementation (i.e. the two // ends of the terminal have the same media format), both of // the get and set methods are redirected to Get/Set Format STDMETHOD(get_MediaFormat)( OUT AM_MEDIA_TYPE **ppFormat ); STDMETHOD(put_MediaFormat)( IN const AM_MEDIA_TYPE *pFormat ); protected: typedef CComAggObject FILTER_COM_OBJECT; // we create an aggregated instance of this FILTER_COM_OBJECT *m_pAggInstance; // ptr to the created media terminal filter CComContainedObject *m_pAggTerminalFilter; // NOTE: m_pIUnkTerminalFilter, m_pOwnPin are references // to the media terminal filter that are obtained in // FinalConstruct. The corresponding refcnts are released // immediately after obtaining the interfaces // IUnknown i/f of the aggregated media terminal filter CComPtr m_pIUnkTerminalFilter; // holds the pin exposed by the aggregated media terminal filter // this is returned in GetTerminalPin() // its a weak reference and shouldn't be a CComPtr IPin *m_pOwnPin; // holds the IAMMediaStream i/f exposed by the aggregated media // terminal filter // its a weak reference and shouldn't be a CComPtr IAMMediaStream *m_pIAMMediaStream; // holds the internally created Media stream filter interface // needed in JoinFilter to compare the internally created filter with // the passed in filter to join CComPtr m_pICreatedMediaStreamFilter; // the base filter interface for the internally created media // stream filter CComPtr m_pBaseFilter; long m_lMediaType; // CBaseTerminal methods virtual HRESULT AddFiltersToGraph(); virtual HRESULT RemoveFiltersFromGraph(); virtual DWORD GetSupportedMediaTypes(void) { return (DWORD) (TAPIMEDIATYPE_AUDIO | TAPIMEDIATYPE_VIDEO) ; } private: // used to implement other methods void SetMemberInfo( IN DWORD dwFriendlyName, IN long lMediaType ); HRESULT SetNameInfo( IN long lMediaType, IN TERMINAL_DIRECTION TerminalDirection, OUT MSPID &PurposeId, OUT STREAM_TYPE &StreamType, OUT const GUID *&pAmovieMajorType ); // creates the media stream filter and adds own IAMMediaStream i/f to it HRESULT CreateAndJoinMediaStreamFilter(); }; // set the member variables inline CMediaTerminal::CMediaTerminal( ) : m_pAggInstance(NULL), m_pAggTerminalFilter(NULL), m_pIUnkTerminalFilter(NULL), m_pOwnPin(NULL), m_pIAMMediaStream(NULL), m_lMediaType(0) { } #endif // __MEDIA_STREAM_TERMINAL__