Как использовать метод обратного вызова с C ++ DirectShow образец граббер - PullRequest
2 голосов
/ 11 июня 2010

У меня есть образец граббера, подключенный к моему графику директ-шоу, на основе этого примера http://msdn.microsoft.com/en-us/library/dd407288(VS.85).aspx проблема в том, что он использует один выстрел и буферы. Я хочу непрерывно получать сэмплы и предпочел бы обратный вызов, чем предполагаю опрос сэмплов.

Как использовать метод SetCallback?

SetCallback(ISampleGrabberCB *pCallback, long WhichMethodToCallback)

как мне указать pCallback на мой собственный метод?

1 Ответ

2 голосов
/ 11 июня 2010

Я пришел из c # фона и подумал, что на каком-то уровне я мог бы просто передать ссылку на метод. Это не похоже на случай. Вместо этого требуется создать класс, реализующий его интерфейс, который определяет метод, который он будет вызывать. Затем вы передаете экземпляр класса фильтру в методе SetCallback. Конечно, кажется, что оно выглядит многословно по сравнению с делегатом или лямбда-выражением

Вот пример класса, реализующего 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;    
    }
};
...