Aracılığıyla paylaş


MFSampleExtension_VideoEncodeBitsUsedMap özniteliği

Kodlanmış bir video çerçevesinde her bloğu kodlamak için kullanılan bit sayısının bir haritasını depolar.

Veri türü

Bir IMFMediaBuffer.

Açıklamalar

Kullanılan bit eşlemesine erişmek, geliştiricilerin kodlanmış bir çerçevede bit ayırmayı analiz etmesine olanak tanır. Bu, verimsizlikleri tanılamaya, kodlama stratejilerini ayarlamaya ve videonun kritik bölgelerinin uygun bit ayırmasını aldığından emin olmasına yardımcı olabilir.

Kullanılan bit eşlemesi bir uint32_t dizisidir. Her bloğun, bloğu kodlamada kullanılan bit sayısını temsil eden bir uint32_t değeri vardır. Geliştirici , CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize ve video çerçevesi genişliği ve yüksekliği kullanarak haritanın boyutunu belirlemelidir (Genişliği/yüksekliği blok boyutuna bölün. Genişlik/yükseklik, blok boyutunun tam katı değilse, blok boyutunun sonraki katına yuvarlayın. Bu, satır ve sütun sayısını sağlayarak video çerçevesine uygun hizalamayı sağlar. Harita soldan sağa ve yukarıdan aşağıya doğrudur.

Çıkış örneğine QP eşlemesini içeren bir IMFMediaBuffer eklemek için IMFAttributes::SetUnknown kullanın. Çıkış örneğinden QP haritasını içeren IMFMediaBuffer'ı almak için IMFAttributes::GetUnknown kullanın.

Kullanılan bit eşlemesi yalnızca çerçevenin tamamı kodlamayı tamamladığında bildirilmelidir. Kodlayıcı birden çok dilim kullanıyorsa, PSNR arabelleği son dilimin IMFSample'ına eklenmelidir.

Örnekler

Aşağıdaki örnek, kullanılan bit eşleme özelliğini raporlamayı etkinleştirmek veya devre dışı bırakmak üzere bir kodlayıcı MFT'sini yapılandırmak için CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize özelliğinin nasıl kullanılacağını gösterir. Blok boyutu sıfırsa devre dışı bırakılır. Sıfır değilse etkinleştirilir.

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

Aşağıdaki örnekte , ICodecAPI'yi destekleyen bir kodlayıcı MFT'sinin uygulamaları tarafından kullanılabilecek bir yardımcı işlev gösterilmektedir. işlevi, kodlayıcı MFT'sinde kullanılan bit eşleme raporlamasının etkinleştirilip etkinleştirilmediğinin nasıl denetlendiğini gösterir. Etkinleştirilirse işlev, kullanılan bit eşlemesinin çıkış örneğine nasıl eklenip eklenmediğini gösterir. Bu, her çıkış örneğinin eksiksiz bir çerçeve içerdiğini varsayar. Kodlayıcı birden çok dilim kullanıyorsa, kullanılan bitler haritası yalnızca son dilimin IMFSample'sine eklenmelidir.

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

Aşağıdaki örnekte, bir uygulamanın kodlayıcı MFT tarafından üretilen IMFSample nesnelerinden kullanılan bit eşleme verilerini nasıl alabildiği gösterilmektedir.

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

} 

Gereksinimler

Gereksinim Değer
Desteklenen en düşük düzeydeki istemci Windows 11, derleme 26100
Desteklenen en düşük sunucu Windows Server 2025
Başlık mfapi.h