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
7.0 KiB
232 lines
7.0 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__
|