1st step to understand DirectShow (その3 SampleGrabber)

 1. SampleGrabberとは?
   

     サンプル グラバ フィルタは変換フィルタで、このフィルタを使ってストリームがフィルタ グラフを通過するときに

          ストリームからメディア サンプルを捕捉できる。
                                         (JPN  MSDN)

     これが使えそうです。

     もう1つ、見つけました。

     MulitMedia Streaming    これは、appendixの中にあるので、見つけにくいですね。



     SampleGrabberは、qedit.h をincludeする必要があるのですが、このヘッダーファイルをincludeすると

     compileできなくなりました。

     それで、MultiMediStreamを、探して、見つけた訳です。

     そして、ここにある例をコピーして、buildしたのですが

     残念な事に、48KHz sampling audio では、うまく作動しませんでした。

     ちょっと、ひねれば、動くかもしれません。

     それで、再び、SampleGrabberに戻ってきたのです。

 2.どうやって、SampleGrabberをcompileできるようになったか

     webを探して、いい記事を、見つけました。

       


 

// === BEGIN ELEMENTS FROM QEDIT.H ===

//#include <qedit.h>

// From http://msdn2.microsoft.com/en-us/library/ms786691.aspx:

// Include Qedit.h. This header file is not compatible with Microsoft® Direct3D® headers later than version 7.

// Since we are using DX9, we cannot include this header. Necessary API elements, copied below.

EXTERN_C const CLSID CLSID_SampleGrabber;

EXTERN_C const CLSID CLSID_NullRenderer;

EXTERN_C const IID IID_ISampleGrabberCB;

MIDL_INTERFACE("0579154A-2B53-4994-B0D0-E773148EFF85")

ISampleGrabberCB : public IUnknown {

public:

virtual HRESULT STDMETHODCALLTYPE SampleCB( double SampleTime,IMediaSample *pSample) = 0;

virtual HRESULT STDMETHODCALLTYPE BufferCB( double SampleTime,BYTE *pBuffer,long BufferLen) = 0;

};

EXTERN_C const IID IID_ISampleGrabber;

MIDL_INTERFACE("6B652FFF-11FE-4fce-92AD-0266B5D7C78F")

ISampleGrabber : public IUnknown {

public:

virtual HRESULT STDMETHODCALLTYPE SetOneShot( BOOL OneShot) = 0;

virtual HRESULT STDMETHODCALLTYPE SetMediaType( const AM_MEDIA_TYPE *pType) = 0;

virtual HRESULT STDMETHODCALLTYPE GetConnectedMediaType( AM_MEDIA_TYPE *pType) = 0;

virtual HRESULT STDMETHODCALLTYPE SetBufferSamples( BOOL BufferThem) = 0;

virtual HRESULT STDMETHODCALLTYPE GetCurrentBuffer( /* [out][in] */ long *pBufferSize,/* [out] */ long *pBuffer) = 0;

virtual HRESULT STDMETHODCALLTYPE GetCurrentSample( /* [retval][out] */ IMediaSample **ppSample) = 0;

virtual HRESULT STDMETHODCALLTYPE SetCallback( ISampleGrabberCB *pCallback,long WhichMethodToCallback) = 0;

};

// === END ELEMENTS FROM QEDIT.H ===

.     つまり、必要な定義の部分だけを、qedit.hから、抜き出してくる訳ですね。

     試してみましたら、うまく作動しました。

    // TODO: Perform any application-level initialization here

 CoInitialize(NULL);

 IBaseFilter *pGrabberF = NULL;

 HRESULT hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
        IID_IBaseFilter, (void**)&pGrabberF);

 if (FAILED(hr))
 {
  // エラーを返す。
 }
 ISampleGrabber *pGrabber;
  hr=pGrabberF->QueryInterface(IID_ISampleGrabber, (void**)&pGrabber);

 pGrabber->Release();
 pGrabberF->Release();
 CoUninitialize();

     これなら、DirectX9でも、うまく作動します、いとうれし。

     今日は、ここまでです。

        H.20.2.29