Comparaison entre MFT et DMO

Les transformations de Media Foundation (MFTs) sont une évolution du modèle de transformation introduit pour la première fois avec DirectX Media Objects (DMOs). Cette rubrique résume les principales façons dont MFTs diffère de DMOs. lisez cette rubrique si vous êtes déjà familiarisé avec les interfaces DMO ou si vous souhaitez convertir un DMO existant en MFT.

Cette rubrique contient les sections suivantes :

Nombre de Flux

un DMO a un nombre fixe de flux, alors qu’un MFT peut prendre en charge un nombre dynamique de flux. Le client peut ajouter des flux d’entrée, et la table MFT peut ajouter de nouveaux flux de sortie pendant le traitement. Toutefois, les MFTs ne sont pas nécessaires pour prendre en charge les flux dynamiques. Une table MFT peut avoir un nombre fixe de flux, comme un DMO.

Les méthodes suivantes sont utilisées pour prendre en charge les flux dynamiques sur une table MFT :

En outre, la méthode IMFTransform ::P rocessoutput définit le comportement d’ajout ou de suppression de flux de sortie.

étant donné que les DMOs ont des flux fixes, les flux sur un DMO sont identifiés à l’aide de valeurs d’index de base zéro. MFTs, en revanche, utilisez des identificateurs de flux qui ne correspondent pas nécessairement aux valeurs d’index. Cela est dû au fait que le nombre de flux sur une table MFT peut changer. Par exemple, le flux 0 peut être supprimé, ce qui laisse Stream 1 comme premier flux. Toutefois, une table MFT avec un nombre fixe de flux doit respecter la même convention que DMOs et utiliser des valeurs d’index pour les identificateurs de flux.

Négociation de format

MFTs utilisez l’interface IMFMediaType pour décrire les types de médias. Dans le cas contraire, la négociation de format avec MFTs fonctionne sur les mêmes principes de base que avec DMOs. Le tableau suivant répertorie les méthodes de négociation de format pour DMOs et les méthodes correspondantes pour MFTs.

méthode DMO MFT, méthode
IMediaObject::GetInputCurrentType IMFTransform::GetInputCurrentType
IMediaObject::GetInputMaxLatency IMFTransform::GetInputStreamInfo
IMediaObject::GetInputSizeInfo IMFTransform::GetInputStreamInfo
IMediaObject::GetInputType IMFTransform::GetInputAvailableType
IMediaObject::GetOutputCurrentType IMFTransform::GetOutputCurrentType
IMediaObject::GetOutputSizeInfo IMFTransform::GetOutputStreamInfo
IMediaObject::GetOutputType IMFTransform::GetOutputAvailableType

Diffusion en continu

Comme DMOs, MFTs traite les données par le biais d’appels à des méthodes ProcessInput et ProcessOutput . voici les principales différences entre les DMO et les processus MFT lors de la diffusion de données en continu.

Allocation des ressources

MFTs n’ont pas les méthodes IMediaObject :: AllocateStreamingResources et IMediaObject :: FreeStreamingResources utilisées avec DMOs. Pour gérer efficacement l’allocation et la désallocation des ressources, une table MFT peut répondre aux messages suivants dans la méthode IMFTransform ::P rocessmessage :

En outre, le client peut signaler le début et la fin d’un flux en appelant ProcessMessage avec les messages suivants :

ces deux messages n’ont pas d’équivalent DMO exact.

Traitement des données

MFTs utilisez les exemples de supports pour stocker les données d’entrée et de sortie. Les exemples de média exposent l’interface IMFSample et contiennent les données suivantes :

  • Horodatage et durée.
  • Attributs qui contiennent des informations par exemple. Pour obtenir la liste des attributs, consultez exemples d’attributs.
  • Zéro, un ou plusieurs tampons de média. Chaque mémoire tampon de média expose l’interface IMFMediaBuffer .

l’interface IMFMediaBuffer est similaire à l’interface IMediaBuffer DMO. Pour accéder à la mémoire tampon sous-jacente, appelez IMFMediaBuffer :: Lock. Cette méthode est à peu près équivalente à IMediaBuffer :: GetBufferAndLength pour DMOs.

Pour les données vidéo non compressées, une mémoire tampon de support peut également prendre en charge l’interface IMF2DBuffer . Une table MFT qui traite la vidéo non compressée (en tant qu’entrée ou sortie) doit être préparée à utiliser l’interface IMF2DBuffer si la mémoire tampon l’expose. Pour plus d’informations, consultez mémoires tampons vidéo non compressées.

Media Foundation fournit certaines implémentations standard de IMFMediaBuffer, il n’est généralement pas nécessaire d’écrire votre propre implémentation. pour créer une mémoire tampon de DMO à partir d’une mémoire tampon de Media Foundation, appelez MFCreateLegacyMediaBufferOnMFMediaBuffer.

Vidage

Les MFTs n’ont pas de méthode flush . Pour vider une table MFT, appelez IMFTransform ::P rocessmessage avec le message de vidage de la _ _ commande _ MFT message .

Discontinuités de flux

