Freigeben über


Vergleich von MFTs und DMOs

Media Foundation-Transformationen (MFTs) sind eine Weiterentwicklung des Transformationsmodells, das mit DirectX Media Objects (DMOs) eingeführt wurde. In diesem Thema werden die wichtigsten Möglichkeiten zusammengefasst, in denen MFTs sich von DMOs unterscheiden. Lesen Sie dieses Thema, wenn Sie bereits mit den DMO-Schnittstellen vertraut sind oder wenn Sie ein vorhandenes DMO in einen MFT konvertieren möchten.

Dieses Thema enthält die folgenden Abschnitte:

Anzahl der Datenströme

Ein DMO verfügt über eine feste Anzahl von Datenströmen, während ein MFT eine dynamische Anzahl von Datenströmen unterstützen kann. Der Client kann Eingabedatenströme hinzufügen, und MFT kann während der Verarbeitung neue Ausgabedatenströme hinzufügen. MFTs sind jedoch nicht erforderlich, um dynamische Datenströme zu unterstützen. Ein MFT kann eine feste Anzahl von Datenströmen aufweisen, genau wie ein DMO.

Die folgenden Methoden werden verwendet, um dynamische Datenströme in einem MFT zu unterstützen:

Darüber hinaus definiert die IMFTransform::P rocessOutput Methode das Verhalten zum Hinzufügen oder Entfernen von Ausgabedatenströmen.

Da DMOs feste Datenströme aufweisen, werden die Datenströme in einem DMO mithilfe von nullbasierten Indexwerten identifiziert. MFTs verwenden andererseits Datenstrombezeichner, die nicht notwendigerweise indexwerten entsprechen. Dies liegt daran, dass sich die Anzahl der Datenströme in einem MFT ändern kann. Beispielsweise kann Stream 0 entfernt werden, sodass Stream 1 als erster Datenstrom verlassen wird. Ein MFT mit einer festen Anzahl von Datenströmen sollte jedoch dieselbe Konvention wie DMOs aufweisen und Indexwerte für Datenstrombezeichner verwenden.

Aushandlung formatieren

MFTs verwenden die IMFMediaType Schnittstelle, um Medientypen zu beschreiben. Andernfalls funktioniert die Formatverhandlung mit MFTs mit den gleichen Grundprinzipien wie bei DMOs. In der folgenden Tabelle sind die Format-Aushandlungsmethoden für DMOs und die entsprechenden Methoden für MFTs aufgeführt.

DMO-Methode MFT-Methode
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

 

Strömend

Wie DMOs verarbeiten MFTs Daten über Aufrufe von ProcessInput- und ProcessOutput- Methoden. Hier sind die wichtigsten Unterschiede zwischen DMO- und MFT-Prozessen beim Streamen von Daten.

Zuweisung von Ressourcen

MFTs verfügen nicht über die IMediaObject::AllocateStreamingResources und IMediaObject::FreeStreamingResources Methoden, die mit DMOs verwendet werden. Um die Zuordnung und Zuordnung von Ressourcen effizient zu verarbeiten, kann ein MFT auf die folgenden Nachrichten in der IMFTransform::P rocessMessage-Methode reagieren:

Darüber hinaus kann der Client den Start und das Ende eines Datenstroms signalisieren, indem ProcessMessage- mit den folgenden Nachrichten aufgerufen wird:

Diese beiden Nachrichten haben keine exakte DMO-Entsprechung.

Verarbeiten von Daten

MFTs verwenden Medienbeispiele, um Eingabe- und Ausgabedaten aufzunehmen. Medienbeispiele machen die IMFSample Schnittstelle verfügbar und enthalten die folgenden Daten:

  • Zeitstempel und Dauer.
  • Attribute, die Pro-Beispiel-Informationen enthalten. Eine Liste der Attribute finden Sie unter Beispielattribute.
  • Null oder mehr Medienpuffer. Jeder Medienpuffer macht die IMFMediaBuffer Schnittstelle verfügbar.

Die IMFMediaBuffer Schnittstelle ähnelt der DMO IMediaBuffer Schnittstelle. Rufen Sie IMFMediaBuffer::Lockauf, um auf den zugrunde liegenden Speicherpuffer zuzugreifen. Diese Methode entspricht ungefähr IMediaBuffer::GetBufferAndLength für DMOs.

Bei nicht komprimierten Videodaten unterstützt ein Medienpuffer möglicherweise auch die IMF2DBuffer- Schnittstelle. Ein MFT, das unkomprimierte Videos verarbeitet (entweder als Eingabe oder Ausgabe), sollte darauf vorbereitet sein, die IMF2DBuffer Schnittstelle zu verwenden, wenn der Puffer sie verfügbar macht. Weitere Informationen finden Sie unter nicht komprimierten Videopuffer.

