Activation de l’accélération vidéo DirectX

[La fonctionnalité associée à cette page, le Kit de développement logiciel (SDK) Windows Media Format 11, est une fonctionnalité héritée. Il a été remplacé par le lecteur source et l’enregistreurrécepteur. Le lecteur source et l’enregistreur récepteur ont été optimisés pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise le lecteur source et l’enregistreur récepteur au lieu du Kit de développement logiciel (SDK) Windows Media Format 11, lorsque cela est 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.]

Cette section explique comment activer l’accélération vidéo Microsoft® DirectX® lors de la lecture de contenu diffusé en continu dans un lecteur personnalisé.

Contexte

DirectX Video Acceleration (DirectX VA) est une spécification d’API pour l’accélération matérielle des opérations de décodage 2D. Il permet aux décodeurs logiciels de décharger certaines opérations gourmandes en ressources processeur sur les carte graphiques à des fins de traitement. Pour les utilisateurs finaux, cela permet de vidéo à débit binaire élevé, comme la lecture de DVD en plein écran sur des ordinateurs plus anciens équipés de cartes graphiques compatibles DirectX VA.

À compter du Kit de développement logiciel (SDK) de la série Windows Media Format 9, le filtre wrapper DMO prend en charge DirectX VA. Cela signifie que, pour la lecture locale, les applications peuvent utiliser le filtre Lecteur ASF WM pour lire du contenu Windows Media et que l’accélération matérielle de l’analyse dynamique DirectX est appelée automatiquement si le carte graphique le prend en charge. Toutefois, le filtre Lecteur ASF WM ne prend pas en charge la lecture de contenu diffusé en continu. Par conséquent, si vous souhaitez prendre en charge DirectX VA lors de la lecture de contenu diffusé dans un lecteur personnalisé, vous devez utiliser un autre mécanisme, qui est celui utilisé par Lecteur multimédia Windows commençant par la série Windows Media 9.

Étant donné que Lecteur multimédia Windows a été conçu avant le développement des filtres QASF, Lecteur multimédia Windows dispose de son propre filtre source, basé sur le Kit de développement logiciel (SDK) au format Windows Media, pour lire du contenu Windows Media. Le filtre source Windows Media WMP fournit des données décompressées en aval directement aux convertisseurs audio et vidéo. En revanche, le lecteur ASF WM fournit du contenu compressé en aval au décodeur Windows Media DirectX Media Objects (DMO), qui sont hébergés dans le wrapper DMO. Les diagrammes suivants illustrent les différences entre le lecteur ASF WM et le filtre source Windows Media WMP.

exemples non compressés de filtre source personnalisés

Exemples compressés de filtre source qasf

Pour activer DirectX VA pour le contenu diffusé en continu, vous devez créer un filtre source personnalisé comme celui du diagramme supérieur. Fondamentalement, ce filtre utilise le Kit de développement logiciel (SDK) Windows Media Format pour instancier un objet WM Reader, décompresser les exemples et les envoyer en aval sur ses broches de sortie. Cette discussion part du principe que vous avez déjà créé le filtre source et que vous êtes maintenant prêt à implémenter la prise en charge de DirectX VA.

Pour activer DirectX VA, la tâche de base du filtre source consiste à fournir au convertisseur vidéo et au décodeur WMV DMO les interfaces dont ils auront besoin pour négocier la connexion VA DirectX. Le filtre source ne participe pas à ces négociations. Une fois la diffusion en continu démarrée, la seule tâche liée à DirectX VA que le filtre source peut effectuer consiste à modifier les horodatages sur les exemples vidéo avant que le décodeur WMV ne les remet au convertisseur vidéo. La raison principale de cette opération est de fournir un contrôle de chronologie personnalisé au-delà de ce que les interfaces DirectShow® standard permettent.

Trois interfaces sont définies pour activer les communications nécessaires entre le Kit de développement logiciel (SDK) au format Windows Media, le filtre source du lecteur, le décodeur Vidéo Windows Media DMO et le mélangeur de superposition ou le convertisseur de mixage vidéo. Ces interfaces sont décrites dans le tableau suivant.

Interface Description
IWMCodecAMVideoAccelerator Exposé par le décodeur Windows Media DMO et appelé par le filtre source d’un lecteur multimédia pour configurer les différentes connexions requises pour activer DirectX VA pour le décodage du contenu Windows Media Video.
IWMPlayerTimestampHook Implémenté sur le filtre source du joueur. Il permet au filtre de modifier les horodatages sur les exemples vidéo avant de les remettre en aval.
IWMReaderAccelerator Implémenté sur l’objet WM Reader. Il est appelé par un filtre source de lecteur pour obtenir des interfaces à partir du décodeur DMO.

 

Ordre des opérations dans la lecture avec va DirectX

Cette section décrit l’ordre général des opérations au moment de l’exécution pour un lecteur va DirectX et son filtre source. Les composants mentionnés dans cette section sont les suivants :

  • Un lecteur multimédia tiers, appelé lecteur.
  • Un filtre source personnalisé, instancié par le lecteur, qui utilise le Kit de développement logiciel (SDK) au format Windows Media pour décompresser le contenu Windows Media.
  • Broche de sortie vidéo du filtre source du lecteur, appelée broche de sortie.
  • Graphique de filtre de lecture vidéo DirectShow, appelé graphe.
  • Convertisseur de mixage vidéo, appelé VMR.
  • Objet Lecteur asynchrone du SDK format Windows Media, appelé lecteur.
  • Objet multimédia DirectX du décodeur vidéo Windows Media, appelé DMO décodeur.

