38 #define QueryFilterInfoReleaseGraph(fi) if ((fi).pGraph) (fi).pGraph->Release(); 40 #define QueryPinInfoReleaseFilter(pi) if ((pi).pFilter) (pi).pFilter->Release(); 64 IReferenceClock *m_pClock;
87 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,
void ** ppv);
93 STDMETHODIMP GetClassID(CLSID *pClsID);
97 STDMETHODIMP GetState(DWORD dwMSecs, FILTER_STATE *State);
99 STDMETHODIMP SetSyncSource(IReferenceClock *pClock);
101 STDMETHODIMP GetSyncSource(IReferenceClock **pClock);
109 STDMETHODIMP Pause();
115 STDMETHODIMP Run(REFERENCE_TIME tStart);
121 virtual HRESULT StreamTime(
CRefTime& rtStream);
126 return ((m_State == State_Paused) || (m_State == State_Running));
157 FILTER_STATE m_State;
158 IReferenceClock *m_pClock;
165 IFilterGraph *m_pGraph;
166 IMediaEventSink *m_pSink;
202 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,
void ** ppv);
204 STDMETHODIMP_(ULONG) NonDelegatingRelease();
211 STDMETHODIMP GetClassID(CLSID *pClsID);
215 STDMETHODIMP GetState(DWORD dwMSecs, FILTER_STATE *State);
217 STDMETHODIMP SetSyncSource(IReferenceClock *pClock);
219 STDMETHODIMP GetSyncSource(IReferenceClock **pClock);
227 STDMETHODIMP Pause();
232 STDMETHODIMP Run(REFERENCE_TIME tStart);
238 virtual HRESULT StreamTime(
CRefTime& rtStream);
243 return ((m_State == State_Paused) || (m_State == State_Running));
248 return (m_State == State_Stopped);
256 STDMETHODIMP EnumPins(
257 IEnumPins ** ppEnum);
261 STDMETHODIMP FindPin(
266 STDMETHODIMP QueryFilterInfo(
267 FILTER_INFO * pInfo);
269 STDMETHODIMP JoinFilterGraph(
270 IFilterGraph * pGraph,
276 STDMETHODIMP QueryVendorInfo(
287 LONG_PTR EventParam1,
288 LONG_PTR EventParam2);
291 IFilterGraph *GetFilterGraph() {
299 HRESULT ReconnectPin(IPin *pPin, AM_MEDIA_TYPE
const *pmt);
302 virtual LONG GetPinVersion();
303 void IncrementPinVersion();
307 virtual int GetPinCount() PURE;
308 virtual CBasePin *GetPin(
int n) PURE;
312 STDMETHODIMP Register();
313 STDMETHODIMP Unregister();
340 bool m_bRunTimeError;
341 bool m_bCanReconnectWhenActive;
342 bool m_bTryMyTypesFirst;
345 IQualityControl *m_pQSink;
360 void DisplayPinInfo(IPin *pReceivePin);
361 void DisplayTypeInfo(IPin *pPin,
const CMediaType *pmt);
363 void DisplayPinInfo(IPin *pReceivePin) {};
364 void DisplayTypeInfo(IPin *pPin,
const CMediaType *pmt) {};
379 HRESULT TryMediaTypes(
382 IEnumMediaTypes *pEnum);
388 HRESULT AgreeMediaType(
414 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,
void ** ppv);
415 STDMETHODIMP_(ULONG) NonDelegatingRelease();
416 STDMETHODIMP_(ULONG) NonDelegatingAddRef();
423 STDMETHODIMP Connect(
425 const AM_MEDIA_TYPE *pmt
429 STDMETHODIMP ReceiveConnection(
431 const AM_MEDIA_TYPE *pmt
434 STDMETHODIMP Disconnect();
436 STDMETHODIMP ConnectedTo(IPin **pPin);
438 STDMETHODIMP ConnectionMediaType(AM_MEDIA_TYPE *pmt);
440 STDMETHODIMP QueryPinInfo(
444 STDMETHODIMP QueryDirection(
445 PIN_DIRECTION * pPinDir
448 STDMETHODIMP QueryId(
453 STDMETHODIMP QueryAccept(
454 const AM_MEDIA_TYPE *pmt
458 STDMETHODIMP EnumMediaTypes(
459 IEnumMediaTypes **ppEnum
469 STDMETHODIMP QueryInternalConnections(
473 ) {
return E_NOTIMPL; }
476 STDMETHODIMP EndOfStream(
void);
484 STDMETHODIMP NewSegment(
485 REFERENCE_TIME tStart,
486 REFERENCE_TIME tStop,
493 STDMETHODIMP Notify(IBaseFilter * pSender, Quality q);
495 STDMETHODIMP SetSink(IQualityControl * piqc);
500 BOOL IsConnected(
void) {
return (m_Connected != NULL); };
502 IPin * GetConnected() {
return m_Connected; };
506 return (m_pFilter->m_State == State_Stopped);
510 virtual LONG GetMediaTypeVersion();
511 void IncrementTypeVersion();
515 virtual HRESULT Active(
void);
518 virtual HRESULT Inactive(
void);
521 virtual HRESULT Run(REFERENCE_TIME tStart);
524 virtual HRESULT CheckMediaType(
const CMediaType *) PURE;
527 virtual HRESULT SetMediaType(
const CMediaType *);
531 virtual HRESULT CheckConnect(IPin *);
534 virtual HRESULT BreakConnect();
535 virtual HRESULT CompleteConnect(IPin *pReceivePin);
538 virtual HRESULT GetMediaType(
int iPosition,
CMediaType *pMediaType);
541 REFERENCE_TIME CurrentStopTime() {
544 REFERENCE_TIME CurrentStartTime() {
547 double CurrentRate() {
552 LPWSTR Name() {
return m_pName; };
555 void SetReconnectWhenActive(
bool bCanReconnect)
557 m_bCanReconnectWhenActive = bCanReconnect;
560 bool CanReconnectWhenActive()
562 return m_bCanReconnectWhenActive;
566 STDMETHODIMP DisconnectInternal();
608 BOOL AreWeOutOfSync() {
609 return (m_pFilter->GetPinVersion() == m_Version ? FALSE : TRUE);
615 STDMETHODIMP Refresh();
626 STDMETHODIMP QueryInterface(REFIID riid,
void **ppv);
627 STDMETHODIMP_(ULONG) AddRef();
628 STDMETHODIMP_(ULONG) Release();
637 STDMETHODIMP Skip(ULONG cPins);
638 STDMETHODIMP Reset();
639 STDMETHODIMP Clone(IEnumPins **ppEnum);
669 BOOL AreWeOutOfSync() {
670 return (m_pPin->GetMediaTypeVersion() == m_Version ? FALSE : TRUE);
682 STDMETHODIMP QueryInterface(REFIID riid,
void **ppv);
683 STDMETHODIMP_(ULONG) AddRef();
684 STDMETHODIMP_(ULONG) Release();
689 AM_MEDIA_TYPE ** ppMediaTypes,
693 STDMETHODIMP Skip(ULONG cMediaTypes);
694 STDMETHODIMP Reset();
695 STDMETHODIMP Clone(IEnumMediaTypes **ppEnum);
718 IMemAllocator *m_pAllocator;
719 IMemInputPin *m_pInputPin;
739 virtual HRESULT CompleteConnect(IPin *pReceivePin);
743 virtual HRESULT DecideAllocator(IMemInputPin * pPin, IMemAllocator ** pAlloc);
750 virtual HRESULT DecideBufferSize(
751 IMemAllocator * pAlloc,
752 ALLOCATOR_PROPERTIES * ppropInputRequest
756 virtual HRESULT GetDeliveryBuffer(IMediaSample ** ppSample,
757 REFERENCE_TIME * pStartTime,
758 REFERENCE_TIME * pEndTime,
765 virtual HRESULT Deliver(IMediaSample *);
768 virtual HRESULT InitAllocator(IMemAllocator **ppAlloc);
769 HRESULT CheckConnect(IPin *pPin);
770 HRESULT BreakConnect();
773 HRESULT Active(
void);
774 HRESULT Inactive(
void);
778 STDMETHODIMP EndOfStream(
void);
782 virtual HRESULT DeliverEndOfStream(
void);
787 STDMETHODIMP BeginFlush(
void);
788 STDMETHODIMP EndFlush(
void);
789 virtual HRESULT DeliverBeginFlush(
void);
790 virtual HRESULT DeliverEndFlush(
void);
794 virtual HRESULT DeliverNewSegment(
795 REFERENCE_TIME tStart,
796 REFERENCE_TIME tStop,
826 IMemAllocator *m_pAllocator;
838 AM_SAMPLE2_PROPERTIES m_SampleProps;
861 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,
void **ppv);
865 STDMETHODIMP GetAllocator(IMemAllocator ** ppAllocator);
869 STDMETHODIMP NotifyAllocator(
870 IMemAllocator * pAllocator,
874 STDMETHODIMP Receive(IMediaSample *pSample);
877 STDMETHODIMP ReceiveMultiple (
878 IMediaSample **pSamples,
880 long *nSamplesProcessed);
883 STDMETHODIMP ReceiveCanBlock();
889 STDMETHODIMP BeginFlush(
void);
896 STDMETHODIMP EndFlush(
void);
902 STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES*pProps);
905 HRESULT BreakConnect();
919 virtual HRESULT CheckStreaming();
922 HRESULT PassNotify(Quality& q);
929 STDMETHODIMP Notify(IBaseFilter * pSender, Quality q);
936 virtual HRESULT Inactive(
void);
939 AM_SAMPLE2_PROPERTIES * SampleProps() {
940 ASSERT(m_SampleProps.cbData != 0);
941 return &m_SampleProps;
951 public IPinFlowControl
974 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,
void **ppv);
977 STDMETHODIMP Disconnect(
void);
980 STDMETHODIMP Block(DWORD dwBlockFlags, HANDLE hEvent);
983 void SetConfigInfo(IGraphConfig *pGraphConfig, HANDLE hStopEvent);
986 virtual HRESULT Deliver(IMediaSample *pSample);
987 virtual HRESULT DeliverEndOfStream(
void);
988 virtual HRESULT DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop,
double dRate);
991 HRESULT DeliverBeginFlush(
void);
992 HRESULT DeliverEndFlush(
void);
994 HRESULT Inactive(
void);
995 HRESULT Active(
void);
996 virtual HRESULT CompleteConnect(IPin *pReceivePin);
998 virtual HRESULT StartUsingOutputPin(
void);
999 virtual void StopUsingOutputPin(
void);
1000 virtual bool StreamingThreadUsingOutputPin(
void);
1002 HRESULT ChangeOutputFormat
1004 const AM_MEDIA_TYPE *pmt,
1005 REFERENCE_TIME tSegmentStart,
1006 REFERENCE_TIME tSegmentStop,
1009 HRESULT ChangeMediaType(
const CMediaType *pmt);
1010 HRESULT DynamicReconnect(
const CMediaType *pmt);
1013 HRESULT SynchronousBlockOutputPin(
void);
1014 HRESULT AsynchronousBlockOutputPin(HANDLE hNotifyCallerPinBlockedEvent);
1015 HRESULT UnblockOutputPin(
void);
1017 void BlockOutputPin(
void);
1018 void ResetBlockState(
void);
1020 static HRESULT WaitEvent(HANDLE hEvent);
1038 HANDLE m_hUnblockOutputPinEvent;
1044 HANDLE m_hNotifyCallerPinBlockedEvent;
1047 BLOCK_STATE m_BlockState;
1052 DWORD m_dwBlockCallerThreadID;
1062 DWORD m_dwNumOutstandingOutputPinUsers;
1067 HANDLE m_hStopEvent;
1068 IGraphConfig* m_pGraphConfig;
1073 BOOL m_bPinUsesReadOnlyAllocator;
1076 HRESULT Initialize(
void);
1077 HRESULT ChangeMediaTypeHelper(
const CMediaType *pmt);
1080 void AssertValid(
void);
1094 inline CAutoUsingOutputPin::CAutoUsingOutputPin(
CDynamicOutputPin* pOutputPin, HRESULT* phr ) :
1098 ASSERT( NULL != pOutputPin );
1099 ASSERT( NULL != phr );
1102 ASSERT( S_OK == *phr );
1104 HRESULT hr = pOutputPin->StartUsingOutputPin();
1111 m_pOutputPin = pOutputPin;
1114 inline CAutoUsingOutputPin::~CAutoUsingOutputPin()
1116 if( NULL != m_pOutputPin )
1118 m_pOutputPin->StopUsingOutputPin();
1124 inline HRESULT CDynamicOutputPin::Deliver(IMediaSample *pSample)
1128 ASSERT(StreamingThreadUsingOutputPin());
1130 return CBaseOutputPin::Deliver(pSample);
1133 inline HRESULT CDynamicOutputPin::DeliverEndOfStream(
void)
1137 ASSERT( StreamingThreadUsingOutputPin() );
1139 return CBaseOutputPin::DeliverEndOfStream();
1142 inline HRESULT CDynamicOutputPin::DeliverNewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop,
double dRate)
1146 ASSERT(StreamingThreadUsingOutputPin());
1148 return CBaseOutputPin::DeliverNewSegment(tStart, tStop, dRate);
1196 enum { Sample_SyncPoint = 0x01,
1197 Sample_Preroll = 0x02,
1198 Sample_Discontinuity = 0x04,
1199 Sample_TypeChanged = 0x08,
1200 Sample_TimeValid = 0x10,
1201 Sample_MediaTimeValid = 0x20,
1202 Sample_TimeDiscontinuity = 0x40,
1203 Sample_StopValid = 0x100,
1204 Sample_ValidFlags = 0x1FF
1216 DWORD m_dwTypeSpecificFlags;
1222 REFERENCE_TIME m_Start;
1223 REFERENCE_TIME m_End;
1224 LONGLONG m_MediaStart;
1226 AM_MEDIA_TYPE *m_pMediaType;
1238 LPBYTE pBuffer = NULL,
1245 LPBYTE pBuffer = NULL,
1253 STDMETHODIMP QueryInterface(REFIID riid,
void **ppv);
1254 STDMETHODIMP_(ULONG) AddRef();
1255 STDMETHODIMP_(ULONG) Release();
1261 HRESULT SetPointer(BYTE * ptr, LONG cBytes);
1264 STDMETHODIMP GetPointer(BYTE ** ppBuffer);
1266 STDMETHODIMP_(LONG) GetSize(
void);
1269 STDMETHODIMP GetTime(
1270 REFERENCE_TIME * pTimeStart,
1271 REFERENCE_TIME * pTimeEnd
1275 STDMETHODIMP SetTime(
1276 REFERENCE_TIME * pTimeStart,
1277 REFERENCE_TIME * pTimeEnd
1279 STDMETHODIMP IsSyncPoint(
void);
1280 STDMETHODIMP SetSyncPoint(BOOL bIsSyncPoint);
1281 STDMETHODIMP IsPreroll(
void);
1282 STDMETHODIMP SetPreroll(BOOL bIsPreroll);
1284 STDMETHODIMP_(LONG) GetActualDataLength(
void);
1285 STDMETHODIMP SetActualDataLength(LONG lActual);
1289 STDMETHODIMP GetMediaType(AM_MEDIA_TYPE **ppMediaType);
1290 STDMETHODIMP SetMediaType(AM_MEDIA_TYPE *pMediaType);
1295 STDMETHODIMP IsDiscontinuity(
void);
1298 STDMETHODIMP SetDiscontinuity(BOOL bDiscontinuity);
1301 STDMETHODIMP GetMediaTime(
1302 LONGLONG * pTimeStart,
1307 STDMETHODIMP SetMediaTime(
1308 LONGLONG * pTimeStart,
1313 STDMETHODIMP GetProperties(
1318 STDMETHODIMP SetProperties(
1320 const BYTE * pbProperties
1341 public IMemAllocatorCallbackTemp,
1345 friend class CSampleList;
1350 return pSample->m_pNext;
1357 CSampleList() : m_List(NULL), m_nOnList(0) {};
1361 ASSERT(m_nOnList == 0);
1366 int GetCount()
const {
return m_nOnList; };
1369 ASSERT(pSample != NULL);
1370 CBaseAllocator::NextSample(pSample) = m_List;
1377 if (pSample != NULL) {
1378 m_List = CBaseAllocator::NextSample(m_List);
1391 CSampleList m_lFree;
1442 BOOL m_bDecommitInProgress;
1445 IMemAllocatorNotifyCallbackTemp *m_pNotify;
1447 BOOL m_fEnableReleaseCallback;
1451 virtual void Free(
void) PURE;
1454 virtual HRESULT Alloc(
void);
1459 TCHAR *, LPUNKNOWN, HRESULT *,
1460 BOOL bEvent = TRUE, BOOL fEnableReleaseCallback = FALSE);
1463 CHAR *, LPUNKNOWN, HRESULT *,
1464 BOOL bEvent = TRUE, BOOL fEnableReleaseCallback = FALSE);
1471 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,
void **ppv);
1473 STDMETHODIMP SetProperties(
1474 ALLOCATOR_PROPERTIES* pRequest,
1475 ALLOCATOR_PROPERTIES* pActual);
1478 STDMETHODIMP GetProperties(
1479 ALLOCATOR_PROPERTIES* pProps);
1483 STDMETHODIMP Commit();
1487 STDMETHODIMP Decommit();
1498 STDMETHODIMP GetBuffer(IMediaSample **ppBuffer,
1499 REFERENCE_TIME * pStartTime,
1500 REFERENCE_TIME * pEndTime,
1504 STDMETHODIMP ReleaseBuffer(IMediaSample *pBuffer);
1507 STDMETHODIMP SetNotify(IMemAllocatorNotifyCallbackTemp *pNotify);
1509 STDMETHODIMP GetFreeCount(LONG *plBuffersFree);
1512 void NotifySample();
1515 void SetWaiting() { m_lWaiting++; };
1536 STDAPI CreateMemoryAllocator(IMemAllocator **ppAllocator);
1551 void ReallyFree(
void);
1554 HRESULT Alloc(
void);
1558 static CUnknown *CreateInstance(LPUNKNOWN, HRESULT *);
1560 STDMETHODIMP SetProperties(
1561 ALLOCATOR_PROPERTIES* pRequest,
1562 ALLOCATOR_PROPERTIES* pActual);
1574 , IFilterMapper * pIFM
Definition: amfilter.h:1340
Definition: amfilter.h:331
Definition: amfilter.h:149
Definition: combase.h:201
Definition: amfilter.h:583
Definition: amfilter.h:950
Definition: amfilter.h:1084
Definition: combase.h:117
Definition: amfilter.h:1538
Definition: amfilter.h:713