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

[Функция, связанная с этой страницей, 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, указывает, что метод получения должен непосредственно завершить выполнение и не обрабатывать образец.

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