MFTEnum2 関数 (mfapi.h)
指定した検索条件に一致する Microsoft Media Foundation 変換 (MFT) の一覧を取得します。 この関数は 、MFTEnumEx 関数を拡張して、外部アプリケーションと内部コンポーネントが、特定のビデオ アダプターに対応するハードウェア MFT を検出できるようにします。
構文
HRESULT MFTEnum2(
[in] GUID guidCategory,
[in] UINT32 Flags,
[in] const MFT_REGISTER_TYPE_INFO *pInputType,
[in] const MFT_REGISTER_TYPE_INFO *pOutputType,
[in, optional] IMFAttributes *pAttributes,
[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 の場合、すべての出力型が一致します。
[in, optional] pAttributes
標準属性ストアへのアクセスを有効にする IMFAttributes インターフェイスへのポインター。 MFT を照会する特定のハードウェア アダプターを指定するには、 MFT_ENUM_ADAPTER_LUID 属性をアダプターの LUID に設定します。 これを行う場合は、MFT_ENUM_FLAG_HARDWARE フラグも指定するか、E_INVALIDARGが返される必要があります。
[out] pppMFTActivate
IMFActivate インターフェイス ポインターの配列を受け取ります。 各ポインターは、検索条件に一致する MFT のアクティブ化オブジェクトを表します。 関数は、配列のメモリを割り当てます。 呼び出し元はポインターを解放し、 CoTaskMemFree 関数を呼び出して配列のメモリを解放する必要があります。
[out] pnumMFTActivate
pppMFTActivate 配列内の要素の数を受け取ります。 検索条件に一致する MFT がない場合、このパラメーターは値 0 を受け取ります。
戻り値
メソッドが成功した場合は、S_OK を返します。 エラーが発生した場合、次の表に示す値が、可能なリターン コードに含まれますが、これらに限定されません。
リターン コード | 説明 |
---|---|
|
MFT_ENUM_ADAPTER_LUID属性を含む IMFAttributes が pAttributes パラメーターに指定され、MFT_ENUM_FLAG_HARDWARE フラグが指定されませんでした。 |
注釈
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」を参照してください。
メモpAttributes パラメーターに MFT_ENUM_ADAPTER_LUID 属性を含む IMFAttributes が指定されている場合は、MFT_ENUM_FLAG_HARDWARE フラグを設定するか、E_INVALIDARGが返されます。
|
すべての 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 フラグが設定されている場合、MFTEnum2 関数は結果を次のように並べ替えます。
- ローカル: 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 | 値を | 使用することと同じです。
フラグを 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\SOFTWARE\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 を対象としており、アプリケーションでは使用しないでください。
ハードウェア コーデックの場合、MFTEnum2 の guidCategory パラメーターでは、次のカーネル ストリーミング (KS) デバイス カテゴリのいずれかを指定することもできます。
- KSCATEGORY_DATACOMPRESSOR
- KSCATEGORY_DATADECOMPRESSOR
例
次の例では、使用可能な最初の IDXGIAdapter1 を取得し、後続の例のアダプターを識別するために必要なアダプター LUID を取得します。
HRESULT hr = S_OK;
IDXGIFactory1 *pDxgiFactory = NULL;
IDXGIAdapter1 *pDxgiAdapter = NULL;
LUID adapterLuid;
if (FAILED(hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void **)&pDxgiFactory)))
{
return hr;
}
if (FAILED(hr = pDxgiFactory->EnumAdapters1(0, &pDxgiAdapter)))
{
return hr;
}
DXGI_ADAPTER_DESC1 AdapterDescr;
if (FAILED(hr = pDxgiAdapter->GetDesc1(&AdapterDescr)))
{
if (pDxgiAdapter)
{
pDxgiAdapter->Release();
pDxgiAdapter = NULL;
}
return hr;
}
adapterLuid = AdapterDescr.AdapterLuid;
次の例では、ハードウェア ビデオまたはオーディオ デコーダーを検索します。 非同期、ハードウェア、トランスコード、およびフィールド オブ ユース デコーダーは除外されます。 一致するものが見つかった場合、コードはリスト内の最初の MFT を作成します。 MFTEnumEx 記事の並列例とは異なり、この例では IMFAttributes のインスタンスを作成し、MFT_ENUM_ADAPTER_LUID属性をデコーダーの要求元インターフェイスの LUID に設定します。 MFTEnum2 の呼び出しでは、必要なMFT_ENUM_FLAG_HARDWARE フラグが設定され、IMFAttributes 引数が指定されます。
HRESULT FindHWDecoder(
const GUID& subtype, // Subtype
BOOL bAudio, // TRUE for audio, FALSE for video
LUID& adapterLuid, // LUID of the graphics adapter for which to find the decoder
IMFTransform **ppDecoder // Receives a pointer to the decoder.
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
CComPtr<IMFAttributes> spAttributes;
hr = MFCreateAttributes(&spAttributes, 1);
if (FAILED(hr = spAttributes->SetBlob(MFT_ENUM_ADAPTER_LUID, (BYTE*)&adapterLuid, sizeof(LUID))))
{
return hr;
}
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnum2(
bAudio ? MFT_CATEGORY_AUDIO_DECODER : MFT_CATEGORY_VIDEO_DECODER,
MFT_ENUM_FLAG_HARDWARE | MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
&info, // Input type
NULL, // Output type
spAttributes,
&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;
}
次の例では、ハードウェア ビデオまたはオーディオ エンコーダーを検索します。 非同期エンコーダー、ハードウェア エンコーダー、トランスコード エンコーダー、およびフィールド オブ ユース エンコーダーは除外されます。 MFTEnumEx 記事の並列例とは異なり、この例では IMFAttributes のインスタンスを作成し、MFT_ENUM_ADAPTER_LUID属性をエンコーダーの要求元インターフェイスの LUID に設定します。 MFTEnum2 の呼び出しでは、必要なMFT_ENUM_FLAG_HARDWARE フラグが設定され、IMFAttributes 引数が指定されます。
HRESULT FindHWEncoder(
const GUID& subtype, // Subtype
BOOL bAudio, // TRUE for audio, FALSE for video
LUID& adapterLuid, // LUID of the graphics adapter for which to find the encoder
IMFTransform **ppEncoder // Receives a pointer to the decoder.
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
CComPtr<IMFAttributes> spAttributes;
hr = MFCreateAttributes(&spAttributes, 1);
if (FAILED(hr = spAttributes->SetBlob(MFT_ENUM_ADAPTER_LUID, (BYTE*)&adapterLuid, sizeof(LUID))))
{
return hr;
}
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnum2(
bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
MFT_ENUM_FLAG_HARDWARE | MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
NULL, // Input type
&info, // Output type
spAttributes,
&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;
}
次の例では、ハードウェア ビデオ デコーダーを検索し、非同期、ハードウェア、またはトランスコード デコーダーを含めるオプションを指定します。 MFTEnumEx に関する記事の並列例とは異なり、この例では IMFAttributes のインスタンスを作成し、MFT_ENUM_ADAPTER_LUID 属性をビデオ デコーダーの要求元インターフェイスの LUID に設定します。 MFTEnum2 の呼び出しでは、必要なMFT_ENUM_FLAG_HARDWARE フラグが設定され、IMFAttributes 引数が指定されます。
HRESULT FindHWVideoDecoder(
const GUID& subtype,
BOOL bAllowAsync,
BOOL bAllowHardware,
BOOL bAllowTranscode,
LUID& adapterLuid, // LUID of the graphics adapter for which to find the encoder
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;
}
unFlags |= MFT_ENUM_FLAG_HARDWARE;
CComPtr<IMFAttributes> spAttributes;
hr = MFCreateAttributes(&spAttributes, 1);
if (FAILED(hr = spAttributes->SetBlob(MFT_ENUM_ADAPTER_LUID, (BYTE*)&adapterLuid, sizeof(LUID))))
{
return hr;
}
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 10 [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows Server 2016 [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | mfapi.h |
Library | Mfplat.lib |
[DLL] | Mfplat.dll |