Utilisation des contrôles de mixage vidéo

[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 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, dans la mesure du 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.]

Le mélangeur EVR fournit plusieurs interfaces qu’une application peut utiliser pour contrôler la façon dont le mélangeur traite la vidéo. Ces interfaces peuvent être utilisées dans DirectShow ou Media Foundation.

Interface Description
Interface IMFVideoMixerBitmap Effectue la fusion alpha d’une image bitmap statique sur la vidéo.
Interface IMFVideoMixerControl Contrôle la façon dont l’EVR combine les sous-flux vidéo.
Interface IMFVideoProcessor Contrôle le réglage des couleurs, les filtres d’images et d’autres fonctionnalités de traitement vidéo. Comme cette interface fournit l’accès aux fonctionnalités implémentées par le pilote graphique, les fonctionnalités exactes dépendent du pilote graphique de l’utilisateur.

 

La bonne façon d’obtenir des pointeurs vers ces interfaces varie selon que vous utilisez la version DirectShow de l’EVR ou la version Media Foundation. Pour l’EVR Media Foundation, elle varie également selon que vous utilisez directement l’EVR ou via la session multimédia. (En règle générale, une application utilise l’EVR par le biais de la session multimédia, pas directement).

Pour obtenir un pointeur vers l’une de ces interfaces, procédez comme suit :

  1. Obtenez un pointeur vers l’interface IMFGetService sur l’EVR.

    • Si vous utilisez le filtre DirectShow EVR, appelez QueryInterface sur le filtre.

    • Si vous utilisez directement le récepteur multimédia EVR, appelez QueryInterface sur le récepteur multimédia.

    • Si vous utilisez la session multimédia, appelez QueryInterface sur la session multimédia.

  2. Si vous utilisez la session multimédia, attendez qu’elle envoie l’événement MESessionTopologyStatus avec la valeur d’état MF_TOPOSTATUS_READY. (Ignorez cette étape si vous n’utilisez pas la session multimédia.)

  3. Appelez IMFGetService::GetService pour obtenir l’interface du mélangeur. Utilisez l’identificateur de service MR_VIDEO_MIXER_SERVICE.

Fusion alpha d’une image bitmap sur la vidéo

Vous pouvez utiliser l’interface IMFVideoMixerBitmap pour effectuer une fusion alpha d’une bitmap statique sur la vidéo pendant la lecture. Vous pouvez stocker la bitmap dans une surface Direct3D, spécifiée en tant que pointeur IDirect3DSurface9 ou utiliser une bitmap GDI.

Si vous utilisez une surface Direct3D pour la bitmap, la surface peut contenir des données alpha par pixel, qui sont utilisées lorsque le mélangeur effectue une fusion alpha de l’image. Vous pouvez également définir une clé de couleur, c’est-à-dire une couleur unique qui sera transparente partout où elle apparaît dans la bitmap. En outre, vous pouvez spécifier une valeur alpha qui sera appliquée à l’image entière. Vous pouvez également définir un rectangle source pour rogner la bitmap et un rectangle de destination pour positionner la bitmap dans la trame vidéo.

Pour définir la bitmap, appelez la méthode IMFVideoMixerBitmap::SetAlphaBitmap. Cette méthode prend un pointeur vers une structure MFVideoAlphaBitmap qui spécifie la bitmap et les paramètres de fusion alpha. Pour obtenir un exemple de code, consultez la rubrique de référence correspondant à la méthode SetAlphaBitmap.

Après avoir défini la bitmap, vous pouvez mettre à jour les paramètres de fusion, y compris les rectangles source et de destination, en appelant la méthode IMFVideoMixerBitmap::UpdateAlphaBitmapParameters. La mise à jour prend effet sur la trame vidéo suivante. La vidéo doit être en cours de lecture pour que la mise à jour ait lieu. Vous pouvez utiliser cette méthode pour effectuer des animations simples sur la bitmap. (Si vous avez besoin d’effets plus sophistiqués, pensez à écrire un mélangeur EVR personnalisé.)

Pour effacer la bitmap, appelez la méthode IMFVideoMixerBitmap::ClearAlphaBitmap.

Contrôle des sous-flux

L’EVR peut mélanger un ou plusieurs sous-flux vidéo sur le flux vidéo principal. Pour contrôler le mélange des sous-flux, utilisez l’interface IMFVideoMixerControl.

  • Appelez la méthode IMFVideoMixerControl::SetStreamOutputRect pour définir la position d’un sous-flux dans la trame vidéo composée.

  • Appelez la méthode IMFVideoMixerControl::SetStreamZOrder pour définir l’ordre de plan des sous-flux. L’EVR dessine les flux vidéo en suivant l’ordre des valeurs de leur ordre de plan, en commençant par zéro. Le flux vidéo principal est toujours premier dans l’ordre de plan.

Paramètres du processeur vidéo

Le mélangeur EVR utilise DirectX Video Acceleration (DXVA) pour effectuer le traitement vidéo des flux d’entrée. Les fonctionnalités de traitement exactes dépendent du pilote graphique. Les fonctionnalités de traitement vidéo sont décrites à l’aide de la structure DXVA2_VideoProcessorCaps. Un ensemble particulier de fonctionnalités est appelé mode de traitement vidéo, chaque mode étant identifié par un GUID. Pour obtenir la liste des GUID prédéfinis, consultez l’article sur la méthode IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. Le pilote peut définir des GUID propres au fournisseur supplémentaires, représentant différentes combinaisons de fonctionnalités.

