À propos des NPF

Les transformations Media Foundation (MFT) fournissent un modèle générique pour le traitement des données multimédias. Les mft sont utilisés pour les décodeurs, les encodeurs et les processeurs de signal numérique (DSP). En bref, tout ce qui se trouve dans le pipeline multimédia entre la source multimédia et le récepteur multimédia est un MFT.

Pour la plupart des applications, les détails du traitement des données MFT sont masqués par les couches supérieures de l’architecture Media Foundation. De nombreuses applications Media Foundation ne feront jamais d’appel direct à un MFT. Toutefois, il est certainement possible d’héberger un MFT directement dans votre application.

Les mft sont une évolution du modèle de transformation introduit pour la première fois avec les objets multimédias DirectX (DMO). En fait, il est relativement facile de créer une transformation qui prend en charge les deux modèles. Par rapport aux DMO, les comportements requis des MFT sont plus clairement spécifiés, ce qui facilite l’écriture d’une implémentation correcte. En outre, les MFT peuvent prendre en charge le traitement vidéo accéléré par le matériel.

Cette rubrique donne une brève vue d’ensemble du modèle de traitement MFT, en mettant l’accent sur la conception globale plutôt que sur des appels de méthode spécifiques. Pour obtenir une description détaillée, pas à pas, consultez Modèle de traitement MFT de base.

Flux

Un MFT a des flux d’entrée et des flux de sortie. Les flux d’entrée reçoivent des données et les flux de sortie produisent des données. Par exemple, un décodeur a un flux d’entrée, qui reçoit les données encodées, et un flux de sortie, qui produit les données décodées.

Les flux d’un MFT ne sont pas représentés en tant qu’objets COM distincts. Au lieu de cela, chaque flux a un identificateur de flux désigné, et les méthodes de l’interface IMFTransform prennent des identificateurs de flux comme paramètres d’entrée.

Certains mft ont un nombre fixe de flux. Par exemple, les décodeurs et les encodeurs ont normalement exactement une entrée et une sortie. D’autres mft ont un nombre dynamique de flux. Si un MFT prend en charge les flux dynamiques, le client peut ajouter de nouveaux flux d’entrée. Le client ne peut pas ajouter de flux de sortie, mais le MFT peut ajouter ou supprimer des flux de sortie pendant le traitement. Par exemple, les multiplexeurs permettent généralement au client d’ajouter des flux d’entrée et d’avoir une sortie pour le flux multiplexé. Les démultiplexeurs sont l’inverse, avec une entrée mais un nombre dynamique de flux de sortie, en fonction du contenu du flux d’entrée. L’illustration suivante montre la différence entre le multiplexeur et le démultiplexeur.

diagramme montrant un encodeur/décodeur (1 entrée, 1 sortie), un multiplexeur (2 entrées, 1 sortie) et un démultiplexeur (1 entrée, 2 sorties)

Types de médias

Lorsqu’un MFT est créé pour la première fois, aucun des flux n’a de format établi. Avant que le MFT puisse traiter des données, le client doit définir les formats des flux. Par exemple, avec un décodeur, le format d’entrée est le format de compression utilisé dans le fichier source d’origine, et le format de sortie est un format non compressé, tel que l’audio PCM ou la vidéo RVB. Les formats de flux sont décrits à l’aide de types de supports.

Selon l’état interne du MFT, il peut fournir une liste des types de médias possibles pour chaque flux. Vous pouvez utiliser cette liste comme indicateur lorsque vous définissez les types de médias. La définition du type de média sur un flux peut modifier la liste des types possibles pour un autre flux. Par exemple, un décodeur ne peut généralement fournir aucun type de sortie tant que le client ne définit pas le type d’entrée. Le type d’entrée contient les informations dont le décodeur a besoin pour retourner une liste de types de sortie possibles.

Pour définir le type de média sur un flux, appelez IMFTransform::SetInputType ou IMFTransform::SetOutputType. Pour obtenir la liste des types de médias possibles pour un flux, appelez IMFTransform::GetInputAvailableType ou IMFTransform::GetOutputAvailableType.

Traitement des données

Une fois que le client a définit les types de médias sur les flux, le MFT est prêt à traiter les données. Pour ce faire, le client alterne entre fournir des données d’entrée au MFT et obtenir des données de sortie du MFT :

La méthode ProcessInput prend un pointeur vers un exemple de média alloué par le client. L’exemple multimédia contient une ou plusieurs mémoires tampons, et chaque mémoire tampon contient des données d’entrée que le MFT doit traiter.

La méthode ProcessOutput prend en charge deux modèles d’allocation différents : soit le MFT alloue les mémoires tampons de sortie, soit le client alloue les mémoires tampons de sortie. Certains mft prennent en charge les deux modèles d’allocation, mais il n’est pas nécessaire pour un MFT de prendre en charge les deux. Par exemple, une MFT peut exiger que le client alloue les mémoires tampons de sortie. La méthode IMFTransform::GetOutputStreamInfo retourne des informations sur un flux de sortie, y compris le modèle d’allocation pris en charge par MFT.

Les mfts sont conçus pour mettre en mémoire tampon le moins de données possible, afin de réduire la latence dans le pipeline. Par conséquent, à tout moment, le MFT peut signaler l’une des conditions suivantes :

  • Le MFT nécessite plus de données d’entrée. Dans cet état, le MFT ne peut pas produire de sortie tant que le client n’appelle pas ProcessInput au moins une fois.
  • Le MFT n’accepte plus d’entrée tant que le client n’appelle pas ProcessOutput au moins une fois.

Par exemple, supposons que vous utilisez un décodeur vidéo pour décoder un flux vidéo qui contient un mélange d’images clés et d’images delta. Initialement, le MFT nécessite une entrée avant de pouvoir décoder n’importe quelle trame. Le client appelle ProcessInput pour remettre la première image. Supposons que la première image soit une image delta (illustrée dans le diagramme suivant sous la forme « P » pour l’image prédite). Le décodeur s’accroche à cette image, mais il ne peut pas produire de sortie tant qu’il n’obtient pas l’image clé suivante.

diagramme montrant le mft qui a besoin d’une entrée, pointant vers une trame prédite

Le client continue d’appeler ProcessInput et atteint finalement l’image clé suivante (illustrée dans le diagramme suivant sous la forme « I » pour le cadre intra-codé). À présent, le décodeur dispose de suffisamment d’images pour commencer le décodage. À ce stade, il cesse d’accepter les entrées et le client doit appeler ProcessOutput pour obtenir les images décodées.

diagramme montrant un mft qui n’accepte pas d’entrée, pointant vers une trame intra-codée et trois images prédites

L’approche la plus simple pour le client consiste simplement à alterner les appels à ProcessInput et ProcessOutput. Un algorithme plus sophistiqué est décrit dans la rubrique Modèle de traitement MFT de base.

Transformations de Media Foundation