00001 #pragma once
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 class CAsyncReader;
00018
00019
00020
00021 class CAsyncOutputPin
00022 : public IAsyncReader,
00023 public CBasePin
00024 {
00025 protected:
00026 CAsyncReader* m_pReader;
00027 CAsyncIo * m_pIo;
00028
00029
00030
00031
00032
00033
00034 BOOL m_bQueriedForAsyncReader;
00035
00036 HRESULT InitAllocator(IMemAllocator **ppAlloc);
00037
00038 public:
00039
00040 CAsyncOutputPin(
00041 HRESULT * phr,
00042 CAsyncReader *pReader,
00043 CAsyncIo *pIo,
00044 CCritSec * pLock);
00045
00046 ~CAsyncOutputPin();
00047
00048
00049
00050
00051 DECLARE_IUNKNOWN
00052 STDMETHODIMP NonDelegatingQueryInterface(REFIID, void**);
00053
00054
00055 STDMETHODIMP Connect(
00056 IPin * pReceivePin,
00057 const AM_MEDIA_TYPE *pmt
00058 );
00059
00060
00061
00062
00063
00064 HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);
00065
00066
00067 HRESULT CheckMediaType(const CMediaType* pType);
00068
00069
00070 HRESULT CheckConnect(IPin *pPin)
00071 {
00072 m_bQueriedForAsyncReader = FALSE;
00073 return CBasePin::CheckConnect(pPin);
00074 }
00075
00076
00077 HRESULT CompleteConnect(IPin *pReceivePin)
00078 {
00079 if (m_bQueriedForAsyncReader) {
00080 return CBasePin::CompleteConnect(pReceivePin);
00081 } else {
00082 #ifdef VFW_E_NO_TRANSPORT
00083 return VFW_E_NO_TRANSPORT;
00084 #else
00085 return E_FAIL;
00086 #endif
00087 }
00088 }
00089
00090
00091 HRESULT BreakConnect()
00092 {
00093 m_bQueriedForAsyncReader = FALSE;
00094 return CBasePin::BreakConnect();
00095 }
00096
00097
00098
00099
00100
00101
00102
00103 STDMETHODIMP RequestAllocator(
00104 IMemAllocator* pPreferred,
00105 ALLOCATOR_PROPERTIES* pProps,
00106 IMemAllocator ** ppActual);
00107
00108
00109
00110
00111
00112
00113
00114
00115 STDMETHODIMP Request(
00116 IMediaSample* pSample,
00117 DWORD dwUser);
00118
00119
00120
00121
00122
00123
00124 STDMETHODIMP WaitForNext(
00125 DWORD dwTimeout,
00126 IMediaSample** ppSample,
00127 DWORD * pdwUser);
00128
00129
00130
00131
00132
00133 STDMETHODIMP SyncReadAligned(
00134 IMediaSample* pSample);
00135
00136
00137
00138
00139
00140 STDMETHODIMP SyncRead(
00141 LONGLONG llPosition,
00142 LONG lLength,
00143 BYTE* pBuffer);
00144
00145
00146
00147
00148 STDMETHODIMP Length(
00149 LONGLONG* pTotal,
00150 LONGLONG* pAvailable);
00151
00152
00153
00154
00155 STDMETHODIMP BeginFlush(void);
00156 STDMETHODIMP EndFlush(void);
00157
00158 };
00159
00160
00161
00162
00163
00164
00165 class CAsyncReader : public CBaseFilter, public IAMFilterMiscFlags
00166 {
00167
00168 protected:
00169
00170 CCritSec m_csFilter;
00171
00172
00173 CAsyncIo m_Io;
00174
00175
00176 CAsyncOutputPin m_OutputPin;
00177
00178
00179 CMediaType m_mt;
00180
00181 public:
00182
00183
00184
00185 CAsyncReader(
00186 TCHAR *pName,
00187 LPUNKNOWN pUnk,
00188 CAsyncStream *pStream,
00189 HRESULT *phr,
00190 const CLSID& clsid);
00191 ~CAsyncReader();
00192
00193 DECLARE_IUNKNOWN;
00194 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
00195
00196
00197 STDMETHODIMP_(ULONG) GetMiscFlags();
00198
00199
00200 int GetPinCount();
00201 CBasePin *GetPin(int n);
00202
00203
00204 const CMediaType *LoadType() const
00205 {
00206 return &m_mt;
00207 }
00208
00209 virtual HRESULT Connect(
00210 IPin * pReceivePin,
00211 const AM_MEDIA_TYPE *pmt
00212 )
00213 {
00214 return m_OutputPin.CBasePin::Connect(pReceivePin, pmt);
00215 }
00216 };