Comparaison entre MFT et DMO

Les transformations Media Foundation (MFT) sont une évolution du modèle de transformation introduit pour la première fois avec DirectX Media Objects (DMO). Cette rubrique récapitule les main différences entre les MFM et les DMO. 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, tandis qu’un MFT peut prendre en charge un nombre dynamique de flux. Le client peut ajouter des flux d’entrée, et MFT peut ajouter de nouveaux flux de sortie pendant le traitement. Toutefois, les mft ne sont pas nécessaires pour prendre en charge les flux dynamiques. Un MFT peut avoir un nombre fixe de flux, tout comme un DMO.

Les méthodes suivantes sont utilisées pour prendre en charge les flux dynamiques sur un 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 DMO ont des flux fixes, les flux d’un DMO sont identifiés à l’aide de valeurs d’index de base zéro. Les MFT, en revanche, utilisent 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 un MFT peut changer. Par exemple, le flux 0 peut être supprimé, laissant le flux 1 comme premier flux. Toutefois, un MFT avec un nombre fixe de flux doit respecter la même convention que les DMO et utiliser des valeurs d’index pour les identificateurs de flux.

Négociation de format

Les MFM utilisent l’interface IMFMediaType pour décrire les types de médias. Sinon, la négociation de format avec des MFT fonctionne selon les mêmes principes de base qu’avec les DMO. Le tableau suivant répertorie les méthodes de négociation de format pour les DMO et les méthodes correspondantes pour les MFT.

Méthode DMO Méthode MFT
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 les DMO, les MFT traitent les données par le biais d’appels aux méthodes ProcessInput et ProcessOutput . Voici les principales différences entre les processus DMO et MFT lors de la diffusion en continu de données.

Allocation de ressources

Les MFT n’ont pas les méthodes IMediaObject::AllocateStreamingResources et IMediaObject::FreeStreamingResources utilisées avec les DMO. Pour gérer efficacement l’allocation et la désallocation des ressources, un 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

Les mft utilisent des exemples de média pour stocker les données d’entrée et de sortie. Les exemples de médias 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 ou plusieurs mémoires tampons de média. Chaque mémoire tampon multimé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 les DMO.

Pour les données vidéo non compressées, une mémoire tampon multimédia peut également prendre en charge l’interface IMF2DBuffer . Un MFT qui traite la vidéo non compressée (en tant qu’entrée ou sortie) doit être prêt à 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 donc généralement pas nécessaire d’écrire votre propre implémentation. Pour créer une mémoire tampon DMO à partir d’une mémoire tampon Media Foundation, appelez MFCreateLegacyMediaBufferOnMFMediaBuffer.

Rinçage

Les MFT n’ont pas de méthode Flush . Pour vider un MFT, appelez IMFTransform::P rocessMessage avec le message MFT_MESSAGE_COMMAND_FLUSH .

Discontinuités de flux

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

Différences diverses

Voici quelques différences mineures supplémentaires entre les MFM et les DMO.

Indicateurs

Les tableaux suivants répertorient les différents indicateurs DMO et leurs équivalents MFT. Chaque fois qu’un indicateur DMO est mappé directement à un indicateur MFT, les deux indicateurs ont la même valeur numérique. Toutefois, certains indicateurs DMO n’ont pas d’équivalents MFT exacts, et inversement.

Indicateurs ProcessInput

DMOs : énumération _DMO_INPUT_DATA_BUFFER_FLAGS .

MFT : aucune énumération équivalente.

Indicateur DMO Indicateur MFT
DMO_INPUT_DATA_BUFFERF_SYNCPOINT Aucun indicateur équivalent. Au lieu de cela, définissez l’attribut MFSampleExtension_CleanPoint sur l’exemple.
DMO_INPUT_DATA_BUFFERF_TIME Aucun indicateur équivalent. Au lieu de cela, appelez IMFSample::SetSampleTime sur l’exemple.
DMO_INPUT_DATA_BUFFERF_TIMELENGTH Aucun indicateur équivalent. Au lieu de cela, appelez IMFSample::SetSampleDuration dans l’exemple.

 

Indicateurs ProcessOutput

DMOs : énumération _DMO_PROCESS_OUTPUT_FLAGS .

MFTs : énumération _MFT_PROCESS_OUTPUT_FLAGS .

Indicateur DMO Indicateur MFT
DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER MFT_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER

 

DMOs : énumération _DMO_OUTPUT_DATA_BUFFER_FLAGS .

MFT : énumération _MFT_OUTPUT_DATA_BUFFER_FLAGS .

