153 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //------------------------------------------------------------------------------
 | |
| // 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__
 |