#ifndef WinMfImageGrabber_h__ #define WinMfImageGrabber_h__ #include #include "../RawBuffer.h" #include "../Types.h" namespace LifeCore { class WebCamera; class WinMfImageGrabber : IMFSampleGrabberSinkCallback { public: WinMfImageGrabber(WebCamera* cam); ~WinMfImageGrabber(); HRESULT initImageGrabber(IMFMediaSource *pSource, GUID VideoFormat); HRESULT startGrabbing(void); void stopGrabbing(); // IUnknown methods STDMETHODIMP QueryInterface(REFIID iid, void** ppv); STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // IMFClockStateSink methods STDMETHODIMP OnClockStart(MFTIME hnsSystemTime, LONGLONG llClockStartOffset); STDMETHODIMP OnClockStop(MFTIME hnsSystemTime); STDMETHODIMP OnClockPause(MFTIME hnsSystemTime); STDMETHODIMP OnClockRestart(MFTIME hnsSystemTime); STDMETHODIMP OnClockSetRate(MFTIME hnsSystemTime, float flRate); // IMFSampleGrabberSinkCallback methods STDMETHODIMP OnSetPresentationClock(IMFPresentationClock* pClock); STDMETHODIMP OnProcessSample(REFGUID guidMajorMediaType, DWORD dwSampleFlags, LONGLONG llSampleTime, LONGLONG llSampleDuration, const BYTE * pSampleBuffer, DWORD dwSampleSize); STDMETHODIMP OnShutdown(); bool processGrabbing(); RawBuffer* GetImage(); private: WebCamera* camera; long m_cRef; //IMFMediaSource *ig_pSource; IMFMediaSession *ig_pSession; IMFTopology *ig_pTopology; RawBuffer* buffer_first; RawBuffer* buffer_second; RawBuffer* buffer_active; HRESULT CreateTopology(IMFMediaSource *pSource, IMFActivate *pSinkActivate, IMFTopology **ppTopo); HRESULT AddSourceNode( IMFTopology *pTopology, IMFMediaSource *pSource, IMFPresentationDescriptor *pPD, IMFStreamDescriptor *pSD, IMFTopologyNode **ppNode); HRESULT AddOutputNode( IMFTopology *pTopology, IMFActivate *pActivate, DWORD dwId, IMFTopologyNode **ppNode); }; } #endif // WinMfImageGrabber_h__