Indicateur DMO Indicateur MFT
DMO_OUTPUT_DATA_BUFFERF_SYNCPOINT Aucun indicateur équivalent. Au lieu de cela, case activée pour l’attribut MFSampleExtension_CleanPoint sur l’exemple.
DMO_OUTPUT_DATA_BUFFERF_TIME Aucun indicateur équivalent. Au lieu de cela, appelez IMFSample::GetSampleTime sur l’exemple.
DMO_OUTPUT_DATA_BUFFERF_TIMELENGTH Aucun indicateur équivalent. Au lieu de cela, appelez IMFSample::GetSampleDuration sur l’exemple.
DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE MFT_OUTPUT_DATA_BUFFER_INCOMPLETE
Aucun indicateur équivalent. MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE
Aucun indicateur équivalent. MFT_OUTPUT_DATA_BUFFER_STREAM_END
Aucun indicateur équivalent. MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE

 

Indicateurs GetInputStatus

DMOs : énumération _DMO_INPUT_STATUS_FLAGS .

MFTs : énumération _MFT_INPUT_STATUS_FLAGS .

Indicateur DMO Indicateur MFT
DMO_INPUT_STATUSF_ACCEPT_DATA MFT_INPUT_STATUS_ACCEPT_DATA

 

Indicateurs GetOutputStatus

DMO : aucune énumération équivalente.

MFTs : énumération _MFT_OUTPUT_STATUS_FLAGS .

Indicateur DMO Indicateur MFT
Aucun indicateur équivalent. MFT_OUTPUT_STATUS_SAMPLE_READY

 

Indicateurs GetInputStreamInfo

DMO : énumération _DMO_INPUT_STREAM_INFO_FLAGS .

MFTs : énumération _MFT_INPUT_STREAM_INFO_FLAGS .

Indicateur DMO Indicateur MFT
DMO_INPUT_STREAMF_WHOLE_SAMPLES MFT_INPUT_STREAM_WHOLE_SAMPLES
DMO_INPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER MFT_INPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER
DMO_INPUT_STREAMF_FIXED_SAMPLE_SIZE MFT_INPUT_STREAM_FIXED_SAMPLE_SIZE
DMO_INPUT_STREAMF_HOLDS_BUFFERS MFT_INPUT_STREAM_HOLDS_BUFFERS
Aucun indicateur équivalent. MFT_INPUT_STREAM_DOES_NOT_ADDREF
Aucun indicateur équivalent. MFT_INPUT_STREAM_REMOVABLE
Aucun indicateur équivalent. MFT_INPUT_STREAM_OPTIONAL

 

Indicateurs GetOutputStreamInfo

DMOs : énumération _DMO_OUTPUT_STREAM_INFO_FLAGS .

MFTs : énumération _MFT_OUTPUT_STREAM_INFO_FLAGS .

Indicateur DMO Indicateur MFT
DMO_OUTPUT_STREAMF_WHOLE_SAMPLES MFT_OUTPUT_STREAM_WHOLE_SAMPLES
DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER
DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE
DMO_OUTPUT_STREAMF_DISCARDABLE MFT_OUTPUT_STREAM_DISCARDABLE
DMO_OUTPUT_STREAMF_OPTIONAL MFT_OUTPUT_STREAM_OPTIONAL
Aucun indicateur équivalent. MFT_OUTPUT_STREAM_PROVIDES_SAMPLES
Aucun indicateur équivalent. MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES
Aucun indicateur équivalent. MFT_OUTPUT_STREAM_LAZY_READ
Aucun indicateur équivalent. MFT_OUTPUT_STREAM_REMOVABLE

 

Indicateurs SetInputType/SetOutputType

DMOs : énumération _DMO_SET_TYPE_FLAGS .

MFT : énumération _MFT_SET_TYPE_FLAGS .

Indicateur DMO Indicateur MFT
DMO_SET_TYPEF_TEST_ONLY MFT_SET_TYPE_TEST_ONLY
DMO_SET_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 les codes d’erreur DMO aux codes d’erreur MFT. Un objet MFT/DMO hybride doit retourner les codes d’erreur DMO 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_E_INVALIDTYPE MF_E_INVALIDTYPE
DMO_E_INVALIDSTREAMINDEX MF_E_INVALIDSTREAMNUMBER
DMO_E_NOTACCEPTING MF_E_NOTACCEPTING
DMO_E_NO_MORE_ITEMS MF_E_NO_MORE_TYPES
DMO_E_TYPE_NOT_ACCEPTED MF_E_INVALIDMEDIATYPE
DMO_E_TYPE_NOT_SET MF_E_TRANSFORM_TYPE_NOT_SET

 

Création d’objets DMO/MFT hybrides

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

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 afin que la plupart des noms de méthode soient précédés de « 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/MFT hybride. Vous pouvez ajouter les nouvelles méthodes MFT sans modifier les méthodes DMO.

Solution 2 : utilisez la syntaxe C++ pour lever l’ambiguïté des noms hérités de plusieurs interface. 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 au sein de l’objet, vous pouvez utiliser cette syntaxe, mais cela remplacera la status virtuelle de la méthode. Voici une meilleure façon d’effectuer des appels à partir de l’objet :

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

Ainsi, si vous dérivez une autre classe de CMyHybridObject et 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