Direct3D-Aware mfts

Cette rubrique explique comment implémenter une transformation Media Foundation (MFT) prenant en charge Direct3D pour la vidéo.

Une vidéo MFT est considérée comme prenant en compte Direct3D si elle peut traiter des exemples contenant des surfaces Direct3D. La raison typique de la prise en charge de Direct3D dans un MFT vidéo est d’activer le décodage accéléré matériel, à l’aide de DirectX Video Acceleration (DXVA).

Cette rubrique décrit les étapes nécessaires pour rendre votre MFT Direct3D compatible. Cette rubrique ne couvre pas les mécanismes du décodage DXVA. Pour plus d’informations sur DXVA, consultez DirectX Video Acceleration 2.0.

Important

À partir de Windows 8, IMFDXGIDeviceManager peut être utilisé à la place de IDirect3DDeviceManager9. Pour les applications du Windows Store, vous devez utiliser IMFDXGIDeviceManager et Microsoft Direct3D 11. Pour plus d’informations, consultez les API vidéo Direct3D 11.

 

  1. Implémentez la méthode IMFTransform::GetAttributes . Cette méthode retourne un pointeur vers un magasin d’attributs.
  2. Le MFT doit définir la valeur de l’attribut MF_SA_D3D_AWARE sur TRUE dans son propre magasin d’attributs. À compter de Windows 8, si vous utilisez Direct3D 11, utilisez MF_SA_D3D11_AWARE.
  3. Pendant la négociation de format, si l’attribut MF_SA_D3D_AWARE (ou MF_SA_D3D11_AWARE si l’utilisation de Direct3D 11) a la valeur TRUE, le client peut envoyer le message MFT_MESSAGE_SET_D3D_MANAGER au MFT. Le paramètre d’événement ulParam est un pointeur vers l’interface IDirect3DDeviceManager9 . À partir de Windows 8, vous pouvez utiliser IMFDXGIDeviceManager au lieu de IDirect3DDeviceManager9. Le client n’est pas obligé d’envoyer ce message.
  4. Le MFT appelle IDirect3DDeviceManager9::GetVideoService pour rechercher le service DXVA dont il a besoin. À compter de Windows 8, si IMFDXGIDeviceManager a été utilisé, le MFT appelle IMFDXGIDeviceManager::GetVideoService. En règle générale, un décodeur interroge IDirectXVideoDecoderService, et un processeur vidéo interroge IDirectXVideoProcessorService.
  5. En supposant que l’étape précédente réussit, les méthodes IMFTransform::GetInputAvailableType et IMFTransform::GetOutputAvailableType doivent retourner des formats compatibles avec DXVA.
  6. Le client configure les types de média sur le MFT. Si un type de média n’est pas compatible avec DXVA, le MFT doit retourner le code d’erreur MF_E_UNSUPPORTED_D3D_TYPE.
  7. À ce stade, il existe deux options, selon que le client trouve ou non un format DXVA approprié.
    • Si le client configure correctement un format DXVA, il peut commencer le traitement. À ce stade, le MFT peut utiliser DXVA pour le traitement ou revenir au traitement logiciel.
    • Si le client ne trouve pas de format DXVA acceptable, le client peut également envoyer un autre message MFT_MESSAGE_SET_D3D_MANAGER , en définissant cette fois ulParam sur NULL. Le MFT doit libérer le pointeur IDirect3DDeviceManager9 (le pointeur IMFDXGIDeviceManager , si IMFDXGIDeviceManager a été utilisé) et toutes les autres interfaces DXVA, et revenir au traitement logiciel. À ce stade, le MFT ne doit pas utiliser le traitement DXVA.

Un MFT prenant en charge Direct3D doit être préparé pour gérer des échantillons qui contiennent une surface Direct3D. L’exemple contiendra exactement une mémoire tampon multimédia. Pour obtenir la surface Direct3D à partir de la mémoire tampon, appelez la fonction MFGetService et spécifiez le service MR_BUFFER_SERVICE . Pour plus d’informations, consultez Mémoire tampon surface DirectX.

Un MFT qui utilise DXVA doit allouer ses propres exemples de sortie, comme suit :

  1. Dans la méthode IMFTransform::GetOutputStreamInfo , définissez l’indicateur MFT_OUTPUT_STREAM_PROVIDES_SAMPLES .
  2. Créez un pool de surfaces DXVA, comme décrit dans la spécification DXVA.
  3. Créez des exemples multimédias en appelant MFCreateVideoSampleFromSurface.

Le MFT doit toujours prendre en charge le traitement logiciel en tant que secours, car le traitement DXVA peut ne pas être disponible, pour plusieurs raisons :

  • Le GPU peut ne pas prendre en charge DXVA.
  • Le client n’utilise peut-être pas Direct3D.
  • Les profils DXVA ne sont pas définis pour chaque format vidéo.

Un MFT prenant en compte Direct3D doit avoir un seul flux de sortie. Il ne peut pas avoir plusieurs sorties.

Écriture d’un MFT personnalisé