Поделиться через


Получение и доставка примеров

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

В следующем псевдокоде показано, как реализовать метод IMemInput::Receive :

HRESULT CMyInputPin::Receive(IMediaSample *pSample)
{
    CAutoLock cObjectLock(&m_csReceive);

    // Perhaps the filter needs to wait on something.
    WaitForSingleObject(m_hSomeEventThatReceiveNeedsToWaitOn, INFINITE);

    // Before using resources, make sure it is safe to proceed. Do not
    // continue if the base-class method returns anything besides S_OK.
    hr = CBaseInputPin::Receive(pSample);
    if (hr != S_OK) 
    {
        return hr;
    }

    /* It is safe to use resources allocated in Active and Pause. */

    // Deliver sample(s), via your output pin(s).
    for (each output pin)
        pOutputPin->Deliver(pSample);

    return hr;
}

Метод Receive удерживает блокировку потоковой передачи, а не блокировку фильтра. Фильтру может потребоваться дождаться некоторого события, прежде чем он сможет обработать данные, показанные здесь при вызове WaitForSingleObject. Это потребуется не каждому фильтру. Метод CBaseInputPin::Receive проверяет некоторые общие условия потоковой передачи. Он возвращает VFW_E_WRONG_STATE, если фильтр остановлен, S_FALSE, если фильтр очищается, и т. д. Любой код возврата, отличный от S_OK, указывает, что метод Receive должен возвращать немедленно, а не обрабатывать пример.

После обработки примера добавьте его в подчиненный фильтр, вызвав CBaseOutputPin::D эливер. Этот вспомогательный метод вызывает IMemInputPin::Receive в нисходящем контакте ввода. Фильтр может доставлять примеры в несколько контактов.