L’ordre des opérations est le suivant :

  1. Le lecteur instancie son filtre source et un objet lecteur. Le lecteur crée un décodeur vidéo DMO et définit le type d’entrée (compressé) sur celui-ci. Cela doit se produire avant que le lecteur tente de configurer son graphe de lecture vidéo, car le SDK et le décodeur DMO doivent être impliqués dans le processus de négociation avec le graphe, et le DMO doit connaître le format d’entrée à l’étape 9.
  2. Le lecteur appelle IGraphBuilder::Render, en lui fournissant la broche de sortie du filtre de source vidéo. À ce stade, le gestionnaire de graphe de filtre DirectShow tente de connecter le VMR au filtre source vidéo du lecteur.
  3. Le gestionnaire de graphe de filtre appelle IPin::Connect sur la broche de sortie du filtre source vidéo du lecteur.

Les étapes 4 à 10 se produisent à l’intérieur de IPin::Connect.

  1. Le filtre source obtient l’interface IWMCodecAMVideoAccelerator à partir de la méthode IWMReaderAccelerator::GetCodecInterface du lecteur. Si le codec ne prend pas en charge DirectX VA, l’appel à GetCodecInterface peut échouer. Dans ce cas, la négociation se déroule comme d’habitude, sans prise en charge de DirectX VA.

  2. Le filtre source transmet le pointeur IAMVideoAccelerator de la broche passée à Connect to the decoder DMO via IWMCodecAMVideoAccelerator::SetAcceleratorInterface.

  3. Le filtre source délègue ensuite le reste de l’opération IPin::Connect à la méthode CBaseOutputPin::Connect . L’énumération de format avec le Kit de développement logiciel (SDK) se poursuit comme aujourd’hui. Si le codec prend en charge DirectX VA pour le contenu en cours de connexion, le codec DMO présente ces sous-types DirectX VA en premier, avant les types YUV et RVB pris en charge. Si la prise en charge de l’va DirectX est disponible, les étapes 7 à 11 sont tentées dans le contexte d’un sous-type VA DirectX. L’extrait de code suivant montre comment identifier un sous-type de média DirectX VA.

    bool IsDXVASubtype( AM_MEDIA_TYPE * pmt )
    {
        // All DXVA types have the same last 3 DWORDs.
        // guidDXVA is the base GUID for all DXVA subtypes.
    
        GUID guidDXVA = { 0x00000000, 0xa0c7, 0x11d3, { 0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5 } };
    
        unsigned long const * plguid;
        unsigned long const * plguidDXVA;
        plguid = (unsigned long const *)&pmt->subtype;
        plguidDXVA = (unsigned long *)&guidDXVA;
    
        if( ( plguid[1] == plguidDXVA[1] ) &&
            ( plguid[2] == plguidDXVA[2] ) &&
            ( plguid[3] == plguidDXVA[3] ) )
        {
            return true;
        }
    
        return false;
    }
    
    
  4. L’implémentation de CBaseOutputPin::Connect appelle IPin::CompleteConnect à l’étape 3. Si un sous-type VA DirectX est pris en compte, la négociation VA DirectX est tentée. La broche de sortie appelle IWMCodecAMVideoAccelerator::NegotiateConnection, en lui passant le type de média de sortie actuel.

  5. Le décodeur DMO effectue la négociation requise avec le VMR via l’interface IAMVideoAccelerator et retourne le GUID de sous-type vidéo sur lequel les deux ont convenu. La broche de sortie délègue tous les appels IAMVideoAcceleratorNotify reçus au cours de ce processus à l’interface IAMVideoAcceleratorNotify du décodeur DMO, qui peut également être obtenue via la méthode IWMReaderAccelerator::GetCodecInterface .

  6. Si NegotiateConnection réussit, la broche de sortie appelle IWMCodecAMVideoAccelerator::SetPlayerNotify avec une interface IWMPlayerTimestampHook . Ce hook permet au filtre source de mettre à jour les horodatages sur les échantillons avant qu’ils ne soient remis au convertisseur.

  7. Le filtre source appelle IWMReaderAccelerator::Notify avec le type de média négocié. Cela permet au lecteur de mettre à jour ses variables internes et de valider dans DirectX VA. Il s’agit du dernier endroit où le codec ou le lecteur peut échouer. Si l’une des étapes ci-dessus échoue, le filtre source doit revenir à l’étape 3 et essayer le type suivant énuméré par le lecteur.

  8. La lecture démarre. Le lecteur ignore les mémoires tampons de sortie du décodeur DMO si le type de sortie de connexion est Va DirectX.

  9. Lorsque IPin::D isconnect se produit, le filtre source appelle IWMCodecAMVideoAccelerator::SetAcceleratorInterface avec une valeur NULL. Cela interrompt la connexion va DirectX entre le codec et le convertisseur.

Lecture de fichiers ASF