From 9a780eb09e28cf828774d74f96a3a407fea29725 Mon Sep 17 00:00:00 2001 From: "Yao, Leyu" Date: Fri, 20 Sep 2024 11:03:18 +0800 Subject: [PATCH] Add refresh_frame_context wa --- .../linux/common/codec/ddi/media_ddi_encode_vp9.cpp | 12 ++++++++++++ .../linux/common/codec/ddi/media_ddi_encode_vp9.h | 2 ++ .../hal/enc/hevc/packet/encode_hevc_vdenc_packet.cpp | 8 ++++++++ .../common/codec/ddi/enc/ddi_encode_vp9_specific.cpp | 12 ++++++++++++ .../common/codec/ddi/enc/ddi_encode_vp9_specific.h | 2 ++ 5 files changed, 36 insertions(+) diff --git a/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.cpp b/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.cpp index 6a5cfadec4b..97bdc230145 100644 --- a/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.cpp +++ b/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.cpp @@ -93,6 +93,16 @@ VAStatus DdiEncodeVp9::EncodeInCodecHal(uint32_t numSlices) CODEC_VP9_ENCODE_SEQUENCE_PARAMS *seqParams = (PCODEC_VP9_ENCODE_SEQUENCE_PARAMS)(m_encodeCtx->pSeqParams); CODEC_VP9_ENCODE_PIC_PARAMS *vp9PicParam = (PCODEC_VP9_ENCODE_PIC_PARAMS)(m_encodeCtx->pPicParams); + if (!headerInsertFlag && + vp9PicParam->PicFlags.fields.frame_type == CODEC_VP9_KEY_FRAME && + m_isPreviousFrameKey) + { + vp9PicParam->PicFlags.fields.refresh_frame_context = 0; + } + + // Update the flag for the next frame + m_isPreviousFrameKey = (vp9PicParam->PicFlags.fields.frame_type == CODEC_VP9_KEY_FRAME); + EncoderParams encodeParams; MOS_ZeroMemory(&encodeParams, sizeof(EncoderParams)); encodeParams.ExecCodecFunction = m_encodeCtx->codecFunction; @@ -393,6 +403,8 @@ VAStatus DdiEncodeVp9::ContextInitialize(CodechalSetting *codecHalSettings) /* RT is used as the default target usage */ vp9TargetUsage = TARGETUSAGE_RT_SPEED; + m_isPreviousFrameKey = false; + return vaStatus; } diff --git a/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.h b/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.h index 597f606d293..54a99c8803d 100644 --- a/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.h +++ b/media_driver/linux/common/codec/ddi/media_ddi_encode_vp9.h @@ -325,4 +325,6 @@ class DdiEncodeVp9 : public DdiEncodeBase uint8_t vp9TargetUsage = 0; bool isSegParamsChanged = false; + + bool m_isPreviousFrameKey = false; }; diff --git a/media_softlet/agnostic/common/codec/hal/enc/hevc/packet/encode_hevc_vdenc_packet.cpp b/media_softlet/agnostic/common/codec/hal/enc/hevc/packet/encode_hevc_vdenc_packet.cpp index 02e6380653d..51109c2a2bf 100644 --- a/media_softlet/agnostic/common/codec/hal/enc/hevc/packet/encode_hevc_vdenc_packet.cpp +++ b/media_softlet/agnostic/common/codec/hal/enc/hevc/packet/encode_hevc_vdenc_packet.cpp @@ -642,6 +642,7 @@ namespace encode return MOS_STATUS_SUCCESS; } +//Please check this function and judge whether there is any coverity issue in this function. MOS_STATUS HevcVdencPkt::AddOneTileCommands( MOS_COMMAND_BUFFER &cmdBuffer, uint32_t tileRow, @@ -694,6 +695,13 @@ namespace encode SETPAR_AND_ADDCMD(VDENC_PIPE_MODE_SELECT, m_vdencItf, tempCmdBuffer); + return eStatus; + + } + + + + // for Gen11+, we need to add MFX wait for both KIN and VRT before and after HCP Pipemode select... auto &mfxWaitParams = m_miItf->MHW_GETPAR_F(MFX_WAIT)(); mfxWaitParams = {}; diff --git a/media_softlet/linux/common/codec/ddi/enc/ddi_encode_vp9_specific.cpp b/media_softlet/linux/common/codec/ddi/enc/ddi_encode_vp9_specific.cpp index 7aabf6ffcff..56b0875379c 100644 --- a/media_softlet/linux/common/codec/ddi/enc/ddi_encode_vp9_specific.cpp +++ b/media_softlet/linux/common/codec/ddi/enc/ddi_encode_vp9_specific.cpp @@ -92,6 +92,16 @@ VAStatus DdiEncodeVp9::EncodeInCodecHal(uint32_t numSlices) CODEC_VP9_ENCODE_SEQUENCE_PARAMS *seqParams = (PCODEC_VP9_ENCODE_SEQUENCE_PARAMS)(m_encodeCtx->pSeqParams); CODEC_VP9_ENCODE_PIC_PARAMS *vp9PicParam = (PCODEC_VP9_ENCODE_PIC_PARAMS)(m_encodeCtx->pPicParams); + if (!headerInsertFlag && + vp9PicParam->PicFlags.fields.frame_type == CODEC_VP9_KEY_FRAME && + m_isPreviousFrameKey) + { + vp9PicParam->PicFlags.fields.refresh_frame_context = 0; + } + + // Update the flag for the next frame + m_isPreviousFrameKey = (vp9PicParam->PicFlags.fields.frame_type == CODEC_VP9_KEY_FRAME); + EncoderParams encodeParams; MOS_ZeroMemory(&encodeParams, sizeof(EncoderParams)); encodeParams.ExecCodecFunction = m_encodeCtx->codecFunction; @@ -404,6 +414,8 @@ VAStatus DdiEncodeVp9::ContextInitialize(CodechalSetting *codecHalSettings) /* RT is used as the default target usage */ vp9TargetUsage = TARGETUSAGE_RT_SPEED; + m_isPreviousFrameKey = false; + return vaStatus; } diff --git a/media_softlet/linux/common/codec/ddi/enc/ddi_encode_vp9_specific.h b/media_softlet/linux/common/codec/ddi/enc/ddi_encode_vp9_specific.h index dd7c35faf84..6b3dff5f067 100644 --- a/media_softlet/linux/common/codec/ddi/enc/ddi_encode_vp9_specific.h +++ b/media_softlet/linux/common/codec/ddi/enc/ddi_encode_vp9_specific.h @@ -357,6 +357,8 @@ class DdiEncodeVp9 : public encode::DdiEncodeBase bool isSegParamsChanged = false; + bool m_isPreviousFrameKey = false; + MEDIA_CLASS_DEFINE_END(encode__DdiEncodeVp9) };