Réception et livraison d’exemples

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Le pseudo-code suivant montre comment implémenter la méthode 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;
}

La méthode Receive contient le verrou de diffusion en continu, et non le verrou de filtre. Le filtre peut avoir besoin d’attendre sur un événement avant de pouvoir traiter les données, illustrées ici par l’appel à WaitForSingleObject. Tous les filtres n’auront pas besoin de le faire. La méthode CBaseInputPin::Receive vérifie certaines conditions générales de diffusion en continu. Elle retourne VFW_E_WRONG_STATE si le filtre est arrêté, S_FALSE si le filtre est en cours de vidage, etc. Tout code de retour autre que S_OK indique que la méthode Receive doit retourner immédiatement et ne pas traiter l’exemple.

Une fois l’exemple traité, fournissez-le au filtre en aval en appelant CBaseOutputPin::D eliver. Cette méthode d’assistance appelle IMemInputPin::Receive sur la broche d’entrée en aval. Un filtre peut fournir des exemples à plusieurs broches.