Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les transformations Media Foundation (MFT) sont une évolution du modèle de transformation introduit en premier avec les objets de gestion dynamique DirectX Media Objects (DMV). Cette rubrique récapitule les principales façons dont les TPF diffèrent des DMO. Lisez cette rubrique si vous connaissez déjà les interfaces DMO, ou si vous souhaitez convertir un DMO existant en MFT.
Cette rubrique contient les sections suivantes :
- nombre de flux
- format de négociation
- 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 le 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, 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, d’autre part, 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é, en laissant le flux 1 comme premier flux. Toutefois, un MFT avec un nombre fixe de flux doit observer la même convention que les DMO et utiliser des valeurs d’index pour les identificateurs de flux.
Mise en forme de la négociation
Les mfT utilisent l’interface IMFMediaType pour décrire les types de supports. Sinon, la négociation de format avec les MFT fonctionne sur les mêmes principes de base qu’avec les DMV. Le tableau suivant répertorie les méthodes de négociation de format pour les DMV et les méthodes correspondantes pour les TPF.
Streaming
À l’instar des DMO, les MPF traitent les données par le biais d’appels à processInput et méthodes de ProcessOutput. Voici les principales différences entre les processus DMO et MFT lors de la diffusion en continu des données.
Allocation de ressources
Les MFT n’ont pas les méthodes IMediaObject ::AllocateStreamingResources et IMediaObject ::FreeStreamingResources utilisées avec des 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 exactement d’équivalent DMO.
Traitement des données
Les mfT utilisent des exemples multimédias pour contenir les données d’entrée et de sortie. Les exemples multimé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 multimédias. Chaque mémoire tampon multimédia expose l’interface IMFMediaBuffer.
L’interface IMFMediaBuffer est similaire à l’interface DMO IMediaBuffer. Pour accéder à la mémoire tampon sous-jacente, appelez IMFMediaBuffer ::Lock. Cette méthode équivaut approximativement à IMediaBuffer ::GetBufferAndLength pour les objets de gestion de domaine.
Pour les données vidéo non compressées, une mémoire tampon multimédia peut également prendre en charge l’interfaceIMF2DBuffer. Un MFT qui traite une 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 des 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.
Flushing
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 de 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 MMV et les DMV.
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 de drainage. L’objectif du drainage est de traiter toutes les données qui restent dans le MF, sans fournir de données d’entrée 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 mfT 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.
Drapeaux
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 vice versa.
Indicateurs ProcessInput
DMV : énumération _DMO_INPUT_DATA_BUFFER_FLAGS.
MFTs : 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 sur l’exemple. |
Indicateurs ProcessOutput
DMV : énumération _DMO_PROCESS_OUTPUT_FLAGS.
MFT : énumération _MFT_PROCESS_OUTPUT_FLAGS.
Indicateur DMO | Indicateur MFT |
---|---|
DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER | MFT_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER |
DMV : énumération _DMO_OUTPUT_DATA_BUFFER_FLAGS.
MFTs : énumération _MFT_OUTPUT_DATA_BUFFER_FLAGS.
Indicateur DMO | Indicateur MFT |
---|---|
DMO_OUTPUT_DATA_BUFFERF_SYNCPOINT | Aucun indicateur équivalent. Au lieu de cela, recherchez 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
DMV : é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
DMOs : 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
DMV : é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
DMV : é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
DMV : énumération _DMO_SET_TYPE_FLAGS.
MFTs : é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 des codes d’erreur DMO aux codes d’erreur MFT. Un objet MFT/DMO hybride doit retourner les codes d’erreur DMO de méthodes IMediaObject et les codes d’erreur MFT de 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 faiblement 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 nommage, 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 n’importe quel 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 la plus 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 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 au sein de l’objet, vous pouvez utiliser cette syntaxe, mais cela remplace l’état virtuel de la méthode. Une meilleure façon d’effectuer des appels à partir de l’intérieur de l’objet est la suivante :
hr = ((IMediaObject*)this)->ProcessInput(...)
De cette façon, si vous dérivez une autre classe de CMyHybridObject et remplacez la méthode CMyHybridObject ::IMediaObject ::P rocessInput, la méthode virtuelle correcte est appelée. Les interfaces DMO sont documentées dans la documentation du Kit de développement logiciel (SDK) DirectShow.
Rubriques connexes