Media Foundation stellt einige Standardimplementierungen von IMFMediaBufferbereit, daher ist es in der Regel nicht notwendig, ihre eigene Implementierung zu schreiben. Rufen Sie MFCreateLegacyMediaBufferOnMFMediaBufferauf, um einen DMO-Puffer aus einem Media Foundation-Puffer zu erstellen.

Spülung

MFTs verfügen nicht über eine Flush-Methode. Zum Leeren eines MFT rufen Sie IMFTransform::P rocessMessage- mit der MFT_MESSAGE_COMMAND_FLUSH Nachricht auf.

Stream-Unterbrechungen

MFTs verfügen nicht über eine Einstellung Methode. Um eine Einstellung in einem Datenstrom zu signalisieren, legen Sie das attribut MFSampleExtension_Discontinuity für das Eingabebeispiel fest.

Verschiedene Unterschiede

Hier sind einige zusätzliche geringfügige Unterschiede zwischen MFTs und DMOs.

Flaggen

In den folgenden Tabellen sind die verschiedenen DMO-Flags und ihre MFT-Entsprechungen aufgeführt. Wenn ein DMO-Flag direkt einem MFT-Flag zugeordnet wird, weisen beide Flags denselben numerischen Wert auf. Einige DMO-Flags verfügen jedoch nicht über genaue MFT-Entsprechungen und umgekehrt.

ProcessInput-Flags

DMOs: _DMO_INPUT_DATA_BUFFER_FLAGS Enumeration.

MFTs: Keine entsprechende Aufzählung.

DMO-Kennzeichnung MFT-Kennzeichnung
DMO_INPUT_DATA_BUFFERF_SYNCPOINT Keine entsprechungskennzeichnung. Legen Sie stattdessen das attribut MFSampleExtension_CleanPoint für das Beispiel fest.
DMO_INPUT_DATA_BUFFERF_TIME Keine entsprechungskennzeichnung. Rufen Sie stattdessen IMFSample::SetSampleTime- für das Beispiel auf.
DMO_INPUT_DATA_BUFFERF_TIMELENGTH Keine entsprechungskennzeichnung. Rufen Sie stattdessen IMFSample::SetSampleDuration für das Beispiel auf.

 

ProcessOutput-Flags

DMOs: _DMO_PROCESS_OUTPUT_FLAGS Enumeration.

MFTs: _MFT_PROCESS_OUTPUT_FLAGS Enumeration.

DMO-Kennzeichnung MFT-Kennzeichnung
DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER MFT_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER

 

DMOs: _DMO_OUTPUT_DATA_BUFFER_FLAGS Enumeration.

MFTs: _MFT_OUTPUT_DATA_BUFFER_FLAGS Enumeration.

DMO-Kennzeichnung MFT-Kennzeichnung
DMO_OUTPUT_DATA_BUFFERF_SYNCPOINT Keine entsprechungskennzeichnung. Überprüfen Sie stattdessen das attribut MFSampleExtension_CleanPoint für das Beispiel.
DMO_OUTPUT_DATA_BUFFERF_TIME Keine entsprechungskennzeichnung. Rufen Sie stattdessen IMFSample::GetSampleTime- für das Beispiel auf.
DMO_OUTPUT_DATA_BUFFERF_TIMELENGTH Keine entsprechungskennzeichnung. Rufen Sie stattdessen IMFSample::GetSampleDuration für das Beispiel auf.
DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE MFT_OUTPUT_DATA_BUFFER_INCOMPLETE
Keine entsprechungskennzeichnung. MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE
Keine entsprechungskennzeichnung. MFT_OUTPUT_DATA_BUFFER_STREAM_END
Keine entsprechungskennzeichnung. MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE

 

GetInputStatus-Flags

DMOs: _DMO_INPUT_STATUS_FLAGS Enumeration.

MFTs: _MFT_INPUT_STATUS_FLAGS Enumeration.

DMO-Kennzeichnung MFT-Kennzeichnung
DMO_INPUT_STATUSF_ACCEPT_DATA MFT_INPUT_STATUS_ACCEPT_DATA

 

GetOutputStatus-Flags

DMOs: Keine entsprechende Aufzählung.

MFTs: _MFT_OUTPUT_STATUS_FLAGS Enumeration.

DMO-Kennzeichnung MFT-Kennzeichnung
Keine entsprechungskennzeichnung. MFT_OUTPUT_STATUS_SAMPLE_READY

 

GetInputStreamInfo-Flags

