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 を返します。 エラーが発生した場合、次の表に示す値が、可能なリターン コードに含まれますが、これらに限定されません。

リターン コード 説明
E_INVALIDARG
MFT_ENUM_ADAPTER_LUID属性を含む IMFAttributespAttributes パラメーターに指定され、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 は、リストの末尾に並べ替えられていない状態で表示されます。
MFT_ENUM_FLAG_SORTANDFILTER フラグを設定しない場合、MFTEnum2 関数は並べ替えられていないリストを返します。

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 だけを列挙する方法はなく、それ以外は何も列挙できません。 フラグMFT_ENUM_FLAG_LOCALMFT に等しく設定することは、MFT_ENUM_FLAG_SYNCMFT フラグを含めることと同じです。 ただし、 MFT_ENUM_FLAG_SORTANDFILTER フラグを指定して結果を並べ替えた場合は、ローカルの MFT が一覧の最初に表示されます。
 

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 を対象としており、アプリケーションでは使用しないでください。

ハードウェア コーデックの場合、MFTEnum2guidCategory パラメーターでは、次のカーネル ストリーミング (KS) デバイス カテゴリのいずれかを指定することもできます。

  • KSCATEGORY_DATACOMPRESSOR
  • KSCATEGORY_DATADECOMPRESSOR
ハードウェア コーデックも MFT_CATEGORY GUID に登録する必要があるため、アプリケーションでは通常、KS デバイス カテゴリではなく、これらのカテゴリを使用する必要があります。

次の例では、使用可能な最初の 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

こちらもご覧ください

使用制限のフィールド

MFTRegister

メディア ファンデーション機能

MFT の登録と列挙