我有一个示例抓取器挂钩到我的directshow图表,根据这个例子http://msdn.microsoft.com/en-us/library/dd407288(VS.85).aspx,问题是它使用了一个镜头和缓冲区。我想继续抓取样本,而我宁愿回调,而不是我猜测样本。
如何使用SetCallback方法?
SetCallback(ISampleGrabberCB *pCallback, long WhichMethodToCallback)
如何将pCallback指向我自己的方法?
答案 0 :(得分:2)
我来自c#背景,并认为在某种程度上我可以传递对方法的引用。这似乎并非如此。相反,它需要您创建一个类,实现其接口,定义它将调用的方法。然后,您将该类的实例传递给SetCallback方法中的过滤器。与委托或lambda表达相比,当然看起来很长。
以下是实现ISampleGrabberCB
的类的示例class SampleGrabberCallback : public ISampleGrabberCB
{
public:
// Fake referance counting.
STDMETHODIMP_(ULONG) AddRef() { return 1; }
STDMETHODIMP_(ULONG) Release() { return 2; }
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject)
{
if (NULL == ppvObject) return E_POINTER;
if (riid == __uuidof(IUnknown))
{
*ppvObject = static_cast<IUnknown*>(this);
return S_OK;
}
if (riid == __uuidof(ISampleGrabberCB))
{
*ppvObject = static_cast<ISampleGrabberCB*>(this);
return S_OK;
}
return E_NOTIMPL;
}
STDMETHODIMP SampleCB(double Time, IMediaSample *pSample)
{
return E_NOTIMPL;
}
STDMETHODIMP BufferCB(double Time, BYTE *pBuffer, long BufferLen)
{
return E_NOTIMPL;
}
};