MFTEnumEx 関数 (mfapi.h)
指定した検索条件に一致する Microsoft Media Foundation 変換 (MFT) の一覧を取得します。 この関数は 、MFTEnum 関数を拡張します。
構文
HRESULT MFTEnumEx(
[in] GUID guidCategory,
[in] UINT32 Flags,
[in] const MFT_REGISTER_TYPE_INFO *pInputType,
[in] const MFT_REGISTER_TYPE_INFO *pOutputType,
[out] IMFActivate ***pppMFTActivate,
[out] UINT32 *pnumMFTActivate
);
パラメーター
[in] guidCategory
列挙する MFT のカテゴリを指定する GUID。 MFT カテゴリの一覧については、「 MFT_CATEGORY」を参照してください。
[in] Flags
_MFT_ENUM_FLAG列挙からの 0 個以上のフラグのビットごとの OR。
[in] pInputType
一致する入力メディアの種類を指定する MFT_REGISTER_TYPE_INFO 構造体へのポインター。
このパラメーターは、NULL でもかまいません。 NULL の場合、すべての入力型が一致します。
[in] pOutputType
一致する出力メディアの種類を指定する MFT_REGISTER_TYPE_INFO 構造体へのポインター。
このパラメーターは、NULL でもかまいません。 NULL の場合、すべての出力型が一致します。
[out] pppMFTActivate
IMFActivate インターフェイス ポインターの配列を受け取ります。 各ポインターは、検索条件に一致する MFT のアクティブ化オブジェクトを表します。 関数は、配列のメモリを割り当てます。 呼び出し元はポインターを解放し、 CoTaskMemFree 関数を呼び出して配列のメモリを解放する必要があります。
[out] pnumMFTActivate
pppMFTActivate 配列内の要素の数を受け取ります。 検索条件に一致する MFT がない場合、このパラメーターは値 0 を受け取ります。
戻り値
この関数が成功すると、 S_OKが返されます。 そうでない場合は、HRESULT エラー コードを返します。
解説
Flags パラメーターは、列挙する MFT と、それらが返される順序を制御します。 このパラメーターのフラグは、複数のグループに分類されます。
フラグの最初のセットは、MFT がデータを処理する方法を指定します。
フラグ | 説明 |
---|---|
MFT_ENUM_FLAG_SYNCMFT | MFT は、ソフトウェアで同期データ処理を実行します。 これは元の MFT 処理モデルであり、Windows Vista と互換性があります。 |
MFT_ENUM_FLAG_ASYNCMFT | MFT は、ソフトウェアで非同期データ処理を実行します。 この処理モデルには Windows 7 が必要です。 詳細については、「 非同期 MFT」を参照してください。 |
MFT_ENUM_FLAG_HARDWARE | MFT は、AVStream ドライバーまたは GPU ベースのプロキシ MFT を使用して、ハードウェアベースのデータ処理を実行します。 このカテゴリの MFT は、常にデータを非同期的に処理します。 詳細については、「 ハードウェア MFT」を参照してください。 |
すべての MFT は、これらのカテゴリの 1 つに分類されます。 カテゴリを列挙するには、 Flags パラメーターで対応するフラグを設定します。 これらのフラグを組み合わせて、複数のカテゴリを列挙できます。 これらのフラグが指定されていない場合、既定のカテゴリは同期 MFT (MFT_ENUM_FLAG_SYNCMFT) です。
次に、次のフラグには、それ以外の場合は結果から除外される MFT が含まれます。 既定では、これらの条件に一致するフラグは結果から除外されます。 これらのフラグを含めるには、これらのフラグを使用します。
フラグ | 説明 |
---|---|
MFT_ENUM_FLAG_FIELDOFUSE | アプリケーションでロックを解除する必要がある MFT を含めます。 |
MFT_ENUM_FLAG_LOCALMFT | MFTRegisterLocal 関数または MFTRegisterLocalByCLSID 関数を介して呼び出し元のプロセスに登録されている MFT を含めます。 |
MFT_ENUM_FLAG_TRANSCODE_ONLY | 再生ではなくコード変換用に最適化された MFT を含めます。 |
最後のフラグは、結果の並べ替えとフィルター処理に使用されます。
フラグ | 説明 |
---|---|
MFT_ENUM_FLAG_SORTANDFILTER | 結果を並べ替え、フィルター処理します。 |
MFT_ENUM_FLAG_SORTANDFILTER フラグが設定されている場合、MFTEnumEx 関数は結果を次のように並べ替えます。
- ローカル: MFT_ENUM_FLAG_LOCALMFT フラグが設定されている場合、ローカル MFT が一覧の最初に表示されます。 ローカル MFT を登録するには、 MFTRegisterLocal または MFTRegisterLocalByCLSID 関数を呼び出します。
- メリット: 一覧の次に、メリット値 (最高から最低) の順に、メリット値を持つ MFT が表示されます。 メリットの詳細については、「 MFT_CODEC_MERIT_Attribute」を参照してください。
- 推奨: MFT がプラグイン コントロールの優先リストに一覧表示されている場合は、一覧の次に表示されます。 プラグイン コントロールの詳細については、「 IMFPluginControl」を参照してください。
- ブロックリストに MFT が表示された場合、その MFT は結果から除外されます。 ブロックリストの詳細については、「 IMFPluginControl::IsDisabled」を参照してください。
- 検索条件に一致するその他の MFT は、リストの末尾に並べ替えられていない状態で表示されます。
Flags パラメーターを 0 に設定することは、MFT_ENUM_FLAG_LOCALMFT MFT_ENUM_FLAG_SORTANDFILTER MFT_ENUM_FLAG_SYNCMFT | 値を | 使用することと同じです。
Flags を MFT_ENUM_FLAG_SYNCMFT に設定することは、MFTEnum 関数を呼び出すことと同じです。
検索条件に一致する MFT がない場合、他のエラーが発生しない限り、関数は S_OKを返します。 したがって、pppMFTActivate ポインターを逆参照する前に、常に pcMFTActivate パラメーターで受け取ったカウントをチェックします。
MFT の作成
少なくとも 1 つの MFT が検索条件と一致する場合、 pppMFTActivate パラメーターは IMFActivate ポインターの配列を受け取ります。 一致する MFT ごとに 1 つのポインターが返されます。 各ポインターは、MFT の アクティブ化オブジェクト を表します。 詳細については、「 アクティブ化オブジェクト」を参照してください。各 MFT に関する追加情報は、アクティブ化オブジェクトの属性として格納されます。 使用できる属性の一覧については、「属性の 変換」を参照してください。
MFT のインスタンスを作成するには、 IMFActivate::ActivateObject を呼び出します。
ハードウェア コーデック
次のレジストリ キーが 0 に設定されている場合、ハードウェア コーデックは列挙結果から除外されます。デコーダー: HKEY_LOCAL_MACHINE\ソフトウェア\Microsoft\Windows Media Foundation\HardwareMFT\EnableDecoders
エンコーダー: HKEY_LOCAL_MACHINE\ソフトウェア\Microsoft\Windows Media Foundation\HardwareMFT\EnableEncoders
ビデオ プロセッサ: HKEY_LOCAL_MACHINE\ソフトウェア\Microsoft\Windows Media Foundation\HardwareMFT\EnableVideoProcessors
これらのキーは OEM を対象としており、アプリケーションでは使用しないでください。
ハードウェア コーデックの場合、MFTEnumEx の guidCategory パラメーターでは、次のカーネル ストリーミング (KS) デバイス カテゴリのいずれかを指定することもできます。
- KSCATEGORY_DATACOMPRESSOR
- KSCATEGORY_DATADECOMPRESSOR
例
次の例では、ビデオまたはオーディオ デコーダーを検索します。 非同期、ハードウェア、トランスコード、およびフィールド オブ ユース デコーダーは除外されます。 一致するものが見つかった場合、コードはリスト内の最初の MFT を作成します。
HRESULT FindDecoderEx(
const GUID& subtype, // Subtype
BOOL bAudio, // TRUE for audio, FALSE for video
IMFTransform **ppDecoder // Receives a pointer to the decoder.
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnumEx(
bAudio ? MFT_CATEGORY_AUDIO_DECODER : MFT_CATEGORY_VIDEO_DECODER,
MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
&info, // Input type
NULL, // Output type
&ppActivate,
&count
);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first decoder in the list.
if (SUCCEEDED(hr))
{
hr = ppActivate[0]->ActivateObject(IID_PPV_ARGS(ppDecoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
return hr;
}
次の例では、ビデオ エンコーダーまたはオーディオ エンコーダーを検索します。 非同期エンコーダー、ハードウェア エンコーダー、トランスコード エンコーダー、およびフィールド オブ ユース エンコーダーは除外されます。
HRESULT FindEncoderEx(
const GUID& subtype, // Subtype
BOOL bAudio, // TRUE for audio, FALSE for video
IMFTransform **ppEncoder // Receives a pointer to the decoder.
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnumEx(
bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
NULL, // Input type
&info, // Output type
&ppActivate,
&count
);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first encoder in the list.
if (SUCCEEDED(hr))
{
hr = ppActivate[0]->ActivateObject(IID_PPV_ARGS(ppEncoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
return hr;
}
次の例では、非同期、ハードウェア、またはトランスコード デコーダーを含むオプションを使用して、ビデオ デコーダーを検索します。
HRESULT FindVideoDecoder(
const GUID& subtype,
BOOL bAllowAsync,
BOOL bAllowHardware,
BOOL bAllowTranscode,
IMFTransform **ppDecoder
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
MFT_REGISTER_TYPE_INFO info = { MFMediaType_Video, subtype };
UINT32 unFlags = MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT |
MFT_ENUM_FLAG_SORTANDFILTER;
if (bAllowAsync)
{
unFlags |= MFT_ENUM_FLAG_ASYNCMFT;
}
if (bAllowHardware)
{
unFlags |= MFT_ENUM_FLAG_HARDWARE;
}
if (bAllowTranscode)
{
unFlags |= MFT_ENUM_FLAG_TRANSCODE_ONLY;
}
hr = MFTEnumEx(MFT_CATEGORY_VIDEO_DECODER,
unFlags,
&info, // Input type
NULL, // Output type
&ppActivate,
&count);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first decoder in the list.
if (SUCCEEDED(hr))
{
hr = ppActivate[0]->ActivateObject(IID_PPV_ARGS(ppDecoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
return hr;
}
要件
サポートされている最小のクライアント | Windows 7 [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2008 R2 [デスクトップ アプリ |UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | mfapi.h |
Library | Mfplat.lib |
[DLL] | Mfplat.dll |