Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
- Formatverhandlung
- Streaming-
- Verschiedene Unterschiede
- Flags
- Fehlercodes
- Erstellen von hybriden DMO/MFT-Objekten
- Verwandte Themen
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:
- IMFTransform::AddInputStreams
- IMFTransform::D eleteInputStream-
- IMFTransform::GetStreamIDs
- IMFTransform::GetStreamLimits
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.
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.
Für die folgenden DMO-Methoden gibt es keine MFT-Entsprechungen:
MFTs sind nicht erforderlich, um aggregation zu unterstützen.
MFTs unterstützen einen Vorgang namens Entwässerung. Der Zweck der Entwässerung besteht darin, alle Daten zu verarbeiten, die im MF verbleiben, ohne mehr Eingabedaten für die MFT bereitzustellen (z. B. am Ende des Datenstroms). Um eine MFT zu entwässern, rufen Sie IMFTransform::P rocessMessage- mit der MFT_MESSAGE_COMMAND_DRAIN Nachricht auf. Weitere Informationen finden Sie unter Basic MFT Processing Model.
MFTs können Attribute aufweisen, einschließlich Datenstromattributen. Verwenden Sie die folgenden Methoden, um die Attribute aus einem MFT abzurufen:
MFTs können Ereignisse verarbeiten. Zum Senden eines Ereignisses an eine MFT rufen Sie IMFTransform::P rocessEventauf. Ein MFT kann ein Ereignis über die ProcessOutput--Methode an den Client senden. Weitere Informationen finden Sie unter Basic MFT Processing Model.
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.
Verwandte Themen