Les MFTs n’ont pas de méthode de discontinuité . Pour signaler une discontinuité dans un flux, définissez l’attribut de _ discontinuité MFSampleExtension sur l’exemple d’entrée.

Différences diverses

Voici quelques-unes des différences mineures entre MFTs et DMOs.

Indicateurs

les tableaux suivants répertorient les différents indicateurs de DMO et leurs équivalents MFT. chaque fois qu’un indicateur de DMO est mappé directement à un indicateur MFT, les deux indicateurs ont la même valeur numérique. toutefois, certains indicateurs de DMO n’ont pas d’équivalents de la table MFT exacte, et vice versa.

Indicateurs ProcessInput

DMOs : DMO énumération _ _ d' _ _ _ indicateurs de tampon de données d’entrée .

MFTs : aucune énumération équivalente.

indicateur de DMO Indicateur MFT
DMO _ données d’entrée _ _ BUFFERF _ SYNCPOINT Aucun indicateur équivalent. Au lieu de cela, définissez l’attribut MFSampleExtension _ CleanPoint sur l’exemple.
DMO _ _BUFFERF des données d’entrée _ _ Aucun indicateur équivalent. Au lieu de cela, appelez IMFSample :: SetSampleTime sur l’exemple.
DMO _ données d’entrée _ _ BUFFERF _ TIMELENGTH Aucun indicateur équivalent. Au lieu de cela, appelez IMFSample :: SetSampleDuration sur l’exemple.

Indicateurs ProcessOutput

DMOs : DMO de traiter l’énumération des _ _ _ _ indicateurs de sortie .

MFTs : énumération des _ _ indicateurs de _ sortie _ du processus MFT .

indicateur de DMO Indicateur MFT
DMO _ TRAITER la _ sortie _ ignorée _ quand _ aucune _ mémoire tampon _sortie du processus MFT _ _ ignorée _ en l’absence de _ _ mémoire tampon

DMOs : DMO l’énumération des _ _ indicateurs de tampon de _ données _ _ de sortie .

MFTs : énumération d' _ _ indicateurs de tampon de données de sortie _ _ _ MFT .

indicateur de DMO Indicateur MFT
DMO _ données de sortie _ _ BUFFERF _ SYNCPOINT Aucun indicateur équivalent. Au lieu de cela, recherchez l’attribut MFSampleExtension _ CleanPoint sur l’exemple.
DMO _ _temps de _ BUFFERF des données de sortie _ Aucun indicateur équivalent. Au lieu de cela, appelez IMFSample :: GetSampleTime sur l’exemple.
DMO _ données de sortie _ _ BUFFERF _ TIMELENGTH Aucun indicateur équivalent. Au lieu de cela, appelez IMFSample :: GetSampleDuration sur l’exemple.
DMO _ données de sortie _ _ BUFFERF _ incomplètes _mémoire tampon de données de sortie MFT _ _ _ incomplète
Aucun indicateur équivalent. _modification du _ _ format de mémoire tampon des données de _ sortie MFT _
Aucun indicateur équivalent. _fin du _ _ flux de mémoire tampon des données de _ sortie MFT _
Aucun indicateur équivalent. _exemple de _ _ mémoire tampon _ de données de sortie MFT _

Indicateurs GetInputStatus

DMOs : DMO énumération _ _ d' _ _ indicateurs d’état d’entrée .

MFTs : énumération _ _ d' _ _ indicateurs d’état d’entrée MFT .

indicateur de DMO Indicateur MFT
DMO _ ENTRÉE _ STATUSF _ accepter les _ données l' _ État d’entrée MFT _ _ accepte les _ données

Indicateurs GetOutputStatus

DMOs : aucune énumération équivalente.

MFTs : énumération des _ _ indicateurs d' _ état _ de sortie MFT .

indicateur de DMO Indicateur MFT
Aucun indicateur équivalent. _exemple d’état de sortie MFT _ _ _ prêt

Indicateurs GetInputStreamInfo

DMOs : DMO de l’énumération des _ _ _ informations de flux _ _ d’entrée .

MFTs : _ _ informations de flux d’entrée MFT _ _ _ énumération des indicateurs.

indicateur de DMO Indicateur MFT
DMO _ exemples d’entrée _ STREAMF _ entière _ _ _ exemples complets de flux d’entrée _ MFT _
DMO _ exemple d’entrée _ STREAMF _ unique _ _ par _ mémoire tampon _exemple unique de flux d’entrée MFT _ _ _ _ par _ mémoire tampon
DMO _ _taille d' _ _ échantillon fixe _ d’entrée STREAMF _taille d' _ _ échantillon fixe _ de flux d’entrée MFT _
DMO _ le _ STREAMF d’entrée _ contient des _ tampons le _ flux d’entrée MFT _ _ contient des _ tampons
Aucun indicateur équivalent. le _ flux d’entrée MFT _ _ ne fait _ pas de _ ADDREF
Aucun indicateur équivalent. _flux d’entrée MFT _ _ amovible
Aucun indicateur équivalent. _flux d’entrée MFT _ _ facultatif

