9 #ifndef DUNE_VIDEO_GBUFFER
10 #define DUNE_VIDEO_GBUFFER
16 interface ISampleGrabberCB :
public IUnknown
18 virtual STDMETHODIMP SampleCB(
double SampleTime, IMediaSample *pSample ) = 0;
19 virtual STDMETHODIMP BufferCB(
double SampleTime, BYTE *pBuffer,
long BufferLen ) = 0;
22 interface ISampleGrabber :
public IUnknown
24 virtual HRESULT STDMETHODCALLTYPE SetOneShot( BOOL OneShot ) = 0;
25 virtual HRESULT STDMETHODCALLTYPE SetMediaType(
const AM_MEDIA_TYPE *pType ) = 0;
26 virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType( AM_MEDIA_TYPE *pType ) = 0;
27 virtual HRESULT STDMETHODCALLTYPE SetBufferSamples( BOOL BufferThem ) = 0;
28 virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer(
long *pBufferSize,
long *pBuffer ) = 0;
29 virtual HRESULT STDMETHODCALLTYPE GetCurrentSample( IMediaSample **ppSample ) = 0;
30 virtual HRESULT STDMETHODCALLTYPE SetCallback( ISampleGrabberCB *pCallback,
long WhichMethodToCallback ) = 0;
33 static const IID IID_ISampleGrabber = { 0x6B652FFF, 0x11FE, 0x4fce, { 0x92, 0xAD, 0x02, 0x66, 0xB5, 0xD7, 0xC7, 0x8F } };
34 static const IID IID_ISampleGrabberCB = { 0x0579154A, 0x2B53, 0x4994, { 0xB0, 0xD0, 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85 } };
35 static const CLSID CLSID_SampleGrabber = { 0xC1F400A0, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } };
36 static const CLSID CLSID_NullRenderer = { 0xC1F400A4, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } };
38 #define RT_VIDEO_COLOR L"color"
42 class video_gbuffer :
public gbuffer
45 struct grabber_callback :
public ISampleGrabberCB
47 video_gbuffer* caller;
48 virtual HRESULT __stdcall SampleCB(
double time, IMediaSample* sample);
49 virtual HRESULT __stdcall BufferCB(
double time, BYTE* buffer,
long len);
50 virtual HRESULT __stdcall QueryInterface( REFIID iid, LPVOID *ppv );
51 virtual ULONG __stdcall AddRef();
52 virtual ULONG __stdcall Release();
55 friend struct grabber_callback;
59 ID3D11DeviceContext* context_;
61 std::vector<BYTE> temp_buffer_;
63 IFilterGraph2* graph_;
64 ICaptureGraphBuilder2* capture_;
65 IMediaControl* control_;
69 IBaseFilter* current_device_;
72 grabber_callback callback_;
74 typedef void (*video_cb)(BYTE* buffer,
size_t width,
size_t height);
75 video_cb external_callback_;
80 HRESULT init_device(UINT32 index,
size_t w,
size_t h,
bool async);
84 virtual ~video_gbuffer() {}
86 virtual void create(ID3D11Device* device, UINT32 device_index,
const tstring& name, UINT w = 640, UINT h = 480);
87 void set_callback(video_cb cb);
91 HRESULT start(ID3D11DeviceContext* context);