Megosztás a következőn keresztül:


MFSampleExtension_VideoEncodeQPMap attribútum

Egy kódolt videókeretben tárolja az egyes blokkokhoz használt kvantálási paraméter (QP) értékeinek térképét.

Adattípus

Egy IMFMediaBuffer.

Megjegyzések

A QP-térkép elérése lehetővé teszi a fejlesztők számára a videókódolási minőség elemzését és optimalizálását. Ez az attribútum lehetővé teszi a tömörítési hatékonyság kiértékelését, a minőségi inkonzisztenciák észlelését és a kódolási beállítások finomhangolását a jobb vizuális hűség és bitráta-vezérlés érdekében.

A QP-térkép egy QP-értékek tömbje, amely a uint8_t típusával rendelkezik. Minden blokk egy QP-értékkel rendelkezik. A fejlesztőnek meg kell határoznia a QP-térkép méretét a CODECAPI_AVEncVideoOutputQPMapBlockSize és a videókeret szélessége és magassága alapján (Ossza el a szélességet/magasságot a blokk méretével). Ha a szélesség/magasság nem a blokkméret pontos többszöröse, kerekítsd fel a blokkméret következő többszörösére) . Ez biztosítja a sorok és oszlopok számát, biztosítva a videokerettel való megfelelő igazítást. A térkép balról jobbra és felülről lefelé halad.

Az IMFAttributes::SetUnknown parancsot használva csatolhat egy, a QP-térképet tartalmazó IMFMediaBuffert egy kimeneti mintához. Az IMFAttributes::GetUnknown használatával lekérheti a QP-térképet tartalmazó IMFMediaBuffert egy kimeneti mintából.

A QP-térképet csak akkor kell jelenteni, ha a teljes keret kódolása befejeződött. Ha a kódoló több szeletet használ, a PSNR-puffert az utolsó szelet IMFSample-éhez kell csatolni.

A QP-térkép 8 bites QP-értékeinek értelmezése a vonatkozó kodek specifikációja által meghatározott érvényes QP-tartománytól függ. Nagyobb bitmélység (pl. 10 bites) esetén egyes hardvergyártók (IHV-k) a végső kódolású QP-tartomány (például [0, 63]) helyett használhatják a belső kvantálási indextartományt (pl. [-12, 51] 10 bites HEVC esetén). Ez a belső tartomány a QP-értékek bitmélységhez (Qp = qpY + QpBdOffsetY) viszonyított beállítását tükrözi az átalakítás és a kvantálási lépések során, a kodek szabványában meghatározott módon. A QP-térkép felhasználóinak konzultálnia kell az illesztőprogram dokumentációjában ezeknek az értékeknek a helyes értelmezéséhez és szükség esetén a megfelelő eltoláskorrekció alkalmazásához.

Példák

Az alábbi példa egy olyan segédfüggvényt mutat be, amelyet az ICodecAPI-t támogató kódoló MFT implementációi használhatnak. A függvény bemutatja, hogyan ellenőrizheti, hogy a QP-térképjelentés engedélyezve van-e a kódoló MFT-ben. Ha engedélyezve van, a függvény bemutatja, hogyan csatolhatja a QP-térképet a kimeneti mintához. Ez feltételezi, hogy minden kimeneti minta teljes keretet tartalmaz. Ha a kódoló több szeletet használ, a QP-térképet csak az utolsó szelet IMFSample-éhez kell csatolni.

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

Az alábbi példa bemutatja, hogy egy alkalmazás hogyan tudja lekérni a QP-leképezési adatokat a kódoló MFT által létrehozott IMFSample-objektumokból .

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

}

Követelmények

Követelmény Érték
Minimálisan támogatott ügyfél Windows 11, build 26100
Minimálisan támogatott kiszolgáló Windows Server 2025
Fejléc mfapi.h