windows-nt/Source/XPSP1/NT/multimedia/dshow/streams/ddstream/stream.h

236 lines
7.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
// Copyright (c) 1997 - 1998 Microsoft Corporation. All Rights Reserved.
// Stream.h : Declaration of the CStream
#ifndef __STREAM_H_
#define __STREAM_H_
class CSample;
class CPump;
/////////////////////////////////////////////////////////////////////////////
// CStream
class ATL_NO_VTABLE CStream :
public CComObjectRootEx<CComMultiThreadModel>,
public IPin,
public IMemInputPin,
public IAMMediaStream,
public IMemAllocator
{
friend CPump;
public:
typedef CComObjectRootEx<CComMultiThreadModel> _BaseClass;
DECLARE_GET_CONTROLLING_UNKNOWN()
//
// METHODS
//
CStream();
virtual ~CStream();
//
// IMediaStream
//
STDMETHODIMP GetMultiMediaStream(
/* [out] */ IMultiMediaStream **ppMultiMediaStream);
STDMETHODIMP GetInformation(
/* [optional][out] */ MSPID *pPurposeId,
/* [optional][out] */ STREAM_TYPE *pType);
STDMETHODIMP SendEndOfStream(DWORD dwFlags);
//
// IAMMediaStream
//
STDMETHODIMP Initialize(
IUnknown *pSourceObject,
DWORD dwFlags,
/* [in] */ REFMSPID PurposeId,
/* [in] */ const STREAM_TYPE StreamType);
STDMETHODIMP SetState(
/* [in] */ FILTER_STATE State);
STDMETHODIMP JoinAMMultiMediaStream(
/* [in] */ IAMMultiMediaStream *pAMMultiMediaStream);
STDMETHODIMP JoinFilter(
/* [in] */ IMediaStreamFilter *pMediaStreamFilter);
STDMETHODIMP JoinFilterGraph(
/* [in] */ IFilterGraph *pFilterGraph);
//
// IPin
//
STDMETHODIMP Disconnect();
STDMETHODIMP ConnectedTo(IPin **pPin);
STDMETHODIMP ConnectionMediaType(AM_MEDIA_TYPE *pmt);
STDMETHODIMP QueryPinInfo(PIN_INFO * pInfo);
STDMETHODIMP QueryDirection(PIN_DIRECTION * pPinDir);
STDMETHODIMP QueryId(LPWSTR * Id);
STDMETHODIMP QueryAccept(const AM_MEDIA_TYPE *pmt);
STDMETHODIMP QueryInternalConnections(IPin* *apPin, ULONG *nPin);
STDMETHODIMP EndOfStream(void);
STDMETHODIMP BeginFlush(void);
STDMETHODIMP EndFlush(void);
STDMETHODIMP NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
//
// IMemInputPin
//
STDMETHODIMP GetAllocator(IMemAllocator ** ppAllocator);
STDMETHODIMP NotifyAllocator(IMemAllocator * pAllocator, BOOL bReadOnly);
STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES*pProps);
STDMETHODIMP ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSamplesProcessed);
STDMETHODIMP ReceiveCanBlock();
STDMETHODIMP Connect(IPin * pReceivePin, const AM_MEDIA_TYPE *pmt);
STDMETHODIMP EnumMediaTypes(IEnumMediaTypes **ppEnum);
//
// IMemAllocator
//
STDMETHODIMP Commit();
STDMETHODIMP Decommit();
STDMETHODIMP ReleaseBuffer(IMediaSample *pBuffer);
// Note that NotifyAllocator calls this so override it
// if you care. Audio doesn't care becuase it's not
// really using this allocator at all.
STDMETHODIMP SetProperties(
ALLOCATOR_PROPERTIES* pRequest,
ALLOCATOR_PROPERTIES* pActual)
{
return S_OK;
}
STDMETHODIMP GetProperties(ALLOCATOR_PROPERTIES* pProps)
{
return E_UNEXPECTED;
}
//
// Special CStream methods
//
virtual HRESULT GetMediaType(ULONG Index, AM_MEDIA_TYPE **ppMediaType) = 0;
// Special to make sample to discard stuff into
virtual HRESULT CreateTempSample(CSample **ppSample)
{
return E_FAIL;
}
virtual LONG GetChopSize()
{
return 0;
}
public:
//
// Private methods
//
void GetName(LPWSTR);
HRESULT AllocSampleFromPool(const REFERENCE_TIME * pStartTime, CSample **ppSample);
void AddSampleToFreePool(CSample *pSample);
bool StealSampleFromFreePool(CSample *pSample, BOOL bAbort);
HRESULT FinalConstruct(void);
HRESULT ConnectThisMediaType(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt);
HRESULT CheckReceiveConnectionPin(IPin * pConnector);
#ifdef DEBUG
#define CHECKSAMPLELIST _ASSERTE(CheckSampleList());
bool CheckSampleList();
#else
#define CHECKSAMPLELIST
#endif
BEGIN_COM_MAP(CStream)
COM_INTERFACE_ENTRY(IPin)
COM_INTERFACE_ENTRY(IMemInputPin)
COM_INTERFACE_ENTRY(IMemAllocator)
COM_INTERFACE_ENTRY2(IMediaStream, IAMMediaStream)
COM_INTERFACE_ENTRY(IAMMediaStream)
END_COM_MAP()
//
// MEMBER VARIABLES
//
public:
//
// These SHOULD NOT BE CCOMPTRS since we hold weak references to both of them
// (we never addref them).
//
IMediaStreamFilter *m_pFilter;
IBaseFilter *m_pBaseFilter;
IFilterGraph *m_pFilterGraph;
IAMMultiMediaStream *m_pMMStream;
// Allocator held during connection
CComPtr<IMemAllocator> m_pAllocator;
// Writable streams
CPump *m_pWritePump;
// Stream configuration
STREAM_TYPE m_StreamType;
PIN_DIRECTION m_Direction;
MSPID m_PurposeId;
REFERENCE_TIME m_rtSegmentStart;
// Allocator state information
bool m_bUsingMyAllocator;
bool m_bSamplesAreReadOnly;
bool m_bCommitted;
long m_lRequestedBufferCount;
// Sample list and semaphores
CSample *m_pFirstFree;
CSample *m_pLastFree;
long m_cAllocated;
long m_lWaiting;
HANDLE m_hWaitFreeSem;
REFERENCE_TIME m_rtWaiting;
// Filter state
FILTER_STATE m_FilterState;
// Pin state
CComPtr<IPin> m_pConnectedPin;
CComPtr<IQualityControl> m_pQC;
CComQIPtr<IMemInputPin, &IID_IMemInputPin> m_pConnectedMemInputPin;
AM_MEDIA_TYPE m_ConnectedMediaType;
AM_MEDIA_TYPE m_ActualMediaType;
bool m_bFlushing;
bool m_bEndOfStream;
bool m_bStopIfNoSamples;
bool m_bNoStall;
};
//
// Pump class used for write streams
//
class CPump
{
public:
CPump(CStream *pStream);
~CPump();
static HRESULT CreatePump(CStream *pStream, CPump **ppNewPump);
HRESULT PumpMainLoop(void);
void Run(bool);
public:
CStream *m_pStream;
HANDLE m_hThread;
HANDLE m_hRunEvent;
bool m_bShutDown;
CComAutoCriticalSection m_CritSec;
};
#endif //__STREAM_H_