DMOs: _DMO_INPUT_STREAM_INFO_FLAGS Enumeration.

MFTs: _MFT_INPUT_STREAM_INFO_FLAGS Enumeration.

DMO-Kennzeichnung MFT-Kennzeichnung
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
Keine entsprechungskennzeichnung. MFT_INPUT_STREAM_DOES_NOT_ADDREF
Keine entsprechungskennzeichnung. MFT_INPUT_STREAM_REMOVABLE
Keine entsprechungskennzeichnung. MFT_INPUT_STREAM_OPTIONAL

 

GetOutputStreamInfo-Flags

DMOs: _DMO_OUTPUT_STREAM_INFO_FLAGS Enumeration.

MFTs: _MFT_OUTPUT_STREAM_INFO_FLAGS Enumeration.

DMO-Kennzeichnung MFT-Kennzeichnung
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
Keine entsprechungskennzeichnung. MFT_OUTPUT_STREAM_PROVIDES_SAMPLES
Keine entsprechungskennzeichnung. MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES
Keine entsprechungskennzeichnung. MFT_OUTPUT_STREAM_LAZY_READ
Keine entsprechungskennzeichnung. MFT_OUTPUT_STREAM_REMOVABLE

 

SetInputType/SetOutputType-Flags

DMOs: _DMO_SET_TYPE_FLAGS Enumeration.

MFTs: _MFT_SET_TYPE_FLAGS Enumeration.

DMO-Kennzeichnung MFT-Kennzeichnung
DMO_SET_TYPEF_TEST_ONLY MFT_SET_TYPE_TEST_ONLY
DMO_SET_TYPEF_CLEAR Keine entsprechungskennzeichnung. Legen Sie stattdessen den Medientyp auf NULL- fest, um den Medientyp zu löschen.

 

Fehlercodes

In der folgenden Tabelle wird gezeigt, wie DMO-Fehlercodes MFT-Fehlercodes zugeordnet werden. Ein hybrides MFT/DMO-Objekt sollte die DMO-Fehlercodes aus IMediaObject- Methoden und den MFT-Fehlercodes aus IMFTransform--Methoden zurückgeben. Die DMO-Fehlercodes werden in der Headerdatei MediaErr.h definiert. Die MFT-Fehlercodes werden in der Headerdatei mferror.h definiert.

DMO-Fehlercode MFT-Fehlercode
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

 

Erstellen von Hybrid-DMO/MFT-Objekten

Die IMFTransform- Schnittstelle basiert lose auf IMediaObject, die primäre Schnittstelle für DirectX Media Objects (DMOs). Es ist möglich, Objekte zu erstellen, die beide Schnittstellen verfügbar machen. Dies kann jedoch zu Namenskonflikten führen, da die Schnittstellen einige Methoden haben, die denselben Namen aufweisen. Sie können dieses Problem auf eine von zwei Arten lösen:

Lösung 1: Fügen Sie die folgende Zeile oben in eine beliebige .cpp Datei ein, die MFT-Funktionen enthält:

#define MFT_UNIQUE_METHOD_NAMES

Dadurch wird die Deklaration der IMFTransform- Schnittstelle so geändert, dass den meisten Methodennamen "MFT" vorangestellt wird. Daher wird IMFTransform::P rocessInputIMFTransform::MFTProcessInput, während IMediaObject::P rocessInput ihren ursprünglichen Namen behält. Diese Technik ist am nützlichsten, wenn Sie ein vorhandenes DMO in eine Hybrid-DMO/MFT konvertieren. Sie können die neuen MFT-Methoden hinzufügen, ohne die DMO-Methoden zu ändern.

Lösung 2: Verwenden Sie C++-Syntax, um Mehrdeutigkeiten von Namen zu unterscheiden, die von mehreren Schnittstellen geerbt werden. Deklarieren Sie beispielsweise die MFT-Version von ProcessInput wie folgt:

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

Deklarieren Sie die DMO-Version von ProcessInput- wie folgt:

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

Wenn Sie einen internen Aufruf einer Methode innerhalb des Objekts ausführen, können Sie diese Syntax verwenden, aber dadurch wird der virtuelle Status der Methode außer Kraft setzen. Eine bessere Möglichkeit zum Tätigen von Aufrufen innerhalb des Objekts ist folgendes:

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

Wenn Sie eine andere Klasse von CMyHybridObject ableiten und das CMyHybridObject::IMediaObject::P rocessInput-Methode außer Kraft setzen, wird die richtige virtuelle Methode aufgerufen. Die DMO-Schnittstellen sind in der DirectShow SDK-Dokumentation dokumentiert.

Media Foundation Transforms