Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Almacena un mapa del número de bits que se usan para codificar cada bloque en un fotograma de vídeo codificado.
Tipo de dato
Observaciones
El acceso a los bits usados permite a los desarrolladores analizar la asignación de bits en un marco codificado. Esto puede ayudar a diagnosticar ineficacias, ajustar las estrategias de codificación y garantizar que las regiones críticas de un vídeo reciban la asignación de bits adecuada.
Los bits usados map son una matriz de uint32_t. Cada bloque tiene un valor uint32_t que representa el número de bits usados en la codificación del bloque. Un desarrollador debe determinar el tamaño del mapa con CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize y ancho y alto de fotogramas de vídeo (divida el ancho o alto por el tamaño del bloque. Si el ancho o alto no es un múltiplo exacto del tamaño del bloque, redondee hasta el siguiente múltiplo del tamaño del bloque). Esto proporciona el número de filas y columnas, lo que garantiza la alineación adecuada con el fotograma de vídeo. El mapa está de izquierda a derecha y superior a abajo.
Use IMFAttributes::SetUnknown para adjuntar un IMFMediaBuffer que contiene el mapa de QP a una muestra de salida. Use IMFAttributes::GetUnknown para recuperar el IMFMediaBuffer que contiene el mapa de QP de un ejemplo de salida.
Los bits usados solo se deben notificar cuando el marco completo ha completado la codificación. Si el codificador usa varios segmentos, el búfer de PSNR debe adjuntarse al imfSample del último segmento.
Ejemplos
En el ejemplo siguiente se muestra cómo usar la propiedad CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize para configurar un codificador MFT para habilitar o deshabilitar la generación de informes de los bits usados. Si el tamaño del bloque es cero, está deshabilitado. Si no es cero, está habilitado.
#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);
}
En el ejemplo siguiente se muestra una función auxiliar que pueden usar las implementaciones de un codificador MFT que admite ICodecAPI. La función muestra cómo comprobar si los bits usados en los informes de mapa están habilitados en el codificador MFT. Si está habilitado, la función muestra cómo adjuntar los bits usados en el ejemplo de salida. Esto supone que cada ejemplo de salida contiene un marco completo. Si el codificador usa varios segmentos, los bits usados se deben adjuntar solo al IMFSample del último segmento.
#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);
}
En el ejemplo siguiente se muestra cómo una aplicación puede recuperar los bits usados de los datos de mapa de los objetos IMFSample generados por un codificador 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;
}
Requisitos
| Requisito | Importancia |
|---|---|
| Cliente mínimo compatible | Windows 11, compilación 26100 |
| Servidor mínimo compatible | Windows Server 2025 |
| Cabecera | mfapi.h |