Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Speichert eine Zuordnung der QP-Werte (Quantization Parameter), die für jeden Block in einem codierten Videoframe verwendet werden.
Datentyp
Ein IMFMediaBuffer.
Bemerkungen
Durch den Zugriff auf die QP-Karte können Entwickler die Videocodierungsqualität analysieren und optimieren. Dieses Attribut ermöglicht es ihnen, die Komprimierungseffizienz zu bewerten, Qualitätsinkonsistenzen zu erkennen und Codierungseinstellungen für eine bessere Genauigkeit und Bitrate-Steuerung zu optimieren.
Die QP-Zuordnung ist ein Array von QP-Werten mit dem Typ der uint8_t. Jeder Block weist einen QP-Wert auf. Ein Entwickler sollte die Größe der QP-Karte mithilfe von CODECAPI_AVEncVideoOutputQPMapBlockSize und Videoframebreite und -höhe ermitteln (Teilen Sie die Breite/Höhe durch die Blockgröße. Wenn die Breite/Höhe kein genaues Vielfaches der Blockgröße ist, runden Sie sie auf das nächste Vielfache der Blockgröße auf. Dies stellt die Anzahl der Zeilen und Spalten bereit, um eine ordnungsgemäße Ausrichtung mit dem Videoframe sicherzustellen. Die Karte ist von links nach rechts und von oben nach unten.
Verwenden Sie IMFAttributes::SetUnknown , um einen IMFMediaBuffer mit der QP-Zuordnung an ein Ausgabebeispiel anzufügen. Verwenden Sie IMFAttributes::GetUnknown , um den IMFMediaBuffer abzurufen, der die QP-Zuordnung aus einem Ausgabebeispiel enthält.
Die QP-Zuordnung sollte nur gemeldet werden, wenn der gesamte Frame die Codierung abgeschlossen hat. Wenn der Encoder mehrere Segmente verwendet, sollte der PSNR-Puffer an das IMFSample des letzten Slices angefügt werden.
Die Interpretation der 8-Bit-QP-Werte in der QP-Karte hängt von dem gültigen QP-Bereich ab, der durch die entsprechende Codecspezifikation definiert wird. Bei höheren Bittiefen (z. B. 10-Bit) können einige Hardwareanbieter (IHVs) den internen Quantizerindexbereich (z. B. [-12, 51] für 10-Bit-HEVC) anstelle des endgültig codierten QP-Bereichs (z. B. [0, 63]) verwenden. Dieser interne Bereich spiegelt wider, wie QP-Werte relativ zur Bittiefe (Qp = qpY + QpBdOffsetY) während der Transformations- und Quantisierungsschritte angepasst werden, wie im Codecstandard angegeben. Verbraucher der QP-Karte sollten die Treiberdokumentation konsultieren, um diese Werte korrekt zu interpretieren und bei Bedarf entsprechende Offsetkorrektur anzuwenden.
Beispiele
Das folgende Beispiel zeigt eine Hilfsfunktion, die von Implementierungen eines Encoder-MFT verwendet werden kann, der ICodecAPI unterstützt. Die Funktion veranschaulicht, wie Sie überprüfen können, ob die QP-Kartenberichterstattung für den Encoder MFT aktiviert ist. Wenn sie aktiviert ist, zeigt die Funktion, wie die QP-Zuordnung an das Ausgabebeispiel angefügt wird. Dabei wird davon ausgegangen, dass jedes Ausgabebeispiel einen vollständigen Frame enthält. Wenn der Encoder mehrere Segmente verwendet, sollte die QP-Zuordnung nur an den IMFSample des letzten Datenschnitts angefügt werden.
#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);
}
Im folgenden Beispiel wird veranschaulicht, wie eine App die QP-Kartendaten aus den IMFSample-Objekten abrufen kann, die von einem Encoder MFT erstellt werden.
#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;
}
Anforderungen
Anforderung | Wert |
---|---|
Mindest unterstützter Client | Windows 11, Build 26100 |
Unterstützter Mindestserver | Windows Server 2025 |
Kopfzeile | mfapi.h |