* rocDecode/AV1: Added support for getting frame size from reference frames case. Fixed the data type of several quantization parameters. (#397)

[ROCm/rocdecode commit: 96944030aa]
이 커밋은 다음에 포함됨:
jeffqjiangNew
2024-07-25 14:55:14 -04:00
커밋한 사람 GitHub
부모 cbe6399706
커밋 cd308e3fa8
3개의 변경된 파일37개의 추가작업 그리고 24개의 파일을 삭제
+6 -6
파일 보기
@@ -279,13 +279,13 @@ typedef struct {
typedef struct { typedef struct {
uint32_t base_q_idx; uint32_t base_q_idx;
uint32_t delta_coded; uint32_t delta_coded;
uint32_t delta_q; int32_t delta_q;
uint32_t delta_q_y_dc; int32_t delta_q_y_dc;
uint32_t diff_uv_delta; uint32_t diff_uv_delta;
uint32_t delta_q_u_dc; int32_t delta_q_u_dc;
uint32_t delta_q_u_ac; int32_t delta_q_u_ac;
uint32_t delta_q_v_dc; int32_t delta_q_v_dc;
uint32_t delta_q_v_ac; int32_t delta_q_v_ac;
uint32_t using_qmatrix; uint32_t using_qmatrix;
uint32_t qm_y; uint32_t qm_y;
uint32_t qm_u; uint32_t qm_u;
+18 -10
파일 보기
@@ -477,6 +477,11 @@ void Av1VideoParser::UpdateRefFrames() {
dpb_buffer_.ref_valid[i] = 1; dpb_buffer_.ref_valid[i] = 1;
dpb_buffer_.ref_frame_id[i] = frame_header_.current_frame_id; dpb_buffer_.ref_frame_id[i] = frame_header_.current_frame_id;
dpb_buffer_.ref_frame_type[i] = frame_header_.frame_type; 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; dpb_buffer_.ref_order_hint[i] = frame_header_.order_hint;
for (int j = 0; j < REFS_PER_FRAME; j++) { for (int j = 0; j < REFS_PER_FRAME; j++) {
dpb_buffer_.saved_order_hints[i][j + kLastFrame] = frame_header_.order_hints[j + kLastFrame]; dpb_buffer_.saved_order_hints[i][j + kLastFrame] = frame_header_.order_hints[j + kLastFrame];
@@ -513,6 +518,11 @@ void Av1VideoParser::UpdateRefFrames() {
void Av1VideoParser::LoadRefFrame() { void Av1VideoParser::LoadRefFrame() {
int ref_idx = frame_header_.frame_to_show_map_idx; int ref_idx = frame_header_.frame_to_show_map_idx;
frame_header_.current_frame_id = dpb_buffer_.ref_frame_id[ref_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]; frame_header_.order_hint = dpb_buffer_.ref_order_hint[ref_idx];
for (int j = 0; j < REFS_PER_FRAME; j++) { for (int j = 0; j < REFS_PER_FRAME; j++) {
frame_header_.order_hints[j + kLastFrame] = dpb_buffer_.saved_order_hints[ref_idx][j + kLastFrame]; 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++) { for (int i = 0; i < REFS_PER_FRAME; i++) {
p_frame_header->found_ref = Parser::GetBit(p_stream, offset); p_frame_header->found_ref = Parser::GetBit(p_stream, offset);
if (p_frame_header->found_ref) { if (p_frame_header->found_ref) {
// Todo frame_header_.frame_size.upscaled_width = dpb_buffer_.ref_upscaled_width[frame_header_.ref_frame_idx[i]];
ERR("Warning: Need to implement! found_ref == 1 case.\n"); frame_header_.frame_size.frame_width = frame_header_.frame_size.upscaled_width;
#if 0 frame_header_.frame_size.frame_width_minus_1 = frame_header_.frame_size.frame_width - 1;
UpscaledWidth = RefUpscaledWidth[ ref_frame_idx[ i ] ] frame_header_.frame_size.frame_height = dpb_buffer_.ref_frame_height[frame_header_.ref_frame_idx[i]];
FrameWidth = UpscaledWidth frame_header_.frame_size.frame_height_minus_1 = frame_header_.frame_size.frame_height - 1;
FrameHeight = RefFrameHeight[ ref_frame_idx[ i ] ] frame_header_.render_size.render_width = dpb_buffer_.ref_render_width[frame_header_.ref_frame_idx[i]];
RenderWidth = RefRenderWidth[ ref_frame_idx[ i ] ] frame_header_.render_size.render_height = dpb_buffer_.ref_render_height[frame_header_.ref_frame_idx[i]];
RenderHeight = RefRenderHeight[ ref_frame_idx[ i ] ]
#endif
break; 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); p_frame_header->quantization_params.delta_coded = Parser::GetBit(p_stream, offset);
if (p_frame_header->quantization_params.delta_coded) { if (p_frame_header->quantization_params.delta_coded) {
p_frame_header->quantization_params.delta_q = ReadSigned(p_stream, offset, 1 + 6); p_frame_header->quantization_params.delta_q = ReadSigned(p_stream, offset, 1 + 6);
+13 -8
파일 보기
@@ -92,12 +92,17 @@ public:
// subsequent pictures. The value is the index of a frame in DPB buffer pool. If an entry is // 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. // not used as reference, the value should be -1.
int virtual_buffer_index[NUM_REF_FRAMES]; // VBI int virtual_buffer_index[NUM_REF_FRAMES]; // VBI
int ref_frame_type[NUM_REF_FRAMES]; int ref_valid[NUM_REF_FRAMES]; // RefValid
int ref_frame_id[NUM_REF_FRAMES]; int ref_frame_type[NUM_REF_FRAMES]; // RefFrameType
int ref_order_hint[NUM_REF_FRAMES]; int ref_frame_id[NUM_REF_FRAMES]; // RefFrameId
int ref_valid[NUM_REF_FRAMES]; uint32_t ref_upscaled_width[NUM_REF_FRAMES]; // RefUpscaledWidth
uint32_t saved_order_hints[NUM_REF_FRAMES][NUM_REF_FRAMES]; uint32_t ref_frame_width[NUM_REF_FRAMES]; // RefFrameWidth
int32_t saved_gm_params[NUM_REF_FRAMES][NUM_REF_FRAMES][6]; 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_ref_deltas[NUM_REF_FRAMES][TOTAL_REFS_PER_FRAME];
int32_t saved_loop_filter_mode_deltas[NUM_REF_FRAMES][2]; int32_t saved_loop_filter_mode_deltas[NUM_REF_FRAMES][2];
uint8_t saved_feature_enabled[NUM_REF_FRAMES][MAX_SEGMENTS][SEG_LVL_MAX]; 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 [in] offset Starting bit offset
* \param [out] offset Updated bit offset * \param [out] offset Updated bit offset
* \param [out] p_frame_header Pointer to frame header struct * \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 /*! \brief Function to segmentation parameters
* \param [in] p_stream Pointer to the bit stream * \param [in] p_stream Pointer to the bit stream