Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сохраняет значения пикового коэффициента сигнала к шуму (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 |
|