Mélangeurs personnalisés

[Le composant décrit sur cette page, Convertisseur vidéo amélioré, est une fonctionnalité héritée. Il a été remplacé par le Convertisseur vidéo simple (SVR) exposé à travers des composants MediaPlayer et IMFMediaEngine. Pour lire du contenu vidéo, vous devez envoyer des données dans l’un de ces composants et les autoriser à instancier le nouveau convertisseur vidéo. Ces composants ont été optimisés pour Windows 10 et Windows 11. Microsoft recommande vivement (si possible) que le nouveau code utilise MediaPlayer ou les API de bas niveau IMFMediaEngine pour lire des médias vidéo dans Windows au lieu de l’EVR. Microsoft recommande, si possible, la réécriture du code existant qui utilise les API héritées pour être à jour avec les nouvelles API.]

Cette rubrique explique comment écrire un mélangeur personnalisé pour le convertisseur vidéo amélioré (EVR). Vous pouvez utiliser un mélangeur personnalisé avec le récepteur multimédia EVR MEDIA Foundation ou le filtre EVR DirectShow. Pour plus d’informations sur les mixeurs et les présentateurs, consultez Convertisseur vidéo amélioré.

Le mélangeur est une transformation Media Foundation (MFT) avec une ou plusieurs entrées (le flux de référence plus les sous-flux) et une sortie. Le flux d’entrée reçoit des exemples en amont. Le flux de sortie fournit des exemples au présentateur. L’EVR est responsable de l’appel IMFTransform::ProcessInput sur le mixeur, et le présentateur est responsable de l’appel IMFTransform::ProcessOutput.

Au minimum, un mélangeur EVR doit implémenter les interfaces suivantes :

Interface Description
IMFTransform Fournit des fonctionnalités MFT de base.
IMFTopologyServiceLookupClient Permet au mélangeur d’obtenir des interfaces à partir de l’EVR.
IMFVideoDeviceID Permet au mélangeur d’obtenir des interfaces à partir de l’EVR.
IMFAttributes Utilisé pour exposer l’attribut MF_SA_D3D_AWARE à l’EVR.

 

Si vous le souhaitez, un MFT peut implémenter l’une des interfaces suivantes :

Interface Description
IEVRTrustedVideoPlugin Obligatoire pour lire du contenu protégé.
IMFGetService Expose des interfaces telles que IMFVideoMixerBitmap et IMFVideoProcessor à l’application.
IMFQualityAdvise Permet au responsable qualité d’ajuster la qualité de la vidéo.
IMFVideoMixerBitmap Permet à l’application de mélanger une bitmap statique sur la vidéo.
IMFVideoPositionMapper Mappe les coordonnées sur l’image vidéo de sortie vers les coordonnées sur l’image vidéo d’entrée.
IMFVideoProcessor Expose certaines fonctionnalités de traitement vidéo DXVA à l’application.

 

La négociation de format avec le mélangeur fonctionne comme suit :

  1. L’EVR définit le type de média sur le flux de référence.

  2. L’EVR appelle IMFVideoPresenter::ProcessMessage sur le présentateur avec le message MFVP_MESSAGE_INVALIDATEMEDIATYPE.

  3. Le présentateur définit le type de média sur le flux de sortie du mélangeur.

  4. L’EVR définit le type de média sur les sous-flux.

Si le type de média sur le flux de référence change, les autres types de supports du mélangeur ne sont plus valides. La méthode IMFTransform::ProcessOutput du mélangeur échoue et retourne MF_E_TRANSFORM_STREAM_CHANGE. Le présentateur ne doit rien faire à ce stade. L’EVR relance le processus de négociation de format.

Quand un flux d’entrée atteint la fin du flux, l’EVR appelle IMFTransform::ProcessMessage sur le mélangeur avec MFT_MESSAGE_NOTIFY_END_OF_STREAM.

Le mélangeur envoie les événements suivants à l’EVR à l’aide de l’interface IMediaEventSink de l’EVR. Cette interface est documentée dans la documentation du SDK DirectShow.

Événement Description
EC_SAMPLE_NEEDED Le mélangeur nécessite un nouvel exemple d’entrée.

 

Il se peut que l’EVR appelle ProcessOutput sur le mélangeur avant le démarrage de la diffusion en continu. Le mélangeur ne doit pas refuser ces appels. Au lieu de cela, il doit remplir la surface de sortie avec des pixels noirs. Le mélangeur doit continuer à remplir des échantillons de sortie en couleur jusqu’à ce qu’il reçoive un message MFT_MESSAGE_NOTIFY_BEGIN_STREAMING ou que la méthode ProcessInput soit appelée. Si le mélangeur reçoit un message MFT_MESSAGE_NOTIFY_END_STREAMING, il doit revenir en mode remplissage de couleur.

Implémentation d’IMFVideoDeviceID

L’interface IMFVideoDeviceID contient une méthode, GetDeviceID, qui retourne le GUID d’appareil. Le GUID d’appareil garantit que le présentateur et le mélangeur utilisent des technologies compatibles. Si les GUID d’appareil ne correspondent pas, l’EVR ne parvient pas à réaliser l’initialisation.

Le mélangeur standard et le présentateur utilisent Direct3D 9, avec le GUID d’appareil défini sur IID_IDirect3DDevice9. Si vous envisagez d’utiliser votre présentateur personnalisé avec le mélangeur standard, le GUID d’appareil du présentateur doit être IID_IDirect3DDevice9. Si vous remplacez les deux composants, vous pouvez définir un nouveau GUID pour l’appareil.

Implémentation d’IMFTopologyServiceLookupClient

Le mélangeur doit implémenter l’interface IMFTopologyServiceLookupClient. Avant le début de la diffusion en continu, l’EVR appelle IMFTopologyServiceLookupClient::InitServicePointers et passe un pointeur vers l’interface IMFTopologyServiceLookup de l’EVR. Le mélangeur utilise ce pointeur pour obtenir des pointeurs d’interface à partir de l’EVR.

Au minimum, le mélangeur doit rechercher l’interface suivante :

Lorsque l’EVR appelle IMFTopologyServiceLookupClient::ReleaseServicePointers, le mélangeur doit libérer tous les pointeurs obtenus à partir de l’appel à InitServicePointers.

Attributs de mélangeur

Un mélangeur doit prendre en charge les attributs suivants.

Attribut Description
MF_SA_D3D_AWARE Spécifie si le mélangeur prend en charge l’accélération vidéo DirectX (DXVA).
MF_SA_REQUIRED_SAMPLE_COUNT Nombre d’échantillons vidéo que l’EVR doit allouer pour chaque flux de mélangeur. Cet attribut s’applique aux flux individuels ; utilisez le magasin d’attributs retourné par IMFTransform::GetInputStreamAttributes.

 

Configuration du mélangeur sur l’EVR

Pour confiurer un mélangeur personnalisé sur l’EVR, appelez IMFVideoRenderer::InitializeRenderer. Le filtre DirectShow EVR et le récepteur multimédia EVR implémentent cette méthode.

Objet d’activation EVR. Si vous utilisez l’objet d’activation EVR, vous pouvez fournir un mélangeur personnalisé en définissant l’un des attributs suivants sur l’objet d’activation EVR :

Attribut Description
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE Pointeur vers un objet d’activation pour le mélangeur. L’objet d’activation doit implémenter l’interface IMFActivate.
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID CLSID du mélangeur.

 

Convertisseur vidéo amélioré