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