Pour trouver les modes pris en charge et les fonctionnalités de chacun d’eux, procédez comme suit :

  1. Appelez la méthode IMFGetService::GetService pour obtenir un pointeur vers l’interface IMFVideoProcessor du mélangeur.

  2. Appelez la méthode IMFVideoProcessor::GetAvailableVideoProcessorModes. Cette méthode retourne un tableau de GUID, qui identifient les modes de processeur vidéo disponibles. La liste est retournée dans l’ordre décroissant de qualité, le mode dont la qualité est la plus élevée apparaissant en premier dans la liste. La liste peut changer en fonction du format de la vidéo.

  3. Pour chaque GUID de la liste, appelez la méthode IMFVideoProcessor::GetVideoProcessorCaps pour rechercher les fonctionnalités du mode de processeur vidéo correspondant. La méthode remplit une structure DXVA2_VideoProcessorCaps avec une description des fonctionnalités.

  4. Pour sélectionner un mode, appelez la méthode IMFVideoProcessor::SetVideoProcessorMode. Sinon, l’EVR sélectionne automatiquement un mode au démarrage de la diffusion en continu. Dans ce cas, vous pouvez appeler la méthode IMFVideoProcessor::GetVideoProcessorMode pour rechercher le mode sélectionné.

La plupart des champs de la structure DXVA2_VideoProcessorCaps décrivent le comportement du pilote de bas niveau et ne présentent pas d’intérêt dans une application classique. Les champs suivants sont les plus susceptibles d’être intéressants :

  • DeviceCaps. Ce champ indique si le traitement vidéo est effectué dans le matériel ou le logiciel, et si le pilote graphique est un pilote DXVA 1.0 plus ancien.

  • DeinterlaceTechnology. Ce champ indique le niveau de qualité du désentrelacement que vous pouvez escompter si la vidéo source est entrelacée.

  • ProcAmpControlCaps. Ce champ spécifie les contrôles de réglage des couleurs disponibles. Pour obtenir la liste des réglages de couleurs possibles, consultez l’article Paramètres ProcAmp. Si le pilote ne peut pas effectuer de réglage des couleurs, ce champ est défini sur zéro.

  • VideoProcessorOperations. Ce champ contient des indicateurs qui décrivent diverses fonctionnalités de traitement vidéo. Deux indicateurs d’importance particulière sont l’indicateur DXVA2_VideoProcess_SubFlux et l’indicateur DXVA2_VideoProcess_SubFlux. Au moins un de ces indicateurs doit être présent pour que l’EVR mélange les sous-flux sur le flux vidéo de référence. Si aucun indicateur n’est présent, l’EVR est limité à un flux vidéo.

  • NoiseFilterTechnology. Ce champ indique les filtres de bruit pris en charge par le pilote graphique. Si le pilote ne prend pas en charge le filtrage du bruit, la valeur est DXVA2_NoiseFilterTech_Unsupported.

  • DetailFilterTechnology. Ce champ indique les filtres de détail pris en charge par le pilote graphique. Si le pilote ne prend pas en charge le filtrage du bruit, la valeur est DXVA2_DetailFilterTech_Unsupported.

Réglage des couleurs et filtrage d’images

Le pilote graphique peut prendre en charge le réglage des couleurs (également appelé amplification de processus ou simplement ProcAmp) et le filtrage d’images. En cas d’exécution par le GPU, le réglage des couleurs et le filtrage d’images peuvent être effectués en temps réel sans traitement du processeur.

Pour utiliser ces fonctionnalités, procédez comme suit :

  1. Sélectionnez un mode de traitement vidéo, comme décrit dans la section précédente.

  2. Appelez la méthode IMFVideoProcessor::GetVideoProcessorCaps pour rechercher les fonctionnalités de traitement vidéo, comme décrit dans la section précédente. La méthode remplit une structure DXVA2_VideoProcessorCaps qui décrit les fonctionnalités. Elle indique notamment si le pilote prend en charge le réglage des couleurs et le filtrage d’images.

  3. Pour chaque réglage de couleur pris en charge par le pilote, appelez la méthode IMFVideoProcessor::GetProcAmpRange pour trouver la plage de valeurs possible pour ce paramètre. Cette méthode retourne également la valeur par défaut du paramètre. Appelez la méthode IMFVideoProcessor::GetProcAmpValues pour rechercher la valeur actuelle des paramètres. Les valeurs n’ont pas d’unités spécifiées. Il incombe au pilote de définir la plage de valeurs.

  4. Appelez la méthode IMFVideoProcessor::SetFilteringValue pour définir une valeur de réglage de couleur.

  5. Si le pilote prend en charge le filtrage d’images, chaque type de filtre (bruit et détail) prend en charge trois paramètres (niveau, rayon et seuil) pour la couleur et la luminance. (Consultez l’article Paramètres du filtre d’images DXVA.) Pour chaque paramètre, appelez la méthode IMFVideoProcessor::GetFilteringRange pour obtenir la plage de valeurs possibles et la méthode IMFVideoProcessor::GetFilteringValue pour obtenir la valeur actuelle.

  6. Pour modifier un paramètre de filtre d’image, appelez la méthode IMFVideoProcessor::SetFilteringValue.

Convertisseur vidéo amélioré