атрибут MFSampleExtension_VideoEncodeBitsUsedMap

Хранит карту числа битов, используемых для кодирования каждого блока в закодированном видеокадре.

Тип данных

МВФМедиаБаффер.

Замечания

Доступ к используемой карте битов позволяет разработчикам анализировать распределение битов в закодированном кадре. Это может помочь диагностировать неэффективность, настроить стратегии кодирования и убедиться, что критически важные регионы видео получают соответствующее битовое выделение.

Использованная карта битов представляет собой массив uint32_t. Каждый блок имеет одно uint32_t значение, представляющее количество битов, используемых в кодировке блока. Разработчик должен определить размер карты с помощью CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize и ширины кадра видео (разделите ширину или высоту на размер блока. Если ширина или высота блока не является точной, округляйте его до следующего размера блока). Это обеспечивает количество строк и столбцов, обеспечивая правильное выравнивание с видеокадром. Карта находится слева направо и сверху вниз.

Используйте МВФAttributes::SetUnknown для присоединения МВФMediaBuffer , содержащего карту QP к выходному образцу. Используйте МВФAttributes::GetUnknown для получения МВФMediaBuffer , содержащего карту QP из выходного примера.

Биты используемой карты должны сообщаться только в том случае, если весь кадр завершил кодировку. Если кодировщик использует несколько срезов, буфер PSNR должен быть присоединен к МВФSample последнего среза.

Примеры

В следующем примере показано, как использовать свойство CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize для настройки MFT кодировщика для включения или отключения отчетов об используемых битах функции карты. Если размер блока равен нулю, он отключен. Если он не равен нулю, он включен.

#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); 
} 

В следующем примере показана вспомогательные функции, которые могут использоваться реализациями MFT кодировщика, поддерживающего ICodecAPI. Функция показывает, как проверить, включены ли биты, используемые отчеты карты, в MFT кодировщика. Если она включена, функция показывает, как подключить биты, используемые сопоставлением, к выходному образцу. Предполагается, что каждый выходной пример содержит полный кадр. Если кодировщик использует несколько срезов, то биты, используемые карты, должны быть присоединены только к МВФSample последнего среза.

#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); 
}

В следующем примере показано, как приложение может получить биты, используемые данные карты из объектов МВФSample , созданных кодировщиком 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; 

} 

Требования

Требование Ценность
Минимальный поддерживаемый клиент Windows 11, сборка 26100
Минимальный поддерживаемый сервер Windows Server 2025
Заголовок mfapi.h