Condividi tramite


attributo MFSampleExtension_VideoEncodeBitsUsedMap

Archivia una mappa del numero di bit usati per codificare ogni blocco in un frame video codificato.

Tipo di dati

Un IMFMediaBuffer.

Osservazioni:

L'accesso ai bit usati dalla mappa consente agli sviluppatori di analizzare l'allocazione dei bit in un frame codificato. Ciò consente di diagnosticare le inefficienze, modificare le strategie di codifica e garantire che le aree critiche di un video ricevano un'allocazione di bit appropriata.

I bit usati per la mappa sono una matrice di uint32_t. Ogni blocco ha un valore uint32_t che rappresenta il numero di bit usati nella codifica del blocco. Uno sviluppatore deve determinare le dimensioni della mappa usando CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize e larghezza e altezza dei fotogrammi video (dividere la larghezza/altezza in base alle dimensioni del blocco. Se la larghezza/altezza non è un multiplo esatto delle dimensioni del blocco, arrotondarlo fino al multiplo successivo delle dimensioni del blocco). In questo modo viene fornito il numero di righe e colonne, garantendo un allineamento corretto con il fotogramma video. La mappa è da sinistra a destra e dall'alto verso il basso.

Usare IMFAttributes::SetUnknown per associare un IMFMediaBuffer contenente il mapping QP a un esempio di output. Usare IMFAttributes::GetUnknown per recuperare imfMediaBuffer contenente la mappa QP da un esempio di output.

I bit usati della mappa devono essere segnalati solo quando l'intero frame ha completato la codifica. Se il codificatore usa più sezioni, il buffer PSNR deve essere collegato all'oggetto IMFSample dell'ultima sezione.

Esempi

Nell'esempio seguente viene illustrato come usare la proprietà CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize per configurare un codificatore MFT per abilitare o disabilitare la segnalazione dei bit usati per la funzionalità mappa. Se la dimensione del blocco è zero, è disabilitata. Se non è zero, è abilitato.

#include <codecapi.h> 
#include <mfapi.h>
#include <wil.com.h>
#include <wil/result_macros.h>

//  Inform an encoder MFT to enable or disable reporting the bits used map feature. 
//  This function assumes that the encoder MFT supports ICodecAPI interface. 
//  It checks whether the property CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize is supported. 
//  If not supported, it returns E_NOTIMPL. 

HRESULT ConfigureEncoderForBitsUsedMap(_In_ IMFTransform* encoder, uint32_t blockSize) 
{ 
    wil::com_ptr_nothrow<ICodecAPI> codecAPI; 
    RETURN_IF_FAILED(wil::com_query_to_nothrow(encoder, &codecAPI)); 

    // Check if the encoder supports the property 
    if (!codecAPI->IsSupported(&CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize)) 
    { 
        return E_NOTIMPL; 
    } 

    // Configure encoder 
    wil::unique_variant value; 
    value.vt = VT_UI4; 
    value.ulVal = blockSize; // zero: disable; non-zero: enable 
    return codecAPI->SetValue(&CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize, &value); 
} 

L'esempio seguente illustra una funzione helper che può essere usata dalle implementazioni di un codificatore MFT che supporta ICodecAPI. La funzione mostra come verificare se i bit usati per la creazione di report mappa sono abilitati nel codificatore MFT. Se è abilitata, la funzione mostra come collegare i bit usati per il mapping all'esempio di output. Ciò presuppone che ogni esempio di output contenga un frame completo. Se il codificatore usa più sezioni, i bit usati devono essere collegati solo all'fmimosample dell'ultima sezione.

#include <mfapi.h> 
#include <mfobjects.h> 
#include <codecapi.h> 
#include <wil.com.h>
#include <wil/result_macros.h>

// Function to query and attach bits used map to output samples 

HRESULT ReportBitsUsedMapOnOutputSample( 
    _In_ IMFTransform* encoder,  
    _In_ IMFSample* outputSample,  
    _In_ IMFMediaBuffer* bitsUsedMap // IMFMediaBuffer could be the GPU resource for bits used map if using hardware encoder 
)  
{ 
    RETURN_HR_IF_NULL(E_INVALIDARG, encoder); 
    RETURN_HR_IF_NULL(E_INVALIDARG, outputSample); 
    RETURN_HR_IF_NULL(E_INVALIDARG, bitsUsedMap); 

    // Query the encoder's codec API to check if bits used Map reporting is enabled 
    wil::com_ptr_nothrow<ICodecAPI> codecAPI; 
    RETURN_IF_FAILED(wil::com_query_to_nothrow(encoder, &codecAPI)); 

    wil::unique_variant value; 
    RETURN_IF_FAILED(codecAPI->GetValue(&CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize, &value)); 

    if (value.vt != VT_UI4 || !value.ulVal) { 
        return S_OK; // Bits Used Map not enabled 
    } 

    // Attach the IMFMediaBuffer (Bits Used Map) to the output sample's attributes 
    wil::com_ptr_nothrow<IMFAttributes> sampleAttributes; 
    RETURN_IF_FAILED(wil::com_query_to_nothrow(outputSample, &sampleAttributes)); 

    return sampleAttributes->SetUnknown(MFSampleExtension_VideoEncodeBitsUsedMap, bitsUsedMap); 
}

L'esempio seguente mostra come un'app può recuperare i dati della mappa usati dagli oggetti IMFSample prodotti da un codificatore MFT.

#include <mfapi.h> 
#include <mfobjects.h> 
#include <codecapi.h> 
#include <wil.com.h>
#include <wil/result_macros.h>

// Function to retrieve the bits used map data from an output sample 
HRESULT RetrieveBitsUsedMapFromOutputSample( 
    _In_ IMFSample* outputSample,  
    _COM_Outptr_result_maybenull_ IMFMediaBuffer** bitsUsedMap // Output: IMFMediaBuffer containing the bits used map 
) 
{ 

    RETURN_HR_IF_NULL(E_INVALIDARG, bitsUsedMap); 
    *bitsUsedMap = nullptr; 

    RETURN_HR_IF_NULL(E_INVALIDARG, outputSample); 

    // Retrieve the sample attributes 
    wil::com_ptr_nothrow<IMFAttributes> sampleAttributes; 
    RETURN_IF_FAILED(wil::com_query_to_nothrow(outputSample, &sampleAttributes)); 

    // Retrieve the IMFMediaBuffer associated with the bits used map 
    (void)sampleAttributes->GetUnknown(MFSampleExtension_VideoEncodeBitsUsedMap, IID_PPV_ARGS(bitsUsedMap)); 

    return S_OK; 

} 

Requisiti

Requisito Valore
Client minimo supportato Windows 11, build 26100
Server minimo supportato Windows Server 2025
Intestazione mfapi.h