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.
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 .
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
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 |