Types de médias DMO
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, 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.]
Un type de média décrit le format associé à un flux de données multimédias. Cet article décrit comment les DMO gèrent les types de médias. Il est principalement destiné aux développeurs qui écrivent leurs propres DMO personnalisés.
Les types de médias sont définis à l’aide de la structure DMO_MEDIA_TYPE . Cette structure comprend les informations suivantes :
- Le type principal est un identificateur global unique (GUID) qui définit une catégorie large, telle que l’audio ou la vidéo.
- Le sous-type est un GUID qui définit des aspects plus spécifiques du type. Par exemple, dans la vidéo, les sous-types incluent RVB 16 bits, RVB 24 bits, UYVY, vidéo encodée en DV, etc.
- Le bloc de format est une structure secondaire qui spécifie entièrement le format. La disposition du bloc de format dépend du type de données. Par exemple, l’audio PCM utilise la structure WAVEFORMATEX . La vidéo utilise différentes autres structures, notamment VIDEOINFOHEADER et VIDEOINFOHEADER2. La disposition du bloc de format est identifiée par un GUID de type format. Par exemple, FORMAT_WaveFormatEx spécifie une structure WAVEFORMATEX .
Lors de la première création d’un DMO, les flux n’ont pas de type multimédia. Avant que le DMO puisse traiter des données, le client doit définir un type de média pour chaque flux. Ce processus est décrit du point de vue du client dans Définition des types de supports sur un DMO.
Types de médias dans le Registre
Un DMO peut ajouter une liste de types de médias qu’il prend en charge au Registre, en appelant la fonction DMORegister . Une application peut utiliser ces informations pour rechercher des objets de gestion de données qui correspondent à un format particulier. Les informations contenues dans le registre ne sont pas destinées à être complètes. En règle générale, vous incluez uniquement les types main pris en charge par le DMO. L’entrée du Registre a des clés distinctes pour les types d’entrée et de sortie, mais ne fait pas de distinction entre les flux individuels.
La fonction DMORegister utilise la structure DMO_PARTIAL_MEDIATYPE pour décrire les types de médias. Cette structure contient un sous-ensemble des informations trouvées dans la structure DMO_MEDIA_TYPE , à savoir le type principal et le sous-type. Il n’inclut pas de bloc de format, car le bloc de format contient généralement des informations trop granulaires à inclure dans le Registre, telles que la hauteur et la largeur d’une image vidéo.
Types de médias préférés
Une fois que l’application a créé un DMO, elle peut interroger le DMO pour les types de médias qu’elle prend en charge. Pour chaque flux, le DMO crée une liste de types de médias (éventuellement vides), classés par ordre de préférence. Les méthodes IMediaObject::GetInputType et IMediaObject::GetOutputType énumèrent les types préférés. Les types préférés d’un flux peuvent changer dynamiquement lorsque l’application définit des types de médias sur d’autres flux. Par exemple, la liste des types de sortie préférés peut changer une fois que le type d’entrée est défini, ou inversement. Toutefois, le DMO n’est pas obligé de mettre à jour ses types préférés dynamiquement. L’application ne peut pas supposer que chaque type qu’elle reçoit est valide. Pour cette raison, les méthodes IMediaObject::SetInputType et IMediaObject::SetOutputType prennent en charge un indicateur pour tester un type spécifique.
Les méthodes GetInputType et GetOutputType retournent une structure DMO_MEDIA_TYPE . Le DMO peut laisser certaines des informations de cette structure vides, pour indiquer une plage de types. Le type ou sous-type principal peut être GUID_NULL, et le bloc de format peut être vide (zéro octet). Si le bloc de format est vide, le type de format doit être GUID_NULL.
Une fois que l’application définit tous les types d’entrée d’un DMO, le DMO doit généralement retourner au moins un type complet pour chaque flux de sortie. Un type de sortie complet facilite les tests et les applications peuvent l’utiliser comme valeur par défaut raisonnable. L’application de test DMO s’appuie sur ce comportement. (Consultez Utilisation de l’application DMOTest.)
Définition des types de média
Les applications utilisent les méthodes SetInputType et SetOutputType pour tester, définir ou effacer des types sur un flux spécifié. L’application doit spécifier entièrement le type. Le DMO vérifie s’il peut accepter le type proposé. La réponse peut dépendre des types qui ont été définis sur d’autres flux. L’indicateur DMO_SET_TYPEF_CLEAR efface le type d’un flux, de sorte que l’application peut « reculer » et essayer une autre combinaison.
Exemples de scénarios
Les exemples suivants décrivent certains scénarios typiques, pour illustrer les points abordés dans les sections précédentes.
- Décodeurs vidéo. Dans un décodeur vidéo classique, le type d’entrée détermine en partie le type de sortie. Par exemple, les deux flux doivent généralement avoir la même fréquence d’images et les mêmes dimensions d’image. L’une des options consiste à ne définir aucun type de sortie préféré tant que le type d’entrée n’est pas défini. Une autre option consiste à énumérer un ensemble de types incomplets, en omettant le bloc de format. Utilisez le sous-type pour indiquer les types non compressés pris en charge, tels que RVB 16 bits, RVB 24 bits, etc. En outre, les décodeurs vidéo ne prennent généralement pas en charge la définition du type de sortie avant le type d’entrée. Le scénario habituel consiste à décoder à partir d’un format d’entrée connu, de sorte que cette limitation est raisonnable.
- Décodeurs audio. Un décodeur audio peut prendre en charge un ensemble limité et fixe de formats de sortie. Dans ce cas, il peut être en mesure de créer une liste des formats de sortie préférés avant que le format d’entrée soit connu.
- Compresseurs. Dans la plupart des cas, un compresseur vidéo ne peut pas spécifier entièrement ses formats de sortie préférés tant que l’application ne définit pas le format d’entrée, et inversement. Au lieu de cela, le DMO doit retourner un type incomplet sans bloc de format. Pour la compression audio et vidéo, l’application doit généralement définir différents paramètres de sortie, tels que le débit binaire. Toutefois, une fois le type d’entrée défini, le compresseur doit retourner au moins un type de sortie complet, pour les raisons mentionnées précédemment.
Rubriques connexes