MFSampleExtension_FramePsnrYuv attribute

Сохраняет значения пикового коэффициента сигнала к шуму (PSNR) для плоскостей Y, U и V в закодированном видеокадре.

Data type

МВФMediaBuffer, содержащий структуру MFSampleExtensionPsnrYuv.

Remarks

Используйте МВФAttributes::SetUnknown для подключения МВФMediaBuffer , содержащего значения PSNR к выходному образцу. Используйте МВФAttributes::GetUnknown для получения МВФMediaBuffer , содержащего значения PSNR из выходного примера. МВФMediaBuffer содержит память, которая соответствует размеру структуры MFSampleExtensionPsnrYuv.

PSNR следует сообщать только в том случае, если весь кадр завершил кодировку. Если кодировщик использует несколько срезов, буфер PSNR должен быть присоединен к МВФSample последнего среза.

Если кодировщик поддерживает только PSNR для плоскости Y, поля psnrU и psnrV должны быть равны нулю.

MFCreateDXGISurfaceBuffer можно использовать для преобразования ресурса GPU в МВФMediaBuffer.

Examples

В следующем примере показана вспомогательной функции, которая может использоваться реализацией MFT кодировщика, поддерживающей ICodecAPI. Функция показывает, как проверить, включены ли отчеты о качествах в MFT кодировщика. Если она включена, функция показывает, как подключить метрики качества к выходному образцу. Предполагается, что каждый выходной пример содержит полный кадр. Если кодировщик использует несколько срезов, метрики качества должны быть присоединены только к МВФSample последнего среза.

#include <mfapi.h> 
#include <mfobjects.h> 
#include <codecapi.h> 
#include <wrl.h> 

// Function to query and attach PSNR values to output samples 
HRESULT ReportPsnrOnOutputSample( 
    _In_ IMFTransform* encoder,  
    _In_ IMFSample* outputSample,  
    _In_ IMFMediaBuffer* psnrBuffer // Pre-created buffer containing PSNR values 
) 
{

    RETURN_HR_IF_NULL(E_INVALIDARG, encoder); 
    RETURN_HR_IF_NULL(E_INVALIDARG, outputSample); 
    RETURN_HR_IF_NULL(E_INVALIDARG, psnrBuffer); 

    // Check if quality metrics (Frame PSNR) are 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_AVEncVideoEnableFramePsnrYuv, &value)); 

    if (value.vt != VT_BOOL || !value.boolVal) {
        return S_OK; // Frame PSNR metric not enabled 
    } 

    // Retrieve the sample attributes 
    wil::com_ptr_nothrow<IMFAttributes> sampleAttributes; 
    RETURN_IF_FAILED(wil::com_query_to_nothrow(outputSample, &sampleAttributes)); 

    // Attach the pre-created IMFMediaBuffer to the sample's attributes 
    return sampleAttributes->SetUnknown(MFSampleExtension_FramePsnrYuv, psnrBuffer); 

В следующем примере показано, как приложение может получить данные метрик качества из объектов МВФSample , созданных кодировщиком MFT.

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

// Function to retrieve the quality metrics from an IMFSample that an encoder MFT has provided as its 
// output. 
// The function sets the output parameter "found", to true, if quality metrics were retrieved. 

HRESULT RetrievePsnrFromOutputSample( 
    _In_ IMFSample* outputSample,  
    _Out_ MFSampleExtensionPsnrYuv* psnrValues, 
    _Out_ bool* found 
) 
{ 
    RETURN_HR_IF_NULL(E_INVALIDARG, psnrValues); 
    *psnrValues = {}; 
    *found = false; 

    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 containing the PSNR values 
    wil::com_ptr_nothrow<IMFMediaBuffer> psnrBuffer; 

    if (SUCCEEDED(sampleAttributes->GetUnknown(MFSampleExtension_FramePsnrYuv, IID_PPV_ARGS(&psnrBuffer)))) 
    { 
        BYTE* bufferData; 
        DWORD bufferSize; 
        RETURN_IF_FAILED(psnrBuffer->Lock(&bufferData, nullptr, &bufferSize)); 

        // Validate that the size if of the data contained in the IMFMediaBuffer matches what we expect. 
        // In this code sample, we choose to return an error if fail to retrieve the quality metrics. 

        if (bufferSize <!= (DWORD)sizeof(*psnrValues)) 
        {
            psnrBuffer->Unlock(); 
            RETURN_HR(MF_E_BUFFERTOOSMALLFAIL); 
        } 

        memcpy(psnrValues, bufferData, sizeof(*psnrValues)); 
        psnrBuffer->Unlock(); 
        *found = true;
    } 

    return S_OK; 

} 

Requirements

Requirement Value
Минимальный поддерживаемый клиент
Windows 11 версии 24H2
Минимальный поддерживаемый сервер
None.
Header
Mfapi.h