コーデック MFT の実装

このトピックでは、デコーダーまたはエンコーダーを Media Foundation Transform (MFT) として実装するためのガイドラインをいくつか示します。

エンコーダー

エンコーダー形式ネゴシエーション

エンコーダーを初期化するには、次の手順を使用します。

  1. MFT に対して ICodecAPI インターフェイスのクエリを実行します。
  2. ICodecAPI::SetValue を呼び出してエンコード プロパティを設定します。
  3. IMFTransform::SetOutputType を呼び出してエンコード形式を設定します。
  4. 互換性のある入力型の一覧を取得するには、 IMFTransform::GetInputAvailableType を呼び出します。 (この手順はスキップされる可能性があります)。
  5. IMFTransform::SetInputType を呼び出して、圧縮されていない入力形式を設定します。

手順 3 で出力の種類を設定した後、 GetInputAvailableType メソッドは、現在の出力型と互換性のある入力型の一覧を返す必要があります。 つまり、この時点で GetInputAvailableType によって返されるすべての型は 、SetInputType に対して有効である必要があります。

デコーダーの場合、型が設定される順序は逆になります。入力の種類は最初に設定され、その後に出力の種類が設定されます。 入力型を設定した後、 IMFTransform::GetOutputAvailableType メソッドは、 IMFTransform::SetOutputType メソッドに渡すことができる型のリストを返す必要があります。

エンコーダーとデコーダーは、一般的な非圧縮形式として NV12 をサポートする必要があります。 これにより、パイプライン コンポーネントが最小限のカラースペース変換と相互運用できます。 もちろん、他の形式もサポートできます。

デコーダー

Transcode-Only デコーダー

一部のデコーダーはトランスコーディング (デコードしてからストリームの再エンコード) 用に最適化されており、再生中の使用には適していません。

デコーダー MFT がコード変換のみを目的としている場合は、MFT を登録するときに MFT_ENUM_FLAG_TRANSCODE_ONLY フラグを設定します。 ( 「MFTRegister」を参照)。

既定では、トランスコード デコーダーは MFTEnumEx 関数によって返されません。 トランスコード デコーダーを列挙するには、MFTEnumEx を呼び出し、Flags パラメーターに MFT_ENUM_FLAG_TRANSCODE_ONLY フラグを設定します。 MFTEnumEx 関数で使用する場合、このフラグはトランスコード デコーダーと他のデコーダーの両方を列挙しました。

MFTRegister MFT_ENUM_FLAG_TRANSCODE_ONLY MFTEnumEx MFT_ENUM_FLAG_TRANSCODE_ONLY MFT は列挙されていますか?
1 1 はい
1 0 いいえ
0 1 はい
0 0 はい

 

Telecine 属性

メディア ソースは、提供するメディア サンプルに次の telecine 属性をアタッチする場合があります。

属性 説明
MFSampleExtension_RepeatFirstField "repeat first field" (RFF) フラグと同じです。
MFSampleExtension_BottomFieldFirst "top field first" (TFF) フラグの逆関数。

 

これらのフラグは、インターレース解除を実行するときに、拡張ビデオ レンダラー (EVR) にヒントを提供します。 デコーダーは、これらのフラグを出力サンプルにコピーしてダウンストリームに伝達し、EVR に到達するようにする必要があります。

カスタム MFT の作成