エンコードされたビデオ フレーム内の各ブロックに使用される量子化パラメーター (QP) 値のマップを格納します。
データの種類
注釈
QP マップにアクセスすると、開発者はビデオ エンコード品質を分析して最適化できます。 この属性を使用すると、圧縮効率の評価、品質の不整合の検出、エンコード設定の微調整を行って、視覚的な忠実性とビットレートの制御を向上できます。
QP マップは、uint8_tの型を持つ QP 値の配列 です。 各ブロックには 1 つの QP 値があります。 開発者は、 CODECAPI_AVEncVideoOutputQPMapBlockSize とビデオ フレームの幅と高さを使用して QP マップのサイズを決定する必要があります (幅/高さをブロック サイズで除算します)。幅/高さがブロック サイズの正確な倍数でない場合は、ブロック サイズの次の倍数に切り上げます)。 これにより、行と列の数が提供され、ビデオ フレームとの適切な配置が保証されます。 マップは左から右、上から下に表示されます。
IMFAttributes::SetUnknown を使用して、QP マップを含む IMFMediaBuffer を出力サンプルにアタッチします。 IMFAttributes::GetUnknown を使用して、出力サンプルから QP マップを含む IMFMediaBuffer を取得します。
QP マップは、フレーム全体のエンコードが完了した場合にのみ報告する必要があります。 エンコーダーが複数のスライスを使用する場合は、PSNR バッファーを最後のスライスの IMFSample にアタッチする必要があります。
QP マップ内の 8 ビット QP 値の解釈は、適用可能なコーデック仕様で定義されている有効な QP 範囲によって異なります。 上位のビット深度 (10 ビットなど) の場合、一部のハードウェア ベンダー (IHV) では、最終的にエンコードされた QP 範囲 (例: [0, 63]) の代わりに内部量子化インデックス範囲 (10 ビット HEVC の場合は [-12, 51] など) を使用できます。 この内部範囲は、コーデック標準で指定されているように、変換および量子化の手順中に QP 値がビット深度 (Qp = qpY + QpBdOffsetY) に対してどのように調整されるかを反映します。 QP マップのコンシューマーは、ドライバーのドキュメントを参照してこれらの値を正しく解釈し、必要に応じて適切なオフセット補正を適用する必要があります。
例示
次の例は、 ICodecAPI をサポートするエンコーダー MFT の実装で使用できるヘルパー関数を示しています。 この関数は、エンコーダー MFT で QP マップ レポートが有効になっているかどうかを確認する方法を示します。 有効になっている場合、関数は出力サンプルに QP マップをアタッチする方法を示します。 これは、各出力サンプルに完全なフレームが含まれていることを前提としています。 エンコーダーが複数のスライスを使用する場合、QP マップは最後のスライスの IMFSample にのみアタッチする必要があります。
#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);
}
次の例は、エンコーダー MFT によって生成された IMFSample オブジェクトからアプリが QP マップ データを取得する方法を示しています。
#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;
}
要求事項
| 要件 | 価値 |
|---|---|
| サポートされている最小のクライアント | Windows 11 ビルド 26100 |
| サポートされている最小のサーバー | Windows Server 2025 |
| ヘッダ | mfapi.h |