Condividi tramite


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.
Se non si imposta il flag di MFT_ENUM_FLAG_SORTANDFILTER , la funzione MFTEnumEx restituisce un elenco non ordinato.

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 .

Nota Non c'è modo di enumerare solo le MFU locali e niente altro. L'impostazione dei flag uguale a MFT_ENUM_FLAG_LOCALMFT equivale a includere il flag di MFT_ENUM_FLAG_SYNCMFT . Tuttavia, se si ordinano anche i risultati specificando il flag di MFT_ENUM_FLAG_SORTANDFILTER , le schede multifunzione locali vengono visualizzate prima nell'elenco.
 

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
I codec hardware devono essere registrati anche in un GUID MFT_CATEGORY , pertanto le applicazioni devono in genere usare tali categorie anziché le categorie di dispositivi KS.

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

Vedi anche

Campo delle restrizioni per l'utilizzo

MFTRegister

Funzioni di Media Foundation

Registrazione ed enumerazione di mft