次の方法で共有


MFT と DNO の比較

Media Foundation 変換 (MFT) は、DirectX Media Objects (DMO) で最初に導入された変換モデルの進化です。 このトピックでは、MFT が DNO と異なる主な方法をまとめます。 既に DMO インターフェイスに慣れている場合、または既存の DMO を MFT に変換する場合は、このトピックをお読みください。

このトピックには、次のセクションが含まれています。

ストリームの数

DMO には固定数のストリームが含まれますが、MFT では動的な数のストリームをサポートできます。 クライアントは入力ストリームを追加でき、MFT は処理中に新しい出力ストリームを追加できます。 ただし、動的ストリームをサポートするために MFT は必要ありません。 MFT には、DMO と同様に、固定数のストリームを含めることができます。

MFT で動的ストリームをサポートするには、次のメソッドを使用します。

さらに、IMFTransform::P rocessOutput メソッドは、出力ストリームを追加または削除するための動作を定義します。

DMO には固定ストリームがあるため、DMO 上のストリームは 0 から始まるインデックス値を使用して識別されます。 一方、MFT では、必ずしもインデックス値に対応していないストリーム識別子を使用します。 これは、MFT 上のストリームの数が変わる可能性があるためです。 たとえば、ストリーム 0 は削除され、ストリーム 1 は最初のストリームとして残ります。 ただし、固定数のストリームを持つ MFT では、DMO と同じ規則を遵守し、ストリーム識別子にインデックス値を使用する必要があります。

フォーマット ネゴシエーション

MFT は、IMFMediaType インターフェイスを使用して、メディアの種類を記述します。 それ以外の場合、MFT とのフォーマット ネゴシエーションは、DNO と同じ基本原則で動作します。 次の表に、DNO のフォーマット ネゴシエーション メソッドと、MFT の対応するメソッドを示します。

DMO メソッド 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

 

ストリーミング

DNO と同様に、MFT は ProcessInputおよび ProcessOutput メソッド呼び出しを通じてデータを処理します。 データをストリーミングするときの DMO プロセスと MFT プロセスの主な違いを次に示します。

リソースの割り当て

MFT には、IMediaObject::AllocateStreamingResources および IMediaObject::FreeStreamingResources メソッドが DDO で使用されていません。 リソースの割り当てと割り当ての解除を効率的に処理するために、MFT は IMFTransform::P rocessMessage メソッドで次のメッセージに応答できます。

さらに、クライアントは、次のメッセージで ProcessMessage を呼び出すことによって、ストリームの開始と終了を通知できます。

これら 2 つのメッセージには、完全に同等の DMO はありません。

データの処理

MFT では、メディア サンプルを使用して入力データと出力データを保持します。 メディア サンプルは、IMFSample インターフェイスを公開し、次のデータを含みます。

  • タイム スタンプと期間。
  • サンプルごとの情報を含む属性。 属性の一覧については、「サンプル属性の」を参照してください。
  • 0 個以上のメディア バッファー。 各メディア バッファーは、IMFMediaBuffer インターフェイスを公開します。

IMFMediaBuffer インターフェイスは、DMO IMediaBuffer インターフェイスに似ています。 基になるメモリ バッファーにアクセスするには、IMFMediaBuffer::Lock呼び出します。 このメソッドは、DNO IMediaBuffer::GetBufferAndLength とほぼ同じです。

圧縮されていないビデオ データの場合、メディア バッファーは、IMF2DBuffer インターフェイスもサポートする場合があります。 非圧縮ビデオ (入力または出力) を処理する MFT は、バッファーで公開されている場合は、IMF2DBuffer インターフェイスを使用するように準備する必要があります。 詳細については、「圧縮されていないビデオ バッファーの」を参照してください。

Media Foundation には、IMFMediaBufferの標準的な実装がいくつか用意されているため、通常は独自の実装を記述する必要はありません。 Media Foundation バッファーから DMO バッファーを作成するには、MFCreateLegacyMediaBufferOnMFMediaBuffer呼び出します。

すいせん

MFT には、Flush メソッドがありません。 MFT をフラッシュするには、MFT_MESSAGE_COMMAND_FLUSH メッセージ 使用して IMFTransform::P rocessMessage を呼び出します。

