Freigeben über


Empfangen und Übermitteln von Beispielen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Der folgende Pseudocode zeigt, wie die IMemInput::Receive-Methode implementiert wird:

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;
}

Die Receive-Methode enthält die Streamingsperre, nicht die Filtersperre. Der Filter muss möglicherweise auf ein Ereignis warten, bevor er die Daten verarbeiten kann. Dies wird hier durch den Aufruf von WaitForSingleObject gezeigt. Nicht jeder Filter muss dies tun. Die CBaseInputPin::Receive-Methode überprüft einige allgemeine Streamingbedingungen. Es wird VFW_E_WRONG_STATE zurückgegeben, wenn der Filter beendet wird, S_FALSE, wenn der Filter geleert wird usw. Jeder andere Rückgabecode als S_OK gibt an, dass die Receive-Methode sofort zurückgegeben und das Beispiel nicht verarbeitet.

Nachdem das Beispiel verarbeitet wurde, übermitteln Sie es an den Downstreamfilter, indem Sie CBaseOutputPin::D eliver aufrufen. Diese Hilfsmethode ruft IMemInputPin::Receive für den downstream-Eingabenadel auf. Ein Filter kann Beispiele an mehrere Pins liefern.