次の方法で共有


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 は、リストの末尾に並べ替えられていない状態で表示されます。
MFT_ENUM_FLAG_SORTANDFILTER フラグを設定しない場合、MFTEnumEx 関数は並べ替えられていないリストを返します。

Flags パラメーターを 0 に設定することは、MFT_ENUM_FLAG_LOCALMFT MFT_ENUM_FLAG_SORTANDFILTER MFT_ENUM_FLAG_SYNCMFT | 値 | 使用することと同じです。

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

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

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

次の例では、ビデオまたはオーディオ デコーダーを検索します。 非同期、ハードウェア、トランスコード、およびフィールド オブ ユース デコーダーは除外されます。 一致するものが見つかった場合、コードはリスト内の最初の 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

関連項目

使用制限のフィールド

MFTRegister

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

MFT の登録と列挙