Bagikan melalui


atribut MFSampleExtension_VideoEncodeQPMap

Menyimpan peta nilai Parameter Kuantisasi (QP) yang digunakan untuk setiap blok dalam bingkai video yang dikodekan.

Jenis data

IMFMediaBuffer.

Komentar

Mengakses peta QP memungkinkan pengembang menganalisis dan mengoptimalkan kualitas pengodean video. Atribut ini memungkinkan mereka untuk mengevaluasi efisiensi kompresi, mendeteksi inkonsistensi kualitas, dan menyempurnakan pengaturan pengodean untuk keakuratan visual dan kontrol laju bit yang lebih baik.

Peta QP adalah array nilai QP dengan jenis uint8_t. Setiap blok memiliki satu nilai QP. Pengembang harus menentukan ukuran peta QP menggunakan CODECAPI_AVEncVideoOutputQPMapBlockSize dan lebar dan tinggi bingkai video (Bagi lebar/tinggi dengan ukuran blok. Jika lebar/tinggi bukan kelipatan yang tepat dari ukuran blok, bulatkan ke kelipatan berikutnya dari ukuran blok) . Ini menyediakan jumlah baris dan kolom, memastikan perataan yang tepat dengan bingkai video. Petanya dari kiri ke kanan dan atas ke bawah.

Gunakan IMFAttributes::SetUnknown untuk melampirkan IMFMediaBuffer yang berisi peta QP ke sampel output. Gunakan IMFAttributes::GetUnknown untuk mengambil IMFMediaBuffer yang berisi peta QP dari sampel output.

Peta QP hanya boleh dilaporkan ketika seluruh bingkai telah menyelesaikan pengodean. Jika encoder menggunakan beberapa irisan, buffer PSNR harus dilampirkan ke IMFSample dari irisan terakhir.

Interpretasi nilai QP 8-bit dalam peta QP tergantung pada rentang QP yang valid yang ditentukan oleh spesifikasi codec yang berlaku. Untuk kedalaman bit yang lebih tinggi (misalnya, 10-bit), beberapa vendor perangkat keras (IHV) dapat menggunakan rentang indeks kuantizer internal (misalnya, [-12, 51] untuk HEVC 10-bit) alih-alih rentang QP yang dikodekan akhir (misalnya, [0, 63]). Rentang internal ini mencerminkan bagaimana nilai QP disesuaikan relatif terhadap kedalaman bit (Qp = qpY + QpBdOffsetY) selama langkah transformasi dan kuantisasi, seperti yang ditentukan dalam standar codec. Konsumen peta QP harus berkonsultasi dengan dokumentasi driver untuk menginterpretasikan nilai-nilai ini dengan benar dan menerapkan koreksi offset yang sesuai jika perlu.

Contoh

Contoh berikut menunjukkan fungsi pembantu yang dapat digunakan oleh implementasi MFT encoder yang mendukung ICodecAPI. Fungsi ini menunjukkan cara memeriksa apakah pelaporan peta QP diaktifkan pada MFT encoder. Jika diaktifkan, fungsi menunjukkan cara melampirkan peta QP ke sampel output. Ini mengasumsikan bahwa setiap sampel output berisi bingkai lengkap. Jika encoder menggunakan beberapa irisan, peta QP harus dilampirkan hanya ke IMFSample dari irisan terakhir.

#include <mfapi.h> 
#include <mfobjects.h> 
#include <codecapi.h> 
#include <wil.com.h>
#include <wil/result_macros.h>

// Function to query and attach QP map to output samples 
HRESULT ReportQPMapOnOutputSample( 
    _In_ IMFTransform* encoder,  
    _In_ IMFSample* outputSample,  
    _In_ IMFMediaBuffer* qPMap // IMFMediaBuffer could be the GPU resource for QP 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, qPMap); 

    // Query the encoder's codec API to check if QP 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_AVEncVideoOutputQPMapBlockSize, &value)); 

    if (value.vt != VT_UI4 || !value.ulVal) { 
        return S_OK; // QP Map not enabled 
    } 

    // Attach the IMFMediaBuffer (QP Map) to the output sample's attributes 
    wil::com_ptr_nothrow<IMFAttributes> sampleAttributes; 
    RETURN_IF_FAILED(wil::com_ptr_nothrow(outputSample, &sampleAttributes)); 

    return sampleAttributes->SetUnknown(MFSampleExtension_VideoEncodeQPMap, qPMap); 
} 

Contoh berikut menunjukkan bagaimana aplikasi dapat mengambil data peta QP dari objek IMFSample yang diproduksi oleh MFT encoder.

#include <mfapi.h> 
#include <mfobjects.h> 
#include <codecapi.h> 
#include <wil.com.h>
#include <wil/result_macros.h>

// Function to retrieve the QP map from an output sample. 
HRESULT RetrieveQPMapFromOutputSample( 
    _In_ IMFSample* outputSample,  
    _COM_Outptr_result_maybenull_ IMFMediaBuffer** qPMapBuffer // Output: IMFMediaBuffer containing the QP map 
) 
{ 
    RETURN_HR_IF_NULL(E_INVALIDARG, qPMapBuffer); 
    *qPMapBuffer = 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 QP map 
    (void)sampleAttributes->GetUnknown(MFSampleExtension_VideoEncodeQPMap, IID_PPV_ARGS(qPMapBuffer)); 

    return S_OK; 

}

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 11, build 26100
Server minimum yang didukung Windows Server 2025
Kepala Halaman mfapi.h