ストリームの不連続性

MFT には、の不連続性 メソッドがありません。 ストリームの不連続性を通知するには、入力サンプルに MFSampleExtension_Discontinuity 属性を設定します。

その他の相違点

次に、MFT と DMT の小さな違いをいくつか示します。

  • 次の DMO メソッドに相当する MFT はありません。

  • 集計をサポートするために MFT は必要ありません。

  • MFT は、のドレインと呼ばれる操作をサポートします。 ドレインの目的は、MFT にそれ以上入力データを提供せずに (ストリームの最後など) MF に残っているデータを処理することです。 MFT をドレインするには、MFT_MESSAGE_COMMAND_DRAIN メッセージ 使用して IMFTransform::P rocessMessage を呼び出します。 詳細については、「基本的な MFT 処理モデル を参照してください。

  • MFT には、ストリームごとの属性を含む属性を含めることができます。 MFT から属性を取得するには、次のメソッドを使用します。

  • MFT はイベントを処理できます。 MFT にイベントを送信するには、IMFTransform::P rocessEvent呼び出します。 MFT は、ProcessOutput メソッドを使用してクライアントにイベントを送信できます。 詳細については、「基本的な MFT 処理モデル を参照してください。

フラグ

次の表に、さまざまな DMO フラグとその MFT に相当するフラグを示します。 DMO フラグが MFT フラグに直接マップされるたびに、両方のフラグの数値が同じになります。 ただし、一部の DMO フラグには、正確な MFT に相当するものはありません。その逆も同様です。

ProcessInput フラグ

DNO: _DMO_INPUT_DATA_BUFFER_FLAGS 列挙型。

MFT: 同等の列挙型はありません。

DMO フラグ MFT フラグ
DMO_INPUT_DATA_BUFFERF_SYNCPOINT 同等のフラグはありません。 代わりに、サンプルに MFSampleExtension_CleanPoint 属性を設定します。
DMO_INPUT_DATA_BUFFERF_TIME 同等のフラグはありません。 代わりに、サンプル IMFSample::SetSampleTime を呼び出します。
DMO_INPUT_DATA_BUFFERF_TIMELENGTH 同等のフラグはありません。 代わりに、サンプル IMFSample::SetSampleDuration を呼び出します。

 

ProcessOutput フラグ

DNO: _DMO_PROCESS_OUTPUT_FLAGS 列挙型。

MFT: _MFT_PROCESS_OUTPUT_FLAGS 列挙型。

DMO フラグ MFT フラグ
DMO_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER MFT_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER

 

DNO: _DMO_OUTPUT_DATA_BUFFER_FLAGS 列挙。

MFT: _MFT_OUTPUT_DATA_BUFFER_FLAGS 列挙型。

DMO フラグ MFT フラグ
DMO_OUTPUT_DATA_BUFFERF_SYNCPOINT 同等のフラグはありません。 代わりに、サンプルの MFSampleExtension_CleanPoint 属性を確認してください。
DMO_OUTPUT_DATA_BUFFERF_TIME 同等のフラグはありません。 代わりに、サンプル IMFSample::GetSampleTime を呼び出します。
DMO_OUTPUT_DATA_BUFFERF_TIMELENGTH 同等のフラグはありません。 代わりに、サンプル IMFSample::GetSampleDuration を呼び出します。
DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE MFT_OUTPUT_DATA_BUFFER_INCOMPLETE
同等のフラグはありません。 MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE
同等のフラグはありません。 MFT_OUTPUT_DATA_BUFFER_STREAM_END
同等のフラグはありません。 MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE

 

GetInputStatus フラグ

DNO: _DMO_INPUT_STATUS_FLAGS 列挙型。

MFT: _MFT_INPUT_STATUS_FLAGS 列挙型。

DMO フラグ MFT フラグ
DMO_INPUT_STATUSF_ACCEPT_DATA MFT_INPUT_STATUS_ACCEPT_DATA

 

GetOutputStatus フラグ

DNO: 同等の列挙型はありません。

MFT: _MFT_OUTPUT_STATUS_FLAGS 列挙型。

DMO フラグ MFT フラグ
同等のフラグはありません。 MFT_OUTPUT_STATUS_SAMPLE_READY

 

GetInputStreamInfo フラグ

DNO: _DMO_INPUT_STREAM_INFO_FLAGS 列挙型。

MFT: _MFT_INPUT_STREAM_INFO_FLAGS 列挙型。

DMO フラグ 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
同等のフラグはありません。 MFT_INPUT_STREAM_DOES_NOT_ADDREF
同等のフラグはありません。 MFT_INPUT_STREAM_REMOVABLE
同等のフラグはありません。 MFT_INPUT_STREAM_OPTIONAL

 

GetOutputStreamInfo フラグ

DNO: _DMO_OUTPUT_STREAM_INFO_FLAGS 列挙型。

MFT: _MFT_OUTPUT_STREAM_INFO_FLAGS 列挙型。

DMO フラグ 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
同等のフラグはありません。 MFT_OUTPUT_STREAM_PROVIDES_SAMPLES
同等のフラグはありません。 MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES
同等のフラグはありません。 MFT_OUTPUT_STREAM_LAZY_READ
同等のフラグはありません。 MFT_OUTPUT_STREAM_REMOVABLE

 

SetInputType/SetOutputType フラグ

DNO: _DMO_SET_TYPE_FLAGS 列挙型。

MFT: _MFT_SET_TYPE_FLAGS 列挙型。

DMO フラグ MFT フラグ
DMO_SET_TYPEF_TEST_ONLY MFT_SET_TYPE_TEST_ONLY
DMO_SET_TYPEF_CLEAR 同等のフラグはありません。 代わりに、メディアの種類を NULL に設定して、メディアの種類をクリアします。

 

エラー コード

次の表は、DMO エラー コードを MFT エラー コードにマップする方法を示しています。 ハイブリッド MFT/DMO オブジェクトは、IMediaObject メソッドの DMO エラー コードと、IMFTransformメソッドからの MFT エラー コード返す必要があります。 DMO エラー コードは、ヘッダー ファイル MediaErr.h で定義されています。 MFT エラー コードは、ヘッダー ファイル mferror.h で定義されています。

DMO エラー コード 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

 

ハイブリッド DMO/MFT オブジェクトの作成

IMFTransform インターフェイスは、DirectX Media Objects (DNO) の主要なインターフェイスである IMediaObjectに大まかに基づいています。 両方のインターフェイスを公開するオブジェクトを作成できます。 ただし、インターフェイスには同じ名前を共有するいくつかのメソッドがあるため、名前の競合が発生する可能性があります。 この問題は、次の 2 つの方法のいずれかで解決できます。

解決策 1: MFT 関数を含む.cpp ファイルの先頭に次の行を含めます。

#define MFT_UNIQUE_METHOD_NAMES

これにより、IMFTransform インターフェイスの宣言が変更され、ほとんどのメソッド名の前に "MFT" が付けられます。 したがって、IMFTransform::P rocessInputは IMFTransform::MFTProcessInput になりますが、IMediaObject::P rocessInputは元の名前を保持します。 この手法は、既存の DMO をハイブリッド DMO/MFT に変換する場合に最も役立ちます。 DMO メソッドを変更せずに、新しい MFT メソッドを追加できます。

解決策 2: C++ 構文を使用して、複数のインターフェイスから継承された名前を明確にします。 たとえば、次のように、ProcessInput の MFT バージョンを宣言します。

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

次のように、ProcessInput の DMO バージョンを宣言します。

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

オブジェクト内のメソッドを内部呼び出す場合は、この構文を使用できますが、これを行うと、メソッドの仮想状態がオーバーライドされます。 オブジェクト内から呼び出しを行うより良い方法は次のとおりです。

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

そうすることで、CMyHybridObject から別のクラスを派生させ、CMyHybridObject::IMediaObject::P rocessInput メソッドをオーバーライドすると、正しい仮想メソッドが呼び出されます。 DMO インターフェイスについては、DirectShow SDK のドキュメントを参照してください。

Media Foundation Transforms