Recebimento e entrega de exemplos
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
O pseudocódigo a seguir mostra como implementar o método 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;
}
O método Receive mantém o bloqueio de streaming, não o bloqueio de filtro. O filtro pode precisar aguardar algum evento antes de poder processar os dados, mostrados aqui pela chamada para WaitForSingleObject. Nem todos os filtros precisarão fazer isso. O método CBaseInputPin::Receive verifica algumas condições gerais de streaming. Ele retornará VFW_E_WRONG_STATE se o filtro for interrompido, S_FALSE se o filtro estiver sendo liberado e assim por diante. Qualquer código de retorno diferente de S_OK indica que o método Receive deve retornar imediatamente e não processar o exemplo.
Depois que o exemplo for processado, entregue-o ao filtro downstream chamando CBaseOutputPin::D eliver. Esse método auxiliar chama IMemInputPin::Receive no pin de entrada downstream. Um filtro pode fornecer exemplos para vários pinos.