Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 |