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