Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Хранит карту числа битов, используемых для кодирования каждого блока в закодированном видеокадре.
Тип данных
Замечания
Доступ к используемой карте битов позволяет разработчикам анализировать распределение битов в закодированном кадре. Это может помочь диагностировать неэффективность, настроить стратегии кодирования и убедиться, что критически важные регионы видео получают соответствующее битовое выделение.
Использованная карта битов представляет собой массив 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 |