00001
00002
00003
00004
00005
00006 #ifndef __TRANSFRM__
00007 #define __TRANSFRM__
00008
00009 class CTransformFilter;
00010
00011 class CTransformInputPin : public CBaseInputPin
00012 {
00013 friend class CTransformFilter;
00014
00015 protected:
00016 CTransformFilter *m_pTransformFilter;
00017
00018 public:
00019
00020 CTransformInputPin(
00021 TCHAR *pObjectName,
00022 CTransformFilter *pTransformFilter,
00023 HRESULT * phr,
00024 LPCWSTR pName);
00025 #ifdef UNICODE
00026 CTransformInputPin(
00027 char *pObjectName,
00028 CTransformFilter *pTransformFilter,
00029 HRESULT * phr,
00030 LPCWSTR pName);
00031 #endif
00032
00033 STDMETHODIMP QueryId(LPWSTR * Id)
00034 {
00035 return AMGetWideString(L"In", Id);
00036 }
00037
00038 HRESULT CheckConnect(IPin *pPin);
00039 HRESULT BreakConnect();
00040 HRESULT CompleteConnect(IPin *pReceivePin);
00041
00042 HRESULT CheckMediaType(const CMediaType* mtIn);
00043
00044 HRESULT SetMediaType(const CMediaType* mt);
00045
00046 STDMETHODIMP Receive(IMediaSample * pSample);
00047
00048 STDMETHODIMP EndOfStream(void);
00049
00050 STDMETHODIMP BeginFlush(void);
00051
00052 STDMETHODIMP EndFlush(void);
00053
00054 STDMETHODIMP NewSegment(
00055 REFERENCE_TIME tStart,
00056 REFERENCE_TIME tStop,
00057 double dRate);
00058
00059
00060 virtual HRESULT CheckStreaming();
00061
00062
00063 public:
00064 CMediaType& CurrentMediaType() { return m_mt; };
00065
00066 };
00067
00068 class CTransformOutputPin : public CBaseOutputPin
00069 {
00070 friend class CTransformFilter;
00071
00072 protected:
00073 CTransformFilter *m_pTransformFilter;
00074
00075 public:
00076
00077
00078 IUnknown * m_pPosition;
00079
00080 CTransformOutputPin(
00081 TCHAR *pObjectName,
00082 CTransformFilter *pTransformFilter,
00083 HRESULT * phr,
00084 LPCWSTR pName);
00085 #ifdef UNICODE
00086 CTransformOutputPin(
00087 CHAR *pObjectName,
00088 CTransformFilter *pTransformFilter,
00089 HRESULT * phr,
00090 LPCWSTR pName);
00091 #endif
00092 ~CTransformOutputPin();
00093
00094
00095 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
00096
00097
00098
00099 STDMETHODIMP QueryId(LPWSTR * Id)
00100 {
00101 return AMGetWideString(L"Out", Id);
00102 }
00103
00104
00105
00106 HRESULT CheckConnect(IPin *pPin);
00107 HRESULT BreakConnect();
00108 HRESULT CompleteConnect(IPin *pReceivePin);
00109
00110
00111 HRESULT CheckMediaType(const CMediaType* mtOut);
00112
00113
00114 HRESULT SetMediaType(const CMediaType *pmt);
00115
00116
00117
00118 HRESULT DecideBufferSize(
00119 IMemAllocator * pAlloc,
00120 ALLOCATOR_PROPERTIES *pProp);
00121
00122
00123 HRESULT GetMediaType(int iPosition,CMediaType *pMediaType);
00124
00125
00126 STDMETHODIMP Notify(IBaseFilter * pSender, Quality q);
00127
00128
00129 public:
00130 CMediaType& CurrentMediaType() { return m_mt; };
00131 };
00132
00133 class AM_NOVTABLE CTransformFilter : public CBaseFilter
00134 {
00135
00136 public:
00137
00138
00139
00140
00141 virtual int GetPinCount();
00142 virtual CBasePin * GetPin(int n);
00143 STDMETHODIMP FindPin(LPCWSTR Id, IPin **ppPin);
00144
00145
00146
00147 STDMETHODIMP Stop();
00148 STDMETHODIMP Pause();
00149
00150 public:
00151
00152 CTransformFilter(TCHAR *, LPUNKNOWN, REFCLSID clsid);
00153 #ifdef UNICODE
00154 CTransformFilter(CHAR *, LPUNKNOWN, REFCLSID clsid);
00155 #endif
00156 ~CTransformFilter();
00157
00158
00159
00160
00161
00162
00163
00164 virtual HRESULT Transform(IMediaSample * pIn, IMediaSample *pOut);
00165
00166
00167 virtual HRESULT CheckInputType(const CMediaType* mtIn) PURE;
00168
00169
00170 virtual HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut) PURE;
00171
00172
00173
00174
00175
00176 virtual HRESULT DecideBufferSize(
00177 IMemAllocator * pAllocator,
00178 ALLOCATOR_PROPERTIES *pprop) PURE;
00179
00180
00181 virtual HRESULT GetMediaType(int iPosition, CMediaType *pMediaType) PURE;
00182
00183
00184
00185
00186
00187
00188 virtual HRESULT StartStreaming();
00189 virtual HRESULT StopStreaming();
00190
00191
00192 virtual HRESULT AlterQuality(Quality q);
00193
00194
00195 virtual HRESULT SetMediaType(PIN_DIRECTION direction,const CMediaType *pmt);
00196
00197
00198 virtual HRESULT CheckConnect(PIN_DIRECTION dir,IPin *pPin);
00199 virtual HRESULT BreakConnect(PIN_DIRECTION dir);
00200 virtual HRESULT CompleteConnect(PIN_DIRECTION direction,IPin *pReceivePin);
00201
00202
00203 virtual HRESULT Receive(IMediaSample *pSample);
00204
00205
00206 HRESULT InitializeOutputSample(IMediaSample *pSample, IMediaSample **ppOutSample);
00207
00208
00209 virtual HRESULT EndOfStream(void);
00210 virtual HRESULT BeginFlush(void);
00211 virtual HRESULT EndFlush(void);
00212 virtual HRESULT NewSegment(
00213 REFERENCE_TIME tStart,
00214 REFERENCE_TIME tStop,
00215 double dRate);
00216
00217 #ifdef PERF
00218
00219
00220 virtual void RegisterPerfId()
00221 {m_idTransform = MSR_REGISTER(TEXT("Transform"));}
00222 #endif
00223
00224 protected:
00225
00226 #ifdef PERF
00227 int m_idTransform;
00228 #endif
00229 BOOL m_bEOSDelivered;
00230 BOOL m_bSampleSkipped;
00231 BOOL m_bQualityChanged;
00232
00233
00234
00235 CCritSec m_csFilter;
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246 CCritSec m_csReceive;
00247
00248
00249
00250 friend class CTransformInputPin;
00251 friend class CTransformOutputPin;
00252 CTransformInputPin *m_pInput;
00253 CTransformOutputPin *m_pOutput;
00254 };
00255
00256 #endif
00257