Compartir a través de


Función MFTEnumEx (mfapi.h)

Obtiene una lista de transformaciones (MFT) de Microsoft Media Foundation que coinciden con los criterios de búsqueda especificados. Esta función extiende la función MFTEnum .

Sintaxis

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
);

Parámetros

[in] guidCategory

GUID que especifica la categoría de MFT que se va a enumerar. Para obtener una lista de las categorías de MFT, consulte MFT_CATEGORY.

[in] Flags

Or bit a bit de cero o más marcas de la enumeración _MFT_ENUM_FLAG.

[in] pInputType

Puntero a una estructura de MFT_REGISTER_TYPE_INFO que especifica un tipo de medio de entrada que debe coincidir.

Este parámetro puede ser NULL. Si es NULL, se coinciden todos los tipos de entrada.

[in] pOutputType

Puntero a una estructura de MFT_REGISTER_TYPE_INFO que especifica un tipo de medio de salida que debe coincidir.

Este parámetro puede ser NULL. Si es NULL, se coinciden todos los tipos de salida.

[out] pppMFTActivate

Recibe una matriz de punteros de interfaz IMFActivate . Cada puntero representa un objeto de activación de un MFT que coincide con los criterios de búsqueda. La función asigna la memoria de la matriz. El autor de la llamada debe liberar los punteros y llamar a la función CoTaskMemFree para liberar la memoria de la matriz.

[out] pnumMFTActivate

Recibe el número de elementos de la matriz pppMFTActivate . Si ninguna MFT coincide con los criterios de búsqueda, este parámetro recibe el valor cero.

Valor devuelto

Si esta función se realiza correctamente, devuelve S_OK. De lo contrario, devuelve un código de error de HRESULT.

Comentarios

El parámetro Flags controla qué MFT se enumeran y el orden en que se devuelven. Las marcas de este parámetro se dividen en varios grupos.

El primer conjunto de marcas especifica cómo procesa un MFT los datos.

Marca Descripción
MFT_ENUM_FLAG_SYNCMFT MFT realiza el procesamiento de datos sincrónico en software. Este es el modelo de procesamiento MFT original y es compatible con Windows Vista.
MFT_ENUM_FLAG_ASYNCMFT MFT realiza el procesamiento asincrónico de datos en software. Este modelo de procesamiento requiere Windows 7. Para obtener más información, consulte MFT asincrónicas.
MFT_ENUM_FLAG_HARDWARE MFT realiza el procesamiento de datos basado en hardware, mediante el controlador AVStream o un proxy basado en GPU MFT. Las MFT de esta categoría siempre procesan los datos de forma asincrónica. Para obtener más información, consulte MFT de hardware.
 

Cada MFT entra exactamente en una de estas categorías. Para enumerar una categoría, establezca la marca correspondiente en el parámetro Flags . Puede combinar estas marcas para enumerar más de una categoría. Si no se especifica ninguna de estas marcas, la categoría predeterminada es MFT sincrónica (MFT_ENUM_FLAG_SYNCMFT).

A continuación, las marcas siguientes incluyen MFT que, de lo contrario, se excluyen de los resultados. De forma predeterminada, las marcas que coinciden con estos criterios se excluyen de los resultados. Use cualquiera de estas marcas para incluirlas.

Marca Descripción
MFT_ENUM_FLAG_FIELDOFUSE Incluya las MFT que la aplicación debe desbloquear.
MFT_ENUM_FLAG_LOCALMFT Incluya las MFT registradas en el proceso del autor de la llamada a través de la función MFTRegisterLocal o MFTRegisterLocalByCLSID .
MFT_ENUM_FLAG_TRANSCODE_ONLY Incluya las MFT optimizadas para transcodificación en lugar de para la reproducción.
 

La última marca se usa para ordenar y filtrar los resultados:

Marca Descripción
MFT_ENUM_FLAG_SORTANDFILTER Ordene y filtre los resultados.
 

Si se establece la marca MFT_ENUM_FLAG_SORTANDFILTER , la función MFTEnumEx ordena los resultados de la siguiente manera:

  • Local: si se establece la marca de MFT_ENUM_FLAG_LOCALMFT , las MFT locales aparecen primero en la lista. Para registrar un MFT local, llame a la función MFTRegisterLocal o MFTRegisterLocalByCLSID .
  • Mérito: las MFT con un valor de mérito aparecen a continuación en la lista, en orden de valor de mérito (más alto a menor). Para obtener más información sobre el mérito, consulte MFT_CODEC_MERIT_Attribute.
  • Preferido: si se muestra un MFT en la lista preferida del control de complemento, aparece a continuación en la lista. Para obtener más información sobre el control del complemento, consulte IMFPluginControl.
  • Si aparece una MFT en la lista de bloqueados, se excluye de los resultados. Para obtener más información sobre la lista bloqueada, vea IMFPluginControl::IsDisabled.
  • Cualquier otra MFT que coincida con los criterios de búsqueda aparece al final de la lista, sin clasificar.
Si no establece la marca MFT_ENUM_FLAG_SORTANDFILTER , la función MFTEnumEx devuelve una lista no ordenada.

Establecer el parámetro Flags en cero equivale a usar el valor MFT_ENUM_FLAG_SYNCMFT MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER | .

Establecer marcasen MFT_ENUM_FLAG_SYNCMFT equivale a llamar a la función MFTEnum .

Si ninguna MFT coincide con los criterios de búsqueda, la función devuelve S_OK, a menos que se produzca algún otro error. Por lo tanto, compruebe siempre el recuento recibido en el parámetro pcMFTActivate antes de desreferenciar el puntero pppMFTActivate .

Nota No hay ninguna manera de enumerar solo las MFT locales y nada más. Establecer marcas iguales a MFT_ENUM_FLAG_LOCALMFT equivale a incluir la marca de MFT_ENUM_FLAG_SYNCMFT . Sin embargo, si también ordena los resultados especificando la marca MFT_ENUM_FLAG_SORTANDFILTER , las MFT locales aparecen primero en la lista.
 

Creación del MFT

Si al menos un MFT coincide con los criterios de búsqueda, el parámetro pppMFTActivate recibe una matriz de punteros IMFActivate . Se devuelve un puntero para cada MFT coincidente. Cada puntero representa un objeto de activación para el MFT. Para obtener más información, vea Objetos de activación.

La información adicional sobre cada MFT se almacena como atributos en los objetos de activación. Para obtener una lista de los posibles atributos, vea Transformar atributos.

Para crear una instancia de MFT, llame a IMFActivate::ActivateObject.

Códecs de hardware

Los códecs de hardware se excluyen de los resultados de la enumeración si las siguientes claves del Registro se establecen en cero:

Descodificadores: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableDecoders

Codificadores: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableEncoders

Procesadores de vídeo: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableVideoProcessors

Estas claves están pensadas para los OEM y las aplicaciones no deben usarlas.

En el caso de los códecs de hardware, el parámetro guidCategory de MFTEnumEx también puede especificar una de las siguientes categorías de dispositivos de streaming de kernel (KS):

  • KSCATEGORY_DATACOMPRESSOR
  • KSCATEGORY_DATADECOMPRESSOR
Los códecs de hardware también deben registrarse en un GUID de MFT_CATEGORY , por lo que las aplicaciones suelen usar esas categorías en lugar de las categorías de dispositivos KS.

Ejemplos

En el ejemplo siguiente se busca un descodificador de audio o vídeo. Se excluyen los descodificadores asincrónicos, de hardware, transcodificación y campo de uso. Si se encuentra una coincidencia, el código crea el primer MFT de la lista.

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;
}

En el ejemplo siguiente se busca un codificador de vídeo o audio. Se excluyen los codificadores asincrónicos, hardware, transcodificación y campo de uso.

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;
}

En el ejemplo siguiente se busca un descodificador de vídeo, con opciones para incluir descodificadores asincrónicos, de hardware o transcodificadores.

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;
}

Requisitos

   
Cliente mínimo compatible Windows 7 [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2008 R2 [aplicaciones de escritorio | Aplicaciones para UWP]
Plataforma de destino Windows
Encabezado mfapi.h
Library Mfplat.lib
Archivo DLL Mfplat.dll

Consulte también

Campo de restricciones de uso

MFTRegister

Funciones de Media Foundation

Registro y enumeración de MFT