From c4dd9027db5c0be024b1026c579b7191893cca0e Mon Sep 17 00:00:00 2001 From: Wenfeng Gao Date: Mon, 2 Jun 2025 08:22:47 -0700 Subject: [PATCH] mediafoundation: enable new CODECAPI properties for frame stats CODECAPI_AVEncVideoEnableFramePsnrYuv CODECAPI_AVEncVideoEnableSpatialAdaptiveQuantization CODECAPI_AVEncVideoOutputQPMapBlockSize CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize Reviewed-By: Sil Vilerino Part-of: --- .../frontends/mediafoundation/codecapi.cpp | 20 ++++++++++++++++++- .../frontends/mediafoundation/encode.cpp | 14 +++---------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/gallium/frontends/mediafoundation/codecapi.cpp b/src/gallium/frontends/mediafoundation/codecapi.cpp index ec170a012fc..69a56d63dd9 100644 --- a/src/gallium/frontends/mediafoundation/codecapi.cpp +++ b/src/gallium/frontends/mediafoundation/codecapi.cpp @@ -246,6 +246,22 @@ StringFromCodecAPI( const GUID *Api ) { return "CODECAPI_AVEncSliceGenerationMode"; } + else if( *Api == CODECAPI_AVEncVideoEnableFramePsnrYuv ) + { + return "CODECAPI_AVEncVideoEnableFramePsnrYuv"; + } + else if( *Api == CODECAPI_AVEncVideoEnableSpatialAdaptiveQuantization ) + { + return "CODECAPI_AVEncVideoEnableSpatialAdaptiveQuantization"; + } + else if( *Api == CODECAPI_AVEncVideoOutputQPMapBlockSize ) + { + return "CODECAPI_AVEncVideoOutputQPMapBlockSize"; + } + else if( *Api == CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize ) + { + return "CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize"; + } return "Unknown CodecAPI"; } @@ -296,7 +312,9 @@ CDX12EncHMFT::IsSupported( const GUID *Api ) *Api == CODECAPI_AVEncVideoMaxNumRefFrame || *Api == CODECAPI_AVEncVideoMeanAbsoluteDifference || *Api == CODECAPI_AVEncVideoMaxQP || *Api == CODECAPI_AVEncVideoGradualIntraRefresh || *Api == CODECAPI_AVScenarioInfo || *Api == CODECAPI_AVEncVideoROIEnabled || *Api == CODECAPI_AVEncVideoLTRBufferControl || - *Api == CODECAPI_AVEncVideoMarkLTRFrame || *Api == CODECAPI_AVEncVideoUseLTRFrame ) + *Api == CODECAPI_AVEncVideoMarkLTRFrame || *Api == CODECAPI_AVEncVideoUseLTRFrame || + *Api == CODECAPI_AVEncVideoEnableFramePsnrYuv || *Api == CODECAPI_AVEncVideoEnableSpatialAdaptiveQuantization || + *Api == CODECAPI_AVEncVideoOutputQPMapBlockSize || *Api == CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize ) { hr = S_OK; return hr; diff --git a/src/gallium/frontends/mediafoundation/encode.cpp b/src/gallium/frontends/mediafoundation/encode.cpp index b54b0a3bd02..046dc2def56 100644 --- a/src/gallium/frontends/mediafoundation/encode.cpp +++ b/src/gallium/frontends/mediafoundation/encode.cpp @@ -309,10 +309,6 @@ CDX12EncHMFT::PrepareForEncode( IMFSample *pSample, LPDX12EncodeContext *ppDX12E } } - // - // TODO: Just to test the backend, needs proper plumbing to CodecAPI - // -#if 0 // TODO: Enable me { // // Create resources for output GPU frame stats @@ -329,9 +325,7 @@ CDX12EncHMFT::PrepareForEncode( IMFSample *pSample, LPDX12EncodeContext *ppDX12E templ.depth0 = 1; templ.array_size = 1; - // TODO: Only allocate these if CodecAPi requested these stats, since there's a perf impact to request them in DX12 driver - - if (m_EncoderCapabilities.m_HWSupportStatsQPMapOutput.bits.supported) + if( m_EncoderCapabilities.m_HWSupportStatsQPMapOutput.bits.supported && m_uiVideoOutputQPMapBlockSize > 0 ) { uint32_t block_size = (1 << m_EncoderCapabilities.m_HWSupportStatsQPMapOutput.bits.log2_values_block_size); templ.format = (enum pipe_format) m_EncoderCapabilities.m_HWSupportStatsQPMapOutput.bits.pipe_pixel_format; @@ -355,7 +349,7 @@ CDX12EncHMFT::PrepareForEncode( IMFSample *pSample, LPDX12EncodeContext *ppDX12E done); } - if (m_EncoderCapabilities.m_HWSupportStatsRCBitAllocationMapOutput.bits.supported) + if( m_EncoderCapabilities.m_HWSupportStatsRCBitAllocationMapOutput.bits.supported && m_uiVideoOutputBitsUsedMapBlockSize > 0 ) { uint32_t block_size = (1 << m_EncoderCapabilities.m_HWSupportStatsRCBitAllocationMapOutput.bits.log2_values_block_size); templ.format = (enum pipe_format) m_EncoderCapabilities.m_HWSupportStatsRCBitAllocationMapOutput.bits.pipe_pixel_format; @@ -367,7 +361,7 @@ CDX12EncHMFT::PrepareForEncode( IMFSample *pSample, LPDX12EncodeContext *ppDX12E done); } - if (m_EncoderCapabilities.m_PSNRStatsSupport.bits.supports_y_channel) + if( m_EncoderCapabilities.m_PSNRStatsSupport.bits.supports_y_channel && m_bVideoEnableFramePsnrYuv ) { struct pipe_resource buffer_templ = {}; buffer_templ.width0 = 3 * sizeof(float); // Up to 3 float components Y, U, V @@ -389,8 +383,6 @@ CDX12EncHMFT::PrepareForEncode( IMFSample *pSample, LPDX12EncodeContext *ppDX12E } } -#endif - memset( &pDX12EncodeContext->encoderPicInfo, 0, sizeof( pDX12EncodeContext->encoderPicInfo ) ); pDX12EncodeContext->encoderPicInfo.base.profile = m_outputPipeProfile;