Indicateurs GetOutputStreamInfo

DMOs : DMO de l’énumération d' _ _ informations de _ flux _ _ de sortie .

MFTs : l’énumération des _ _ informations de flux de sortie _ _ _ MFT est l’énumération.

indicateur de DMO Indicateur MFT
DMO _ _échantillons de STREAMF _ entier _ de sortie _exemples de flux de sortie MFT _ _ complets _
DMO _ exemple de sortie _ STREAMF _ unique _ _ par _ mémoire tampon _exemple de flux de sortie MFT _ _ unique _ _ par _ mémoire tampon
DMO _ _taille d' _ _ échantillon fixe STREAMF de _ sortie _taille d' _ _ échantillon fixe _ du flux de sortie MFT _
DMO _ SORTIE _ STREAMF _ Ignorable _flux de sortie MFT _ _ ignoré
DMO _ STREAMF de sortie _ _ facultatif _flux de sortie MFT _ _ facultatif
Aucun indicateur équivalent. le _ flux de sortie MFT _ fournit des _ _ exemples
Aucun indicateur équivalent. le _ flux de sortie MFT _ _ peut _ fournir des _ exemples
Aucun indicateur équivalent. _ _ _ lecture différée du flux de sortie MFT _
Aucun indicateur équivalent. _flux de sortie MFT _ _ amovible

Indicateurs SetInputType/SetOutputType

DMOs : DMO de définir l’énumération des _ _ _ _ indicateurs de TYPE .

MFTs : énumération des indicateurs de type de l' _ _ ensemble _ _ MFT .

indicateur de DMO Indicateur MFT
DMO _ DÉFINIR _ le _ test TYPEF _ uniquement _test de type d’ensemble MFT _ _ _ uniquement
DMO _ DÉFINIR _ TYPEF _ Clear Aucun indicateur équivalent. Au lieu de cela, définissez le type de média sur null pour effacer le type de média.

Codes d’erreur

le tableau suivant montre comment mapper DMO codes d’erreur aux codes d’erreur MFT. un objet MFT/DMO hybride doit retourner les codes d’erreur DMO à partir des méthodes IMediaObject et les codes d’erreur MFT des méthodes IMFTransform . les codes d’erreur DMO sont définis dans le fichier d’en-tête MediaErr. h. Les codes d’erreur MFT sont définis dans le fichier d’en-tête mferror. h.

code d’erreur DMO Code d’erreur MFT
DMO _ _INVALIDTYPE E _INVALIDTYPE MF E _
DMO _ _INVALIDSTREAMINDEX E _INVALIDSTREAMNUMBER MF E _
DMO _ _NOTACCEPTING E _NOTACCEPTING MF E _
DMO _ E _ aucun _ autre _ élément MF _ E _ _ plus de _ types
DMO _ _type E _ non _ accepté _INVALIDMEDIATYPE MF E _
DMO _ _type E _ non _ défini _type de transformation MF E _ _ _ non _ défini

création d’objets/MFT hybrides DMO

L’interface IMFTransform est vaguement basée sur IMediaObject, qui est l’interface principale de DirectX Media Objects (DMOs). Il est possible de créer des objets qui exposent les deux interfaces. Toutefois, cela peut entraîner des conflits de noms, car les interfaces ont des méthodes qui partagent le même nom. Vous pouvez résoudre ce problème de deux manières :

Solution 1 : incluez la ligne suivante en haut de tout fichier. cpp qui contient des fonctions MFT :

#define MFT_UNIQUE_METHOD_NAMES

Cela modifie la déclaration de l’interface IMFTransform de sorte que la plupart des noms de méthode aient pour préfixe « MFT ». Ainsi, IMFTransform ::P rocessinput devient IMFTransform :: MFTProcessInput, tandis que IMediaObject ::P rocessinput conserve son nom d’origine. cette technique est particulièrement utile si vous convertissez un DMO existant en DMO hybride/MFT. vous pouvez ajouter les nouvelles méthodes MFT sans modifier les méthodes de DMO.

Solution 2 : utilisez la syntaxe C++ pour lever l’ambiguïté des noms hérités de plusieurs interfaces. Par exemple, déclarez la version MFT de ProcessInput comme suit :

CMyHybridObject::IMFTransform::ProcessInput(...)

déclarez la version DMO de ProcessInput comme suit :

CMyHybridObject::IMediaObject::ProcessInput(...)

Si vous effectuez un appel interne à une méthode dans l’objet, vous pouvez utiliser cette syntaxe, mais cela remplace l’État virtuel de la méthode. Un meilleur moyen d’effectuer des appels à partir de l’objet est le suivant :

hr = ((IMediaObject*)this)->ProcessInput(...)

Ainsi, si vous dérivez une autre classe de CMyHybridObject et que vous remplacez la méthode CMyHybridObject :: IMediaObject ::P rocessinput, la méthode virtuelle appropriée est appelée. les interfaces DMO sont documentées dans la documentation du kit de développement logiciel (SDK) DirectShow.

Transformations de Media Foundation