The Dirtchamber
A mixed reality testing environment for real-time global illumination algorithms
video_gbuffer.h
Go to the documentation of this file.
1 /*
2  * Dune D3D library - Tobias Alexander Franke 2013
3  * For copyright and license see LICENSE
4  * http://www.tobias-franke.eu
5  */
6 
9 #ifndef DUNE_VIDEO_GBUFFER
10 #define DUNE_VIDEO_GBUFFER
11 
12 #include "gbuffer.h"
13 
14 #include <DShow.h>
15 
16 interface ISampleGrabberCB : public IUnknown
17 {
18  virtual STDMETHODIMP SampleCB( double SampleTime, IMediaSample *pSample ) = 0;
19  virtual STDMETHODIMP BufferCB( double SampleTime, BYTE *pBuffer, long BufferLen ) = 0;
20 };
21 
22 interface ISampleGrabber : public IUnknown
23 {
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;
31 };
32 
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 } };
37 
38 #define RT_VIDEO_COLOR L"color"
39 
40 namespace dune
41 {
42  class video_gbuffer : public gbuffer
43  {
44  protected:
45  struct grabber_callback : public ISampleGrabberCB
46  {
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();
53  };
54 
55  friend struct grabber_callback;
56 
57  CRITICAL_SECTION cs_;
58  bool async_;
59  ID3D11DeviceContext* context_;
60  bool running_;
61  std::vector<BYTE> temp_buffer_;
62 
63  IFilterGraph2* graph_;
64  ICaptureGraphBuilder2* capture_;
65  IMediaControl* control_;
66 
67  IBaseFilter* nullf_;
68  IBaseFilter* sgf_;
69  IBaseFilter* current_device_;
70  ISampleGrabber* sg_;
71 
72  grabber_callback callback_;
73 
74  typedef void (*video_cb)(BYTE* buffer, size_t width, size_t height);
75  video_cb external_callback_;
76 
77  bool has_new_buffer_;
78 
79  protected:
80  HRESULT init_device(UINT32 index, size_t w, size_t h, bool async);
81 
82  public:
83  video_gbuffer();
84  virtual ~video_gbuffer() {}
85 
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);
88 
89  void destroy();
90 
91  HRESULT start(ID3D11DeviceContext* context);
92  void stop();
93 
94  void update();
95  };
96 }
97 
98 #endif