From 700ccea3191b3bf243ecbd6f62b877fc772bb95d Mon Sep 17 00:00:00 2001 From: Sil Vilerino Date: Mon, 15 Sep 2025 10:12:02 -0400 Subject: [PATCH] mediafoundation: Implement video encode spatial adaptive quantization interface Reviewed-by: Pohsiang (John) Hsu Reviewed-by: Jesse Natalie Part-of: --- src/gallium/frontends/mediafoundation/codecapi.cpp | 9 +++++++++ src/gallium/frontends/mediafoundation/encode_h264.cpp | 4 ++++ src/gallium/frontends/mediafoundation/encode_hevc.cpp | 4 ++++ .../frontends/mediafoundation/encoder_capabilities.cpp | 3 +++ .../frontends/mediafoundation/encoder_capabilities.h | 3 +++ 5 files changed, 23 insertions(+) diff --git a/src/gallium/frontends/mediafoundation/codecapi.cpp b/src/gallium/frontends/mediafoundation/codecapi.cpp index 37058aea16e..ef0fc8c3bf2 100644 --- a/src/gallium/frontends/mediafoundation/codecapi.cpp +++ b/src/gallium/frontends/mediafoundation/codecapi.cpp @@ -449,6 +449,15 @@ CDX12EncHMFT::IsSupported( const GUID *Api ) } } + if( m_EncoderCapabilities.m_HWSupportSpatialAdaptiveQuantization.bits.max_spatial_adaptive_quantization_strength > 0 ) + { + if( *Api == CODECAPI_AVEncVideoEnableSpatialAdaptiveQuantization ) + { + hr = S_OK; + return hr; + } + } + done: return hr; } diff --git a/src/gallium/frontends/mediafoundation/encode_h264.cpp b/src/gallium/frontends/mediafoundation/encode_h264.cpp index ddd00a897ee..73c1aa91e1e 100644 --- a/src/gallium/frontends/mediafoundation/encode_h264.cpp +++ b/src/gallium/frontends/mediafoundation/encode_h264.cpp @@ -626,6 +626,10 @@ CDX12EncHMFT::PrepareForEncodeHelper( LPDX12EncodeContext pDX12EncodeContext, bo pPicInfo->rate_ctrl[rate_ctrl_active_layer_index].frame_rate_num = m_FrameRate.Numerator; pPicInfo->rate_ctrl[rate_ctrl_active_layer_index].frame_rate_den = m_FrameRate.Denominator; + // Spatial Quantization + pPicInfo->rate_ctrl[rate_ctrl_active_layer_index].spatial_adaptive_quantization_strength = + m_bVideoEnableSpatialAdaptiveQuantization ? 1u : 0u; + debug_printf( "[dx12 hmft 0x%p] MFT frontend submission - POC %d picture_type %s num_slice_descriptors %d\n", this, pPicInfo->pic_order_cnt, diff --git a/src/gallium/frontends/mediafoundation/encode_hevc.cpp b/src/gallium/frontends/mediafoundation/encode_hevc.cpp index 46f53aef134..2b758bae6ef 100644 --- a/src/gallium/frontends/mediafoundation/encode_hevc.cpp +++ b/src/gallium/frontends/mediafoundation/encode_hevc.cpp @@ -609,6 +609,10 @@ CDX12EncHMFT::PrepareForEncodeHelper( LPDX12EncodeContext pDX12EncodeContext, bo pPicInfo->rc[rate_ctrl_active_layer_index].vbv_buf_initial_size = m_uiBufferInLevel; } + // Spatial Quantization + pPicInfo->rc[rate_ctrl_active_layer_index].spatial_adaptive_quantization_strength = + m_bVideoEnableSpatialAdaptiveQuantization ? 1u : 0u; + // Frame Rate pPicInfo->rc[rate_ctrl_active_layer_index].frame_rate_num = m_FrameRate.Numerator; pPicInfo->rc[rate_ctrl_active_layer_index].frame_rate_den = m_FrameRate.Denominator; diff --git a/src/gallium/frontends/mediafoundation/encoder_capabilities.cpp b/src/gallium/frontends/mediafoundation/encoder_capabilities.cpp index 67c0643269b..3e2eec57a9f 100644 --- a/src/gallium/frontends/mediafoundation/encoder_capabilities.cpp +++ b/src/gallium/frontends/mediafoundation/encoder_capabilities.cpp @@ -161,4 +161,7 @@ encoder_capabilities::initialize( pipe_screen *pScreen, pipe_video_profile video d3d12_interop_device_info1 screen_interop_info = {}; bool successQuery = pScreen->interop_query_device_info(pScreen, sizeof(d3d12_interop_device_info1), &screen_interop_info) != 0; m_bHWSupportsQueuePriorityManagement = successQuery && screen_interop_info.set_context_queue_priority_manager != NULL; + + m_HWSupportSpatialAdaptiveQuantization.value = + pScreen->get_video_param( pScreen, videoProfile, PIPE_VIDEO_ENTRYPOINT_ENCODE, PIPE_VIDEO_CAP_ENC_SPATIAL_ADAPTIVE_QUANTIZATION ); } diff --git a/src/gallium/frontends/mediafoundation/encoder_capabilities.h b/src/gallium/frontends/mediafoundation/encoder_capabilities.h index 9c3fb65aaf4..2e137fab50f 100644 --- a/src/gallium/frontends/mediafoundation/encoder_capabilities.h +++ b/src/gallium/frontends/mediafoundation/encoder_capabilities.h @@ -137,4 +137,7 @@ class encoder_capabilities // Driver supports queue priority management bool m_bHWSupportsQueuePriorityManagement = false; + + // Spatial Adaptive Quantization + union pipe_enc_cap_spatial_adaptive_quantization m_HWSupportSpatialAdaptiveQuantization = {}; };