Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

232 lines
6.8 KiB

/*
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<CMediaTerminal, &CLSID_MediaStreamingTerminal_PRIVATE>,
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<CMediaTerminalFilter> FILTER_COM_OBJECT;
// we create an aggregated instance of this
FILTER_COM_OBJECT *m_pAggInstance;
// ptr to the created media terminal filter
CComContainedObject<CMediaTerminalFilter> *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<IUnknown> 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<IMediaStreamFilter> m_pICreatedMediaStreamFilter;
// the base filter interface for the internally created media
// stream filter
CComPtr<IBaseFilter> 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__