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
- Négociation de format
- Streaming
- Différences diverses
- Indicateurs
- Codes d’erreur
- Création d’objets DMO/MFT hybrides
- Rubriques connexes
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 :
- IMFTransform::AddInputStreams
- IMFTransform::D eleteInputStream
- IMFTransform::GetStreamIDs
- IMFTransform::GetStreamLimits
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.
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.
Il n’existe aucun équivalent MFT pour les méthodes DMO suivantes :
Les mft ne sont pas nécessaires pour prendre en charge l’agrégation.
Les mft prennent en charge une opération appelée vidage. L’objectif du drainage est de traiter toutes les données qui restent dans le mf, sans fournir de données d’entrée supplémentaires au MFT (par exemple, à la fin du flux). Pour vider un MFT, appelez IMFTransform::P rocessMessage avec le message MFT_MESSAGE_COMMAND_DRAIN . Pour plus d’informations, consultez Modèle de traitement MFT de base.
Les mft peuvent avoir des attributs, y compris des attributs par flux. Utilisez les méthodes suivantes pour obtenir les attributs d’un MFT :
Les mfts peuvent traiter des événements. Pour envoyer un événement à un MFT, appelez IMFTransform::P rocessEvent. Un MFT peut envoyer un événement au client via la méthode ProcessOutput . Pour plus d’informations, consultez Modèle de traitement MFT de base.
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.
Rubriques connexes