ハードウェア MFT
手記
このトピックは Windows 7 以降に適用されます。
このトピックでは、ハードウェア エンコーダー、デコーダー、またはデジタル信号プロセッサ (DSP) へのプロキシとして機能する Media Foundation 変換 (MFT) を記述する方法について説明します。
大事な
ハードウェア コーデックが AVStream マルチメディア クラス ドライバーを使用する場合、カスタム MFT は必要ありません。 Media Foundation は、この目的のために AVStream プロキシを提供します。 このトピックの情報は、ハードウェア コーデックが AVStream を使用しない特殊な場合にのみ適用されます。 詳細については、「AVStream でのハードウェア コーデックのサポート」を参照してください。
このトピックには、次のセクションが含まれています。
- 概要
- ハードウェア MFT 属性の
- ハードウェア ハンドシェイク シーケンス の
- データ処理
- ペア デコーダー/エンコーダー
- 関連トピック
紹介
AVStream に基づいていないハードウェア コーデックは、ドライバーのプロキシとして機能する独自の MFT を提供する必要があります。 ハードウェア コーデックには、いくつかの異なる機能ブロックが組み込まれている場合があります。
- エンコーダー
- デコーダ
- フレームのスケーリング/フォーマット変換
これらの各関数は、個別の MFT によって管理する必要があります。 ハードウェア MFT は、汎用の "トランスコーダー" として機能してはなりません。代わりに、エンコード関数をエンコーダー MFT に配置し、デコード関数をデコーダー MFT に配置します。 ハードウェアでフレーム スケーリングとフォーマット変換が提供されている場合は、MFT_CATEGORY_VIDEO_PROCESSOR カテゴリに登録された別のビデオ プロセッサにこれらの関数を配置します。 ハードウェアがフレームのスケーリングまたはフォーマット変換をサポートしていない場合、Media Foundation はソフトウェア ビデオ プロセッサを提供します。
ハードウェア MFT には、次の一般的な要件があります。
- ハードウェア MFT では、非同期 MFTで説明されているように、新しい非同期処理モデルを使用する必要があります。
- ハードウェア MFT は、動的フォーマット変更の に関する説明されているように、動的フォーマットの変更をサポートする必要があります。
ハードウェア MFT 属性
ハードウェア MFT では、属性に関連する次のメソッドを実装する必要があります。
- IMFTransform::GetAttributes: グローバル MFT 属性の属性ストアを返します。
- IMFTransform::GetInputStreamAttributes: 入力ストリームの属性ストアを返します。
- IMFTransform::GetOutputStreamAttributes: 出力ストリームの属性ストアを返します。
MFT を最初に作成するときは、独自のグローバル属性ストア (つまり、GetAttributesによって返される属性ストア) に次の属性を設定する必要があります。
属性 | 形容 |
---|---|
MF_TRANSFORM_ASYNC | TRUE をに設定する必要があります。 MFT が非同期処理を実行することを示します。 |
MFT_ENUM_HARDWARE_URL_Attribute | ハードウェア デバイスのシンボリック リンクが含まれています。 トポロジ ローダーは、この属性の存在を使用して、MFT がハードウェア デバイスを表しているかどうかをテストします。 |
MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE | TRUE をに設定する必要があります。 MFT が動的な形式の変更をサポートしていることを示します。 |
ハードウェア ハンドシェイク シーケンス
2 つの MFT が同じ物理デバイスを表している場合、ハードウェア バスを介して、ハードウェア内でデータを交換できます。 データをシステム メモリにコピーしてからデバイスに戻す必要はありません。
次の図では、"A" と "B" というラベルの付いた MFT は、同じハードウェア内の機能ブロックを表しています。 たとえば、コード変換のシナリオでは、"A" はハードウェア デコーダーを表し、"B" はハードウェア エンコーダーを表す場合があります。 "A" と "B" の間のデータ フローは、ハードウェア内で発生します。 "C" というラベルが付いた MFT は、ソフトウェア MFT です。 "B" から "C" へのデータ フローでは、システム メモリが使用されます。
ハードウェア接続を確立するには、2 つのハードウェア MFT でプライベート通信チャネルを使用する必要があります。 この接続は、フォーマット ネゴシエーション中、メディアの種類が設定される前、および ProcessInputをする最初の呼び出しの前に確立されます。 接続プロセスは次のように動作します。
トポロジ ローダーは、MFT_ENUM_HARDWARE_URL_Attribute 属性が存在する両方の MFT をチェックします。 この属性の値は調べません。
MFT_ENUM_HARDWARE_URL_Attribute が両方の MFT に存在する場合、トポロジ ローダーは次の処理を行います。
- トポロジ ローダーは、アップストリーム MFT (A) IMFTransform::GetOutputStreamAttributes を呼び出します。 このメソッドは、ポインター IMFAttributes 返します。 このポインターを pUpstream 示します。
- トポロジ ローダーは、ダウンストリーム MFT (B) 上 IMFTransform::GetInputStreamAttributes を呼び出します。 この呼び出しは、ポインターIMFAttributes も返します。 このポインターを pDownstream 示します。
- トポロジ ローダーは、IMFAttributes::SetUnknownを呼び出すことによって、pDownstream に MFT_CONNECTED_STREAM_ATTRIBUTE 属性を設定します。 属性の値は、pUpstream ポインター です。
- トポロジ ローダーは、pDownstream と pUpstreamの両方で、MFT_CONNECTED_TO_HW_STREAM 属性を TRUE を に設定します。
この時点で、ダウンストリーム MFT には、次の図に示すように、アップストリーム MFT の属性ストアへのポインターがあります。
手記
わかりやすくするために、この図はストリームと属性が個別のオブジェクトとして格納されていることを示していますが、実装には必要ありません。
ダウンストリーム MFT は、IMFAttributes ポインターを使用して、アップストリーム MFT とのプライベート通信チャネルを確立します。 チャネルはプライベートであるため、正確なメカニズムは実装によって定義されます。 たとえば、MFT はプライベート COM インターフェイスのクエリを実行する場合があります。
手順 4 の間に、ダウンストリーム MFT は、2 つの MFT が同じ物理デバイスを共有しているかどうかを確認する必要があります。 そうでない場合は、データ転送にシステム メモリを使用するようにフォールバックする必要があります。 これにより、MFT はソフトウェア MFT やその他のハードウェア デバイスで正しく動作します。
ハンドシェイクが成功し、2 つの MFT がプライベート データ チャネルを共有する場合、接続ポイントで標準データ処理モデル (次のセクションで説明) は使用されません。 具体的には、ダウンストリーム MFT は METransformNeedInput イベント 送信しません。詳細については、このトピックの次のセクションを参照してください。
データ処理
ハードウェア MFT がデータ転送にシステム メモリを使用する場合、プロセスは次のように動作します。
- さらに多くの入力を要求するために、MFT は METransformNeedInput イベントを送信します。
- METransformNeedInput イベントにより、パイプラインは IMFTransform::P rocessInput呼び出されます。
- MFT に出力データがある場合、MFT は METransformHaveOutput イベントを送信します。
- METransformHaveOutput イベントにより、パイプラインは IMFTransform::P rocessOutput呼び出されます。
詳細については、非同期 MFTを参照してください。
ただし、MFT がハードウェア チャネルを使用している場合、すべてのデータ転送はハードウェア内で内部的に行われるため、これらのイベントはハードウェア接続ポイントで送信されません。 そのため、パイプラインは、接続ポイントで ProcessInput呼び出したり、ProcessOutputをしたりすることはありません。
たとえば、このトピックの最初の図を考えてみましょう。 この構成を考えると、データ処理は次のように行われます。
- "A" は、METransformNeedInput 送信してデータを要求します。
- パイプラインは、"A" ProcessInput を呼び出します。
- "A" と "B" は、ハードウェア内のデータを処理します。
- 処理が完了すると、"B" は METransformHaveOutput イベントを送信します。
- パイプラインは、"B" ProcessOutput を呼び出します。
ペア デコーダー/エンコーダー
デコーダーとエンコーダーが同じハードウェア チップ上にある場合は、トランスコーディング時にこれらを一緒に使用することをお勧めします。 つまり、1 つを選択すると、もう一方がコード変換パイプラインで選択されます。 一致するハードウェア コーデックを確実に選択するには、両方のコーデックの MFT がカスタム メディア タイプを提供する必要があります。 カスタム メディアの種類を作成するには:
- 必要に応じて、MF_MT_MAJOR_TYPE 属性を MFMediaType_Audio または MFMediaType_Videoに設定します。
- MF_MT_SUBTYPE 属性をカスタム GUID 値に設定します。
その他の型属性は省略可能です。 デコーダーは、IMFTransform::GetOutputAvailableTypeからカスタム型を返し、エンコーダーは IMFTransform::GetInputAvailableType メソッドからカスタム型を返します。 どちらの場合も、カスタム型はリスト内の最初のエントリである必要があります (dwTypeIndex = 0)。
ソフトウェア コーデックを操作するには、ビデオ用の NV12 など、少なくとも 1 つの標準形式も返す必要があります。 標準形式は、カスタム型 (dwTypeIndex> 0) の後に表示されます。 2 つのコーデックを常にペアリングする必要があり、ソフトウェア コーデックと相互運用できない場合、MFT はカスタム形式のみを返し、標準形式は返さない必要があります。
手記
デコーダーが標準形式を返さない場合は、拡張ビデオ レンダラーでの再生に使用できません。 その場合は、トランスコード専用デコーダーとして登録する必要があります。 「Transcode-Only デコーダーの」を参照してください。
関連トピック