DDGrab.h
上传用户:limilano
上传日期:2013-07-02
资源大小:19k
文件大小:3k
源码类别:

视频捕捉/采集

开发平台:

Matlab

  1. /***************************************************
  2. This is the header file for the Grabber code.  Include this
  3. in your files.
  4. This code was intended to be used inside of a matlab interface,
  5. but can be used as a generic grabber class for anyone who needs 
  6. one.
  7. Written by Micah Richert.
  8. 07/14/2005
  9. **************************************************/
  10. #include "atlbase.h"
  11. #include "dshow.h"
  12. #include "qedit.h"
  13. #include <vector>
  14. using namespace std;
  15. //using namespace stdext;
  16. // since the Audio and Video CB vectors are public we need to make the CB interface public too
  17. class CSampleGrabberCB : public ISampleGrabberCB 
  18. {
  19. public:
  20. CSampleGrabberCB();
  21. virtual ~CSampleGrabberCB();
  22. vector<BYTE*> frames;
  23. vector<int> frameBytes;
  24. vector<int> frameNrs;
  25. // use this to get data format information, ie. bit depth, sampling rate...
  26. BYTE *pbFormat;
  27. unsigned int frameNr;
  28. bool disabled;
  29. // Fake out any COM ref counting
  30. //
  31. STDMETHODIMP_(ULONG) AddRef() { return 2; }
  32. STDMETHODIMP_(ULONG) Release() { return 1; }
  33. // Fake out any COM QI'ing
  34. //
  35. STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);
  36. // We don't implement this one
  37. //
  38. STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample ){ return 0; }
  39. // The sample grabber is calling us back on its deliver thread.
  40. // This is NOT the main app thread!
  41. //
  42. STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize );
  43. };
  44. // this is the main grabber class.  I think the interfaces and names are fairly self explanatory
  45. class DDGrabber
  46. {
  47. public:
  48. vector<CSampleGrabberCB*> VideoCBs;
  49. vector<CSampleGrabberCB*> AudioCBs;
  50. HRESULT buildGraph(char* filename);
  51. HRESULT doCapture();
  52. HRESULT getVideoInfo(unsigned int id, int* width, int* height, int* nrFramesCaptured, int* nrFramesTotal);
  53. HRESULT getAudioInfo(unsigned int id, int* nrChannels, int* rate, int* bits, int* nrFramesCaptured, int* nrFramesTotal);
  54. void getCaptureInfo(int* nrVideo, int* nrAudio);
  55. // data must be freed by caller
  56. HRESULT getVideoFrame(unsigned int id, int frameNr, char** data, int* nrBytes);
  57. // data must be freed by caller
  58. HRESULT getAudioFrame(unsigned int id, int frameNr, char** data, int* nrBytes);
  59. void setFrames(int* frameNrs, int nrFrames);
  60. void disableVideo();
  61. void disableAudio();
  62. void cleanUp(); // must be called at the end, in order to render anything afterward.
  63. private:
  64. CComPtr<IGraphBuilder> pGraphBuilder;
  65. void MyFreeMediaType(AM_MEDIA_TYPE& mt);
  66. PIN_INFO getPinInfo(IPin* pin);
  67. IPin* getInputPin(IBaseFilter* filt);
  68. IPin* getOutputPin(IBaseFilter* filt);
  69. bool isRenderer(IBaseFilter* filt);
  70. IPin* connectedToInput(IBaseFilter* filt);
  71. GUID getMajorType(IBaseFilter* filt);
  72. HRESULT insertCapture(IGraphBuilder* pGraphBuilder, IBaseFilter* pRenderer, AM_MEDIA_TYPE* mt, CSampleGrabberCB** grabberCB);
  73. HRESULT insertVideoCapture(IGraphBuilder* pGraphBuilder, IBaseFilter* pRenderer);
  74. HRESULT insertAudioCapture(IGraphBuilder* pGraphBuilder, IBaseFilter* pRenderer);
  75. HRESULT changeToNull(IGraphBuilder* pGraphBuilder, IBaseFilter* pRenderer);
  76. HRESULT mangleGraph(IGraphBuilder* pGraphBuilder);
  77. };