Funzione MFTEnumEx (mfapi.h)
Ottiene un elenco di trasformazioni di Microsoft Media Foundation che corrispondono ai criteri di ricerca specificati. Questa funzione estende la funzione MFTEnum .
Sintassi
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
);
Parametri
[in] guidCategory
GUID che specifica la categoria di MFU da enumerare. Per un elenco di categorie MFT, vedere MFT_CATEGORY.
[in] Flags
Or bit per bit di zero o più flag dall'enumerazione _MFT_ENUM_FLAG.
[in] pInputType
Puntatore a una struttura MFT_REGISTER_TYPE_INFO che specifica un tipo di supporto di input da corrispondere.
Questo parametro può essere NULL. Se NULL, tutti i tipi di input vengono corrispondenti.
[in] pOutputType
Puntatore a una struttura MFT_REGISTER_TYPE_INFO che specifica un tipo di supporto di output da corrispondere.
Questo parametro può essere NULL. Se NULL, tutti i tipi di output vengono corrispondenti.
[out] pppMFTActivate
Riceve una matrice di puntatori dell'interfaccia FMActivate . Ogni puntatore rappresenta un oggetto di attivazione per un MFT che corrisponde ai criteri di ricerca. La funzione alloca la memoria per la matrice. Il chiamante deve rilasciare i puntatori e chiamare la funzione CoTaskMemFree per liberare la memoria per la matrice.
[out] pnumMFTActivate
Riceve il numero di elementi nella matrice pppMFTActivate . Se non corrispondono ai criteri di ricerca, questo parametro riceve il valore zero.
Valore restituito
Se questa funzione ha esito positivo, restituisce S_OK. In caso contrario, restituisce un codice di errore HRESULT .
Commenti
I parametri Flag controllano l'enumerazione delle reti multifunzione e l'ordine in cui vengono restituiti. I flag per questo parametro rientrano in diversi gruppi.
Il primo set di flag specifica come un MFT elabora i dati.
Flag | Descrizione |
---|---|
MFT_ENUM_FLAG_SYNCMFT | MFT esegue l'elaborazione dei dati sincrona nel software. Si tratta del modello di elaborazione MFT originale ed è compatibile con Windows Vista. |
MFT_ENUM_FLAG_ASYNCMFT | MFT esegue l'elaborazione dei dati asincrona nel software. Questo modello di elaborazione richiede Windows 7. Per altre informazioni, vedere MFT asincroni. |
MFT_ENUM_FLAG_HARDWARE | MFT esegue l'elaborazione dei dati basata su hardware usando il driver AVStream o un proxy basato su GPU MFT. Le MFT in questa categoria elaborano sempre i dati in modo asincrono. Per altre informazioni, vedere Hardware MFT. |
Ogni MFT rientra esattamente in una di queste categorie. Per enumerare una categoria, impostare il flag corrispondente nel parametro Flags . È possibile combinare questi flag per enumerare più categorie. Se non viene specificato nessuno di questi flag, la categoria predefinita è sincrona delle schede multifunzione (MFT_ENUM_FLAG_SYNCMFT).
Successivamente, i flag seguenti includono le unità multifunzione altrimenti escluse dai risultati. Per impostazione predefinita, i flag corrispondenti a questi criteri vengono esclusi dai risultati. Usare tutti questi flag per includerli.
Flag | Descrizione |
---|---|
MFT_ENUM_FLAG_FIELDOFUSE | Includere le MFT che devono essere sbloccate dall'applicazione. |
MFT_ENUM_FLAG_LOCALMFT | Includere le MFT registrate nel processo del chiamante tramite la funzione MFTRegisterLocal o MFTRegisterLocalByCLSID. |
MFT_ENUM_FLAG_TRANSCODE_ONLY | Includere le MFT ottimizzate per la transcodatura anziché la riproduzione. |
L'ultimo flag viene usato per ordinare e filtrare i risultati:
Flag | Descrizione |
---|---|
MFT_ENUM_FLAG_SORTANDFILTER | Ordinare e filtrare i risultati. |
Se il flag di MFT_ENUM_FLAG_SORTANDFILTER è impostato, la funzione MFTEnumEx ordina i risultati come indicato di seguito:
- Locale: se il flag di MFT_ENUM_FLAG_LOCALMFT è impostato, le schede multifunzione locali vengono visualizzate prima nell'elenco. Per registrare un MFT locale, chiamare la funzione MFTRegisterLocal o MFTRegisterLocalByCLSID.
- Merito: le mfts con un valore di merito vengono visualizzate accanto nell'elenco, in ordine di valore di merito (più alto al più basso). Per altre informazioni sul merito, vedere MFT_CODEC_MERIT_Attribute.
- Preferito: se un MFT è elencato nell'elenco preferito del controllo plug-in, viene visualizzato accanto nell'elenco. Per altre informazioni sul controllo plug-in, vedere FMPluginControl.
- Se un MFT viene visualizzato nell'elenco bloccato, viene escluso dai risultati. Per altre informazioni sull'elenco bloccato, vedere FMPluginControl::IsDisabled.
- Tutti gli altri MFT che corrispondono ai criteri di ricerca vengono visualizzati alla fine dell'elenco, senza ordinamento.
L'impostazione del parametro Flags su zero equivale all'uso del valore MFT_ENUM_FLAG_SYNCMFT MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER | .
L'impostazione dei flag su MFT_ENUM_FLAG_SYNCMFT equivale a chiamare la funzione MFTEnum .
Se non corrispondono ai criteri di ricerca, la funzione restituisce S_OK, a meno che non si verifichi un altro errore. Controllare quindi sempre il conteggio ricevuto nel parametro pcMFTActivate prima di dereferenziare il puntatore pppMFTActivate .
Creazione del MFT
Se almeno un MFT corrisponde ai criteri di ricerca, il parametro pppMFTActivate riceve una matrice di puntatori FMActivate . Viene restituito un puntatore per ogni MFT corrispondente. Ogni puntatore rappresenta un oggetto di attivazione per MFT. Per altre informazioni, vedere Oggetti di attivazione.Altre informazioni su ogni MFT vengono archiviate come attributi negli oggetti di attivazione. Per un elenco degli attributi possibili, vedere Trasforma attributi.
Per creare un'istanza di MFT, chiamare FMActivate::ActivateObject.
Codec hardware
I codec hardware vengono esclusi dai risultati dell'enumerazione se le chiavi del Registro di sistema seguenti sono impostate su zero:Decodificatori: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableDecoders
Codificatori: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableEncoders
Processori video: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableVideoProcessors
Queste chiavi sono destinate alle macchine virtuali e non devono essere usate dalle applicazioni.
Per i codec hardware, il parametro guidCategory di MFTEnumEx può anche specificare una delle categorie di dispositivi di streaming del kernel seguenti:
- KSCATEGORY_DATACOMPRESSOR
- KSCATEGORY_DATADECOMPRESSOR
Esempio
Nell'esempio seguente viene eseguita la ricerca di un decodificatore video o audio. I decodificatori asincroni, hardware, transcodificali e field-of-use vengono esclusi. Se viene trovata una corrispondenza, il codice crea il primo MFT nell'elenco.
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;
}
Nell'esempio seguente viene eseguita la ricerca di un codificatore video o audio. I codificatori asincroni, hardware, transcodificali e field-of-use vengono esclusi.
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;
}
L'esempio seguente cerca un decodificatore video, con opzioni per includere decodificatori asincroni, hardware o transcodificati.
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;
}
Requisiti
Client minimo supportato | Windows 7 [app desktop | App UWP] |
Server minimo supportato | Windows Server 2008 R2 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | mfapi.h |
Libreria | Mfplat.lib |
DLL | Mfplat.dll |