00001
00002
00003
00004
00005
00006 #ifndef __PULLPIN_H__
00007 #define __PULLPIN_H__
00008
00009 class CPullPin : public CAMThread
00010 {
00011 IAsyncReader* m_pReader;
00012 REFERENCE_TIME m_tStart;
00013 REFERENCE_TIME m_tStop;
00014 REFERENCE_TIME m_tDuration;
00015 BOOL m_bSync;
00016
00017 enum ThreadMsg {
00018 TM_Pause,
00019 TM_Start,
00020 TM_Exit,
00021 };
00022
00023 ThreadMsg m_State;
00024
00025
00026 DWORD ThreadProc(void);
00027
00028
00029 void Process(void);
00030
00031
00032 void CleanupCancelled(void);
00033
00034
00035 HRESULT PauseThread();
00036
00037
00038 HRESULT StartThread();
00039
00040
00041 HRESULT StopThread();
00042
00043
00044 HRESULT QueueSample(
00045 REFERENCE_TIME& tCurrent,
00046 REFERENCE_TIME tAlignStop,
00047 BOOL bDiscontinuity);
00048
00049 HRESULT CollectAndDeliver(
00050 REFERENCE_TIME tStart,
00051 REFERENCE_TIME tStop);
00052
00053 HRESULT DeliverSample(
00054 IMediaSample* pSample,
00055 REFERENCE_TIME tStart,
00056 REFERENCE_TIME tStop);
00057
00058 protected:
00059 IMemAllocator * m_pAlloc;
00060
00061 public:
00062 CPullPin();
00063 virtual ~CPullPin();
00064
00065 HRESULT Connect(IUnknown* pUnk, IMemAllocator* pAlloc, BOOL bSync);
00066
00067 HRESULT Disconnect();
00068
00069 virtual HRESULT DecideAllocator(
00070 IMemAllocator* pAlloc,
00071 ALLOCATOR_PROPERTIES * pProps);
00072
00073 HRESULT Seek(REFERENCE_TIME tStart, REFERENCE_TIME tStop);
00074
00075 HRESULT Duration(REFERENCE_TIME* ptDuration);
00076
00077 HRESULT Active(void);
00078
00079 HRESULT Inactive(void);
00080
00081 LONGLONG AlignDown(LONGLONG ll, LONG lAlign) {
00082
00083 return ll & ~(lAlign-1);
00084 };
00085
00086 LONGLONG AlignUp(LONGLONG ll, LONG lAlign) {
00087
00088 return (ll + (lAlign -1)) & ~(lAlign -1);
00089 };
00090
00091 IAsyncReader* GetReader() {
00092 m_pReader->AddRef();
00093 return m_pReader;
00094 };
00095
00096 virtual HRESULT Receive(IMediaSample*) PURE;
00097
00098 virtual HRESULT EndOfStream(void) PURE;
00099
00100 virtual void OnError(HRESULT hr) PURE;
00101
00102 virtual HRESULT BeginFlush() PURE;
00103 virtual HRESULT EndFlush() PURE;
00104
00105 };
00106
00107 #endif