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