Partager via


Mélangeurs personnalisés

[Le composant décrit dans cette page, de renderer vidéo amélioré, est une fonctionnalité héritée. Il a été remplacé par le Simple Video Renderer (SVR) exposé via les 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 que le nouveau code utilise MediaPlayer ou le niveau inférieur IMFMediaEngine API pour lire des médias vidéo dans Windows au lieu de l’EVR, 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 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 MEDIA Foundation EVR ou le filtre EVR DirectShow. Pour plus d’informations sur les mélangeurs et les présentateurs, consultez de renderer 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 ::P rocessInput sur le mélangeur, et le présentateur est responsable de l’appel IMFTransform ::P rocessOutput.

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 de la qualité d’ajuster la qualité de la vidéo.
IMFVideoMixerBitmap Permet à l’application de combiner une bitmap statique sur la vidéo.
IMFVideoPositionMapper Mappe les coordonnées sur l’image vidéo de sortie pour 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 ::P rocessMessage 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 ::P rocessOutput du mélangeur échoue et retourne MF_E_TRANSFORM_STREAM_CHANGE. Le présentateur ne doit rien faire à ce stade. L’EVR lance à nouveau le processus de négociation de format.

Lorsqu’un flux d’entrée atteint la fin du flux, l’EVR appelle IMFTransform ::P rocessMessage 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 d’EVR. Cette interface est documentée dans la documentation du Kit de développement logiciel (SDK) DirectShow.

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

 

L’EVR peut appeler ProcessOutput sur le mélangeur avant le démarrage du streaming. Le mélangeur ne doit pas échouer 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 de remplissage de 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 de IMFVideoDeviceID

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

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

Implémentation de 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. 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 :

  • IMediaEventSink

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

Attributs de mixage

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.

 

Définition du mélangeur sur l’EVR

Pour définir 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.

 

de renderer vidéo amélioré