Condividi tramite


Ricezione e distribuzione di esempi

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Lo pseudocodice seguente illustra come implementare il metodo 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;
}

Il metodo Receive contiene il blocco di streaming, non il blocco del filtro. Il filtro potrebbe dover attendere un evento prima di poter elaborare i dati, illustrati qui dalla chiamata a WaitForSingleObject. Non tutti i filtri dovranno eseguire questa operazione. Il metodo CBaseInputPin::Receive verifica alcune condizioni di streaming generali. Restituisce VFW_E_WRONG_STATE se il filtro viene arrestato, S_FALSE se il filtro viene scaricato e così via. Qualsiasi codice restituito diverso da S_OK indica che il metodo Receive deve restituire immediatamente e non elaborare l'esempio.

Dopo aver elaborato l'esempio, recapitarlo al filtro downstream chiamando CBaseOutputPin::D eliver. Questo metodo helper chiama IMemInputPin::Receive sul pin di input downstream. Un filtro potrebbe recapitare campioni a diversi pin.