Compartir a través de


Recepción y entrega de muestras

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

El pseudocódigo siguiente muestra cómo implementar el 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;
}

El método Receive contiene el bloqueo de streaming, no el bloqueo de filtro. Es posible que el filtro tenga que esperar algún evento para poder procesar los datos, que se muestran aquí mediante la llamada a WaitForSingleObject. No todos los filtros deberán hacerlo. El método CBaseInputPin::Receive comprueba algunas condiciones generales de streaming. Devuelve VFW_E_WRONG_STATE si se detiene el filtro, S_FALSE si el filtro está vaciado, etc. Cualquier código de retorno distinto de S_OK indica que el método Receive debe devolverse inmediatamente y no procesar el ejemplo.

Una vez procesado el ejemplo, entreguelo al filtro de bajada llamando a CBaseOutputPin::D eliver. Este método auxiliar llama a IMemInputPin::Receive en el pin de entrada de bajada. Un filtro puede entregar muestras a varios patillas.