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__
 |