À 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.
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 :
- Pour fournir des données d’entrée au MFT, appelez IMFTransform::P rocessInput.
- Pour extraire des données de sortie du MFT, appelez IMFTransform::P rocessOutput.
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.
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.
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.
Rubriques connexes