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