attribut MFSampleExtension_VideoEncodeBitsUsedMap

Stocke une carte du nombre de bits utilisés pour encoder chaque bloc dans une trame vidéo encodée.

Type de données

Un IMFMediaBuffer.

Remarques

L’accès aux bits utilisés par la carte permet aux développeurs d’analyser l’allocation de bits sur une trame encodée. Cela peut aider à diagnostiquer les inefficacités, à ajuster les stratégies d’encodage et à garantir que les régions critiques d’une vidéo reçoivent une allocation de bits appropriée.

Le mappage utilisé est un tableau de uint32_t. Chaque bloc a une valeur uint32_t qui représente le nombre de bits utilisés dans l’encodage du bloc. Un développeur doit déterminer la taille de la carte à l’aide de CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize et de la largeur et de la hauteur du cadre vidéo (divisez la largeur/la hauteur par la taille du bloc. Si la largeur/hauteur n’est pas un multiple exact de la taille du bloc, arrondissez-la au multiple suivant de la taille du bloc). Cela fournit le nombre de lignes et de colonnes, ce qui garantit un alignement approprié avec l’image vidéo. La carte est de gauche à droite et de haut en bas.

Utilisez IMFAttributes ::SetUnknown pour attacher un IMFMediaBuffer contenant le mappage QP à un exemple de sortie. Utilisez IMFAttributes ::GetUnknown pour récupérer le imfMediaBuffer contenant la carte QP à partir d’un exemple de sortie.

Les bits utilisés sur la carte ne doivent être signalés que lorsque l’intégralité de l’image a terminé l’encodage. Si l’encodeur utilise plusieurs tranches, la mémoire tampon PSNR doit être attachée au IMFSample de la dernière tranche.

Exemples

L’exemple suivant montre comment utiliser la propriété CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize pour configurer un encodeur MFT pour activer ou désactiver la création de rapports sur les bits utilisés pour la fonctionnalité de carte. Si la taille du bloc est égale à zéro, elle est désactivée. S’il n’est pas égal à zéro, il est activé.

#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’exemple suivant montre une fonction d’assistance qui peut être utilisée par des implémentations d’un encodeur MFT qui prend en charge ICodecAPI. La fonction montre comment vérifier si les bits utilisés pour la création de rapports cartographiques sont activés sur l’encodeur MFT. Si elle est activée, la fonction montre comment attacher les bits utilisés à la carte sur l’exemple de sortie. Cela suppose que chaque exemple de sortie contient une trame complète. Si l’encodeur utilise plusieurs tranches, les bits utilisés doivent être attachés uniquement au IMFSample de la dernière tranche.

#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’exemple suivant montre comment une application peut récupérer les bits utilisés à partir des objets IMFSample générés par un encodeur 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; 

} 

Spécifications

Besoin Valeur
Client minimal pris en charge Windows 11, build 26100
Serveur minimal pris en charge Windows Server 2025
En-tête de page mfapi.h