123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- //------------------------------------------------------------------------------
- // File: PullPin.h
- //
- // Desc: DirectShow base classes - defines CPullPin class.
- //
- // Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------------------------
- #ifndef __PULLPIN_H__
- #define __PULLPIN_H__
- //
- // CPullPin
- //
- // object supporting pulling data from an IAsyncReader interface.
- // Given a start/stop position, calls a pure Receive method with each
- // IMediaSample received.
- //
- // This is essentially for use in a MemInputPin when it finds itself
- // connected to an IAsyncReader pin instead of a pushing pin.
- //
- class CPullPin : public CAMThread
- {
- IAsyncReader* m_pReader;
- REFERENCE_TIME m_tStart;
- REFERENCE_TIME m_tStop;
- REFERENCE_TIME m_tDuration;
- BOOL m_bSync;
- enum ThreadMsg {
- TM_Pause, // stop pulling and wait for next message
- TM_Start, // start pulling
- TM_Exit, // stop and exit
- };
- ThreadMsg m_State;
- // override pure thread proc from CAMThread
- DWORD ThreadProc(void);
- // running pull method (check m_bSync)
- void Process(void);
- // clean up any cancelled i/o after a flush
- void CleanupCancelled(void);
- // suspend thread from pulling, eg during seek
- HRESULT PauseThread();
- // start thread pulling - create thread if necy
- HRESULT StartThread();
- // stop and close thread
- HRESULT StopThread();
- // called from ProcessAsync to queue and collect requests
- HRESULT QueueSample(
- __inout REFERENCE_TIME& tCurrent,
- REFERENCE_TIME tAlignStop,
- BOOL bDiscontinuity);
- HRESULT CollectAndDeliver(
- REFERENCE_TIME tStart,
- REFERENCE_TIME tStop);
- HRESULT DeliverSample(
- IMediaSample* pSample,
- REFERENCE_TIME tStart,
- REFERENCE_TIME tStop);
- protected:
- IMemAllocator * m_pAlloc;
- public:
- CPullPin();
- virtual ~CPullPin();
- // returns S_OK if successfully connected to an IAsyncReader interface
- // from this object
- // Optional allocator should be proposed as a preferred allocator if
- // necessary
- // bSync is TRUE if we are to use sync reads instead of the
- // async methods.
- HRESULT Connect(IUnknown* pUnk, IMemAllocator* pAlloc, BOOL bSync);
- // disconnect any connection made in Connect
- HRESULT Disconnect();
- // agree an allocator using RequestAllocator - optional
- // props param specifies your requirements (non-zero fields).
- // returns an error code if fail to match requirements.
- // optional IMemAllocator interface is offered as a preferred allocator
- // but no error occurs if it can't be met.
- virtual HRESULT DecideAllocator(
- IMemAllocator* pAlloc,
- __inout_opt ALLOCATOR_PROPERTIES * pProps);
- // set start and stop position. if active, will start immediately at
- // the new position. Default is 0 to duration
- HRESULT Seek(REFERENCE_TIME tStart, REFERENCE_TIME tStop);
- // return the total duration
- HRESULT Duration(__out REFERENCE_TIME* ptDuration);
- // start pulling data
- HRESULT Active(void);
- // stop pulling data
- HRESULT Inactive(void);
- // helper functions
- LONGLONG AlignDown(LONGLONG ll, LONG lAlign) {
- // aligning downwards is just truncation
- return ll & ~(lAlign-1);
- };
- LONGLONG AlignUp(LONGLONG ll, LONG lAlign) {
- // align up: round up to next boundary
- return (ll + (lAlign -1)) & ~(lAlign -1);
- };
- // GetReader returns the (addrefed) IAsyncReader interface
- // for SyncRead etc
- IAsyncReader* GetReader() {
- m_pReader->AddRef();
- return m_pReader;
- };
- // -- pure --
- // override this to handle data arrival
- // return value other than S_OK will stop data
- virtual HRESULT Receive(IMediaSample*) PURE;
- // override this to handle end-of-stream
- virtual HRESULT EndOfStream(void) PURE;
- // called on runtime errors that will have caused pulling
- // to stop
- // these errors are all returned from the upstream filter, who
- // will have already reported any errors to the filtergraph.
- virtual void OnError(HRESULT hr) PURE;
- // flush this pin and all downstream
- virtual HRESULT BeginFlush() PURE;
- virtual HRESULT EndFlush() PURE;
- };
- #endif //__PULLPIN_H__
|