Завершение потока данных

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

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

HRESULT CMyInputPin::EndOfStream()
{
    CAutoLock lock_it(&m_csReceive);

    /* If the pin has not delivered all of the data in the stream 
       (based on what it received previously), do so now.  */

    // Propagate EndOfStream call downstream, via your output pin(s).
    for (each output pin)
    {    
        hr = pOutputPin->DeliverEndOfStream();
    }
    return S_OK;
}

Метод CBaseOutputPin::DeliverEndOfStream вызывает IPin::EndOfStream на входном пине вниз по потоку.

потоки и критически важные разделы