windows-nt/Source/XPSP1/NT/net/tapi/skywalker/confmsp/confvid.h
2020-09-26 16:20:57 +08:00

342 lines
7.9 KiB
C++

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
Confvid.h
Abstract:
Definitions for audio streams
Author:
Mu Han (muhan) 15-September-1998
--*/
#ifndef __CONFVID_H_
#define __CONFVID_H_
// if there is no data for five senconds, the pin can be reused.
const DWORD g_dwVideoPinTimeOut = 5000;
const DWORD g_dwVideoThreadPriority = THREAD_PRIORITY_NORMAL;
const DWORD g_dwVideoChannels = 20;
const BOOL g_fCIF = FALSE;
const DWORD g_dwVideoSampleRate = 7;
const int CIFWIDTH = 0x160;
const int CIFHEIGHT = 0x120;
const int QCIFWIDTH = 0xb0;
const int QCIFHEIGHT = 0x90;
typedef struct _PINMAPEVENT
{
IPin * pIPin;
DWORD dwSSRC;
} PINMAPEVENT;
// This data structure keeps the information for on brach of filters off one
// demux output pin.
typedef struct _BRANCH
{
IPin * pIPin;
DWORD dwSSRC;
IBaseFilter * pRPHFilter;
IBaseFilter * pCodecFilter;
ITTerminal * pITTerminal;
ITSubStream * pITSubStream;
} BRANCH;
class ATL_NO_VTABLE CStreamVideoRecv :
public CIPConfMSPStream,
public IDispatchImpl<ITSubStreamControl,
&IID_ITSubStreamControl, &LIBID_TAPI3Lib>,
public IDispatchImpl<ITParticipantSubStreamControl,
&IID_ITParticipantSubStreamControl, &LIBID_IPConfMSPLib>
{
public:
CStreamVideoRecv();
BEGIN_COM_MAP(CStreamVideoRecv)
COM_INTERFACE_ENTRY(ITSubStreamControl)
COM_INTERFACE_ENTRY(ITParticipantSubStreamControl)
COM_INTERFACE_ENTRY2(IDispatch, ITStream)
COM_INTERFACE_ENTRY_CHAIN(CIPConfMSPStream)
END_COM_MAP()
// ITSubStreamControl methods, called by the app.
STDMETHOD (CreateSubStream) (
IN OUT ITSubStream ** ppSubStream
);
STDMETHOD (RemoveSubStream) (
IN ITSubStream * pSubStream
);
STDMETHOD (EnumerateSubStreams) (
OUT IEnumSubStream ** ppEnumSubStream
);
STDMETHOD (get_SubStreams) (
OUT VARIANT * pSubStreams
);
// ITParticipantSubStreamControl methods, called by the app.
STDMETHOD (get_SubStreamFromParticipant) (
IN ITParticipant * pITParticipant,
OUT ITSubStream ** ppITSubStream
);
STDMETHOD (get_ParticipantFromSubStream) (
IN ITSubStream * pITSubStream,
OUT ITParticipant ** ppITParticipant
);
STDMETHOD (SwitchTerminalToSubStream) (
IN ITTerminal * pITTerminal,
IN ITSubStream * pITSubStream
);
// method called by the MSPCall object.
virtual HRESULT Init(
IN HANDLE hAddress,
IN CMSPCallBase * pMSPCall,
IN IMediaEvent * pGraph,
IN DWORD dwMediaType,
IN TERMINAL_DIRECTION Direction
);
HRESULT Configure(
IN STREAMSETTINGS &StreamSettings
);
HRESULT SubStreamSelectTerminal(
IN ITSubStream * pITSubStream,
IN ITTerminal * pITTerminal
);
protected:
HRESULT CheckTerminalTypeAndDirection(
IN ITTerminal * pTerminal
);
HRESULT ShutDown();
HRESULT SetUpFilters();
HRESULT SetUpInternalFilters();
HRESULT ConnectTerminal(
IN ITTerminal * pITTerminal
);
HRESULT DisconnectTerminal(
IN ITTerminal * pITTerminal
);
HRESULT ConfigureRTPFilter(
IN IBaseFilter * pIBaseFilter
);
HRESULT InternalCreateSubStream(
OUT ITSubStream ** ppITSubStream
);
HRESULT ProcessPinMappedEvent(
IN IPin * pIPin
);
HRESULT ProcessPinUnmapEvent(
IN IPin * pIPin
);
HRESULT ProcessParticipantLeave(
IN DWORD dwSSRC
);
HRESULT ProcessNewSender(
IN DWORD dwSSRC,
IN ITParticipant *pITParticipant
);
HRESULT NewParticipantPostProcess(
IN DWORD dwSSRC,
IN ITParticipant *pITParticipant
);
HRESULT ProcessGraphEvent(
IN long lEventCode,
IN long lParam1,
IN long lParam2
);
HRESULT AddOneBranch(
BRANCH * pBranch
);
HRESULT RemoveOneBranch(
BRANCH * pBranch
);
HRESULT ConnectCodecToTerminal(
IN IBaseFilter * pCodecFilter,
IN ITTerminal * pITTerminal
);
protected:
IRTPDemuxFilter * m_pIRTPDemux;
CMSPArray <ITSubStream *> m_SubStreams;
// This array store information about all the branches off the demux
CMSPArray <BRANCH> m_Branches;
CMSPArray <PINMAPEVENT> m_PinMappedEvents;
};
class ATL_NO_VTABLE CStreamVideoSend : public CIPConfMSPStream
{
public:
CStreamVideoSend();
HRESULT Configure(
IN STREAMSETTINGS &StreamSettings
);
protected:
HRESULT CheckTerminalTypeAndDirection(
IN ITTerminal * pTerminal
);
HRESULT SetUpFilters();
HRESULT ConnectTerminal(
IN ITTerminal * pITTerminal
);
HRESULT CStreamVideoSend::CreateSendFilters(
IN IPin *pCapturePin
);
HRESULT CStreamVideoSend::ConnectPreview(
IN IPin *pPreviewInputPin
);
HRESULT ConfigureVideoCaptureTerminal(
IN ITTerminalControl* pTerminal,
IN WCHAR * szPinName,
OUT IPin ** ppIPin
);
HRESULT FindPreviewInputPin(
IN ITTerminalControl* pTerminal,
OUT IPin ** ppIpin
);
HRESULT ConfigureRTPFilter(
IN IBaseFilter * pIBaseFilter
);
protected:
DWORD m_dwFrameRate;
};
class ATL_NO_VTABLE CSubStreamVideoRecv :
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IDispatchImpl<ITSubStream, &IID_ITSubStream, &LIBID_IPConfMSPLib>,
public CMSPObjectSafetyImpl
{
public:
BEGIN_COM_MAP(CSubStreamVideoRecv)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ITSubStream)
COM_INTERFACE_ENTRY(IObjectSafety)
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pFTM)
END_COM_MAP()
DECLARE_GET_CONTROLLING_UNKNOWN()
#ifdef DEBUG_REFCOUNT
ULONG InternalAddRef();
ULONG InternalRelease();
#endif
CSubStreamVideoRecv();
// methods of the CComObject
virtual void FinalRelease();
// ITSubStream methods, called by the app.
STDMETHOD (SelectTerminal) (
IN ITTerminal * pTerminal
);
STDMETHOD (UnselectTerminal) (
IN ITTerminal * pTerminal
);
STDMETHOD (EnumerateTerminals) (
OUT IEnumTerminal ** ppEnumTerminal
);
STDMETHOD (get_Terminals) (
OUT VARIANT * pTerminals
);
STDMETHOD (get_Stream) (
OUT ITStream ** ppITStream
);
STDMETHOD (StartSubStream) ();
STDMETHOD (PauseSubStream) ();
STDMETHOD (StopSubStream) ();
// methods called by the videorecv object.
virtual HRESULT Init(
IN CStreamVideoRecv * pStream
);
BOOL GetCurrentParticipant(
DWORD *pdwSSRC,
ITParticipant ** ppParticipant
);
VOID SetCurrentParticipant(
DWORD dwSSRC,
ITParticipant * pParticipant
);
BOOL ClearCurrentTerminal();
BOOL SetCurrentTerminal(ITTerminal * pTerminal);
protected:
// Pointer to the free threaded marshaler.
IUnknown * m_pFTM;
// The list of terminal objects in the substream.
CMSPArray <ITTerminal *> m_Terminals;
// The lock that protects the substream object. The stream object
// should never acquire the lock and then call a MSPCall method
// that might lock. This is protected by having a const pointer
// to the call object.
CMSPCritSection m_lock;
CStreamVideoRecv * m_pStream;
ITParticipant * m_pCurrentParticipant;
};
#endif