From cd308e3fa8d1b73d2dc268efbc8bd12b8972c8b9 Mon Sep 17 00:00:00 2001 From: jeffqjiangNew <142832361+jeffqjiangNew@users.noreply.github.com> Date: Thu, 25 Jul 2024 14:55:14 -0400 Subject: [PATCH] * rocDecode/AV1: Added support for getting frame size from reference frames case. Fixed the data type of several quantization parameters. (#397) [ROCm/rocdecode commit: 96944030aa2d9d8c6cb43970de6b2eb2fb716a14] --- projects/rocdecode/src/parser/av1_defines.h | 12 ++++----- projects/rocdecode/src/parser/av1_parser.cpp | 28 +++++++++++++------- projects/rocdecode/src/parser/av1_parser.h | 21 +++++++++------ 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/projects/rocdecode/src/parser/av1_defines.h b/projects/rocdecode/src/parser/av1_defines.h index 8af6f0fde2..778f516fef 100644 --- a/projects/rocdecode/src/parser/av1_defines.h +++ b/projects/rocdecode/src/parser/av1_defines.h @@ -279,13 +279,13 @@ typedef struct { typedef struct { uint32_t base_q_idx; uint32_t delta_coded; - uint32_t delta_q; - uint32_t delta_q_y_dc; + int32_t delta_q; + int32_t delta_q_y_dc; uint32_t diff_uv_delta; - uint32_t delta_q_u_dc; - uint32_t delta_q_u_ac; - uint32_t delta_q_v_dc; - uint32_t delta_q_v_ac; + int32_t delta_q_u_dc; + int32_t delta_q_u_ac; + int32_t delta_q_v_dc; + int32_t delta_q_v_ac; uint32_t using_qmatrix; uint32_t qm_y; uint32_t qm_u; diff --git a/projects/rocdecode/src/parser/av1_parser.cpp b/projects/rocdecode/src/parser/av1_parser.cpp index 2d1f4273de..d44030d51e 100644 --- a/projects/rocdecode/src/parser/av1_parser.cpp +++ b/projects/rocdecode/src/parser/av1_parser.cpp @@ -477,6 +477,11 @@ void Av1VideoParser::UpdateRefFrames() { dpb_buffer_.ref_valid[i] = 1; dpb_buffer_.ref_frame_id[i] = frame_header_.current_frame_id; dpb_buffer_.ref_frame_type[i] = frame_header_.frame_type; + dpb_buffer_.ref_upscaled_width[i] = frame_header_.frame_size.upscaled_width; + dpb_buffer_.ref_frame_width[i] = frame_header_.frame_size.frame_width; + dpb_buffer_.ref_frame_height[i] = frame_header_.frame_size.frame_height; + dpb_buffer_.ref_render_width[i] = frame_header_.render_size.render_width; + dpb_buffer_.ref_render_height[i] = frame_header_.render_size.render_height; dpb_buffer_.ref_order_hint[i] = frame_header_.order_hint; for (int j = 0; j < REFS_PER_FRAME; j++) { dpb_buffer_.saved_order_hints[i][j + kLastFrame] = frame_header_.order_hints[j + kLastFrame]; @@ -513,6 +518,11 @@ void Av1VideoParser::UpdateRefFrames() { void Av1VideoParser::LoadRefFrame() { int ref_idx = frame_header_.frame_to_show_map_idx; frame_header_.current_frame_id = dpb_buffer_.ref_frame_id[ref_idx]; + frame_header_.frame_size.upscaled_width = dpb_buffer_.ref_upscaled_width[ref_idx]; + frame_header_.frame_size.frame_width = dpb_buffer_.ref_frame_width[ref_idx]; + frame_header_.frame_size.frame_height = dpb_buffer_.ref_frame_height[ref_idx]; + frame_header_.render_size.render_width = dpb_buffer_.ref_render_width[ref_idx]; + frame_header_.render_size.render_height = dpb_buffer_.ref_render_height[ref_idx]; frame_header_.order_hint = dpb_buffer_.ref_order_hint[ref_idx]; for (int j = 0; j < REFS_PER_FRAME; j++) { frame_header_.order_hints[j + kLastFrame] = dpb_buffer_.saved_order_hints[ref_idx][j + kLastFrame]; @@ -1535,15 +1545,13 @@ void Av1VideoParser::FrameSizeWithRefs(const uint8_t *p_stream, size_t &offset, for (int i = 0; i < REFS_PER_FRAME; i++) { p_frame_header->found_ref = Parser::GetBit(p_stream, offset); if (p_frame_header->found_ref) { - // Todo - ERR("Warning: Need to implement! found_ref == 1 case.\n"); -#if 0 - UpscaledWidth = RefUpscaledWidth[ ref_frame_idx[ i ] ] - FrameWidth = UpscaledWidth - FrameHeight = RefFrameHeight[ ref_frame_idx[ i ] ] - RenderWidth = RefRenderWidth[ ref_frame_idx[ i ] ] - RenderHeight = RefRenderHeight[ ref_frame_idx[ i ] ] -#endif + frame_header_.frame_size.upscaled_width = dpb_buffer_.ref_upscaled_width[frame_header_.ref_frame_idx[i]]; + frame_header_.frame_size.frame_width = frame_header_.frame_size.upscaled_width; + frame_header_.frame_size.frame_width_minus_1 = frame_header_.frame_size.frame_width - 1; + frame_header_.frame_size.frame_height = dpb_buffer_.ref_frame_height[frame_header_.ref_frame_idx[i]]; + frame_header_.frame_size.frame_height_minus_1 = frame_header_.frame_size.frame_height - 1; + frame_header_.render_size.render_width = dpb_buffer_.ref_render_width[frame_header_.ref_frame_idx[i]]; + frame_header_.render_size.render_height = dpb_buffer_.ref_render_height[frame_header_.ref_frame_idx[i]]; break; } } @@ -1772,7 +1780,7 @@ void Av1VideoParser::QuantizationParams(const uint8_t *p_stream, size_t &offset, } } -uint32_t Av1VideoParser::ReadDeltaQ(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header) { +int32_t Av1VideoParser::ReadDeltaQ(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header) { p_frame_header->quantization_params.delta_coded = Parser::GetBit(p_stream, offset); if (p_frame_header->quantization_params.delta_coded) { p_frame_header->quantization_params.delta_q = ReadSigned(p_stream, offset, 1 + 6); diff --git a/projects/rocdecode/src/parser/av1_parser.h b/projects/rocdecode/src/parser/av1_parser.h index d94524a387..04f92f1eda 100644 --- a/projects/rocdecode/src/parser/av1_parser.h +++ b/projects/rocdecode/src/parser/av1_parser.h @@ -92,12 +92,17 @@ public: // subsequent pictures. The value is the index of a frame in DPB buffer pool. If an entry is // not used as reference, the value should be -1. int virtual_buffer_index[NUM_REF_FRAMES]; // VBI - int ref_frame_type[NUM_REF_FRAMES]; - int ref_frame_id[NUM_REF_FRAMES]; - int ref_order_hint[NUM_REF_FRAMES]; - int ref_valid[NUM_REF_FRAMES]; - uint32_t saved_order_hints[NUM_REF_FRAMES][NUM_REF_FRAMES]; - int32_t saved_gm_params[NUM_REF_FRAMES][NUM_REF_FRAMES][6]; + int ref_valid[NUM_REF_FRAMES]; // RefValid + int ref_frame_type[NUM_REF_FRAMES]; // RefFrameType + int ref_frame_id[NUM_REF_FRAMES]; // RefFrameId + uint32_t ref_upscaled_width[NUM_REF_FRAMES]; // RefUpscaledWidth + uint32_t ref_frame_width[NUM_REF_FRAMES]; // RefFrameWidth + uint32_t ref_frame_height[NUM_REF_FRAMES]; // RefFrameHeight + uint32_t ref_render_width[NUM_REF_FRAMES]; // RefRenderWidth + uint32_t ref_render_height[NUM_REF_FRAMES]; // RefRenderHeight + int ref_order_hint[NUM_REF_FRAMES]; // RefOrderHint + uint32_t saved_order_hints[NUM_REF_FRAMES][NUM_REF_FRAMES]; // SavedOrderHints + int32_t saved_gm_params[NUM_REF_FRAMES][NUM_REF_FRAMES][6]; // SavedGmParams int32_t saved_loop_filter_ref_deltas[NUM_REF_FRAMES][TOTAL_REFS_PER_FRAME]; int32_t saved_loop_filter_mode_deltas[NUM_REF_FRAMES][2]; uint8_t saved_feature_enabled[NUM_REF_FRAMES][MAX_SEGMENTS][SEG_LVL_MAX]; @@ -367,9 +372,9 @@ protected: * \param [in] offset Starting bit offset * \param [out] offset Updated bit offset * \param [out] p_frame_header Pointer to frame header struct - * \return None + * \return Delta quantizer value */ - uint32_t ReadDeltaQ(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header); + int32_t ReadDeltaQ(const uint8_t *p_stream, size_t &offset, Av1FrameHeader *p_frame_header); /*! \brief Function to segmentation parameters * \param [in] p_stream Pointer to the bit stream