Partager via


Utilisation des DMO dans DirectShow

[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.]

Les applications basées sur DirectShow peuvent utiliser des objets DMO dans un graphique de filtre, via le filtre wrapper DMO . Ce filtre agrège un DMO et gère tous les détails de l’utilisation du DMO, tels que le passage de données vers et depuis le DMO, l’allocation d’objets IMediaBuffer , etc.

Étant donné que le DMO est agrégé par le filtre, l’application peut interroger le filtre pour toutes les interfaces COM exposées par le DMO. Toutefois, l’application doit laisser le filtre gérer toutes les opérations de diffusion en continu sur le DMO. Par exemple, ne définissez pas de types de médias, ne traitez pas de mémoires tampons, videz le DMO, verrouillez le DMO, activez ou désactivez le contrôle qualité ou définissez des optimisations vidéo.

Si vous connaissez l’identificateur de classe (CLSID) d’un DMO spécifique que vous souhaitez utiliser, vous pouvez initialiser le filtre Wrapper DMO avec ce DMO, comme suit :

  1. Appelez CoCreateInstance pour créer le filtre wrapper DMO.
  2. Interrogez le filtre Wrapper DMO pour l’interface IDMOWrapperFilter .
  3. Appelez la méthode IDMOWrapperFilter::Init . Spécifiez le CLSID du DMO et le GUID de la catégorie du DMO. Pour obtenir la liste des catégories DMO, consultez GUID DMO.

Le code suivant illustre ces étapes :

// Create the DMO Wrapper filter.
IBaseFilter *pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, 
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, 
    reinterpret_cast<void**>(&pFilter));

if (SUCCEEDED(hr)) 
{
    // Query for IDMOWrapperFilter.
    IDMOWrapperFilter *pDmoWrapper;
    hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, 
        reinterpret_cast<void**>(&pDmoWrapper));

    if (SUCCEEDED(hr)) 
    {     
        // Initialize the filter.
        hr = pDmoWrapper->Init(CLSID_MyDMO, DMOCATEGORY_VIDEO_EFFECT); 
        pDmoWrapper->Release();

        if (SUCCEEDED(hr)) 
        {
            // Add the filter to the graph.
            hr = pGraph->AddFilter(pFilter, L"My DMO");
        }
    }
    pFilter->Release();
}

La fonction DMOEnum énumère les objets DMO dans le Registre. Cette fonction utilise un ensemble de GUID de catégorie différent de ceux utilisés pour les filtres DirectShow.

Utilisation de l’énumérateur d’appareils système avec des objets DMO

Au lieu de créer directement un DMO, vous pouvez utiliser l’énumérateur de périphériques système, qui peut énumérer toute catégorie DMO prise en charge par la méthode DMOEnum . L’énumérateur d’appareils système inclut également des objets DMO lorsqu’il énumère certaines catégories de filtres DirectShow. Le tableau suivant montre le mappage entre les catégories DMO et les catégories DirectShow.

Étiquette Valeur
Catégorie DMO DirectShow Equivalent
DMOCATEGORY_AUDIO_ENCODER CLSID_AudioCompressorCategory
DMOCATEGORY_AUDIO_DECODER CLSID_LegacyAmFilterCategory
DMOCATEGORY_VIDEO_ENCODER CLSID_VideoCompressorCategory
DMOCATEGORY_VIDEO_DECODER CLSID_LegacyAmFilterCategory

 

L’énumérateur de périphérique système retourne une liste d’objets moniker. Si le moniker représente un DMO, la méthode IMoniker::BindToObject crée automatiquement le filtre Wrapper DMO et l’initialise avec ce DMO. Ainsi, le fait qu’un DMO soit impliqué est transparent pour l’application. Pour plus d’informations sur l’utilisation de l’énumérateur de périphérique système, consultez Utilisation de l’énumérateur de périphérique système.

Limitations

Il existe certaines limitations lors de l’utilisation des DMO dans DirectShow :

  • Le filtre wrapper DMO ne prend pas en charge les DMO avec zéro entrée, plusieurs entrées ou zéro sortie.
  • Toutes les connexions d’épingle sur le filtre wrapper DMO utilisent l’interface IMemInputPin .
  • DirectShow Editing Services ne prend pas en charge les effets ou les transitions basés sur DMO.

Utilisation des DMO