radeonsi/vcn: update to use correct padding size.

Update padding size calculation to use cropping.
Original method could result in 0 padding, which
generated unnessary noise in the encoding result.

Cc: mesa-stable
Fixes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/9196

Reviewed-by: Leo Liu <leo.liu@amd.com>
Signed-off-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28280>
This commit is contained in:
Ruijing Dong 2024-01-25 18:24:30 -05:00 committed by Marge Bot
parent b24748a93a
commit fecbb4177c
4 changed files with 33 additions and 30 deletions

View file

@ -196,9 +196,9 @@ static void radeon_vcn_enc_h264_get_cropping_param(struct radeon_encoder *enc,
enc->enc_pic.crop_bottom = pic->seq.enc_frame_crop_bottom_offset;
} else {
enc->enc_pic.crop_left = 0;
enc->enc_pic.crop_right = (align(enc->base.width, 16) - enc->base.width) / 2;
enc->enc_pic.crop_right = 0;
enc->enc_pic.crop_top = 0;
enc->enc_pic.crop_bottom = (align(enc->base.height, 16) - enc->base.height) / 2;
enc->enc_pic.crop_bottom = 0;
}
}
@ -453,9 +453,9 @@ static void radeon_vcn_enc_hevc_get_cropping_param(struct radeon_encoder *enc,
enc->enc_pic.crop_bottom = pic->seq.conf_win_bottom_offset;
} else {
enc->enc_pic.crop_left = 0;
enc->enc_pic.crop_right = (align(enc->base.width, 16) - enc->base.width) / 2;
enc->enc_pic.crop_right = 0;
enc->enc_pic.crop_top = 0;
enc->enc_pic.crop_bottom = (align(enc->base.height, 16) - enc->base.height) / 2;
enc->enc_pic.crop_bottom = 0;
}
}

View file

@ -81,10 +81,12 @@ static void radeon_enc_session_init(struct radeon_encoder *enc)
enc->enc_pic.session_init.aligned_picture_width = align(enc->base.width, 64);
}
enc->enc_pic.session_init.aligned_picture_height = align(enc->base.height, 16);
enc->enc_pic.session_init.padding_width =
enc->enc_pic.session_init.aligned_picture_width - enc->base.width;
(enc->enc_pic.crop_left + enc->enc_pic.crop_right) * 2;
enc->enc_pic.session_init.padding_height =
enc->enc_pic.session_init.aligned_picture_height - enc->base.height;
(enc->enc_pic.crop_top + enc->enc_pic.crop_bottom) * 2;
enc->enc_pic.session_init.display_remote = 0;
enc->enc_pic.session_init.pre_encode_mode = enc->enc_pic.quality_modes.pre_encode_mode;
enc->enc_pic.session_init.pre_encode_chroma_enabled = !!(enc->enc_pic.quality_modes.pre_encode_mode);

View file

@ -506,10 +506,12 @@ static void radeon_enc_session_init(struct radeon_encoder *enc)
enc->enc_pic.session_init.aligned_picture_width = align(enc->base.width, 64);
}
enc->enc_pic.session_init.aligned_picture_height = align(enc->base.height, 16);
enc->enc_pic.session_init.padding_width =
enc->enc_pic.session_init.aligned_picture_width - enc->base.width;
(enc->enc_pic.crop_left + enc->enc_pic.crop_right) * 2;
enc->enc_pic.session_init.padding_height =
enc->enc_pic.session_init.aligned_picture_height - enc->base.height;
(enc->enc_pic.crop_top + enc->enc_pic.crop_bottom) * 2;
enc->enc_pic.session_init.slice_output_enabled = 0;
enc->enc_pic.session_init.display_remote = 0;
enc->enc_pic.session_init.pre_encode_mode = enc->enc_pic.quality_modes.pre_encode_mode;

View file

@ -81,7 +81,6 @@ static void radeon_enc_op_preset(struct radeon_encoder *enc)
static void radeon_enc_session_init(struct radeon_encoder *enc)
{
bool av1_encoding = false;
uint32_t av1_height = enc->enc_pic.pic_height_in_luma_samples;
switch (u_reduce_video_profile(enc->base.profile)) {
@ -89,11 +88,20 @@ static void radeon_enc_session_init(struct radeon_encoder *enc)
enc->enc_pic.session_init.encode_standard = RENCODE_ENCODE_STANDARD_H264;
enc->enc_pic.session_init.aligned_picture_width = align(enc->base.width, 16);
enc->enc_pic.session_init.aligned_picture_height = align(enc->base.height, 16);
enc->enc_pic.session_init.padding_width =
(enc->enc_pic.crop_left + enc->enc_pic.crop_right) * 2;
enc->enc_pic.session_init.padding_height =
(enc->enc_pic.crop_top + enc->enc_pic.crop_bottom) * 2;
break;
case PIPE_VIDEO_FORMAT_HEVC:
enc->enc_pic.session_init.encode_standard = RENCODE_ENCODE_STANDARD_HEVC;
enc->enc_pic.session_init.aligned_picture_width = align(enc->base.width, 64);
enc->enc_pic.session_init.aligned_picture_height = align(enc->base.height, 16);
enc->enc_pic.session_init.padding_width =
(enc->enc_pic.crop_left + enc->enc_pic.crop_right) * 2;
enc->enc_pic.session_init.padding_height =
(enc->enc_pic.crop_top + enc->enc_pic.crop_bottom) * 2;
break;
case PIPE_VIDEO_FORMAT_AV1:
enc->enc_pic.session_init.encode_standard = RENCODE_ENCODE_STANDARD_AV1;
@ -104,33 +112,24 @@ static void radeon_enc_session_init(struct radeon_encoder *enc)
if (!(av1_height % 8) && (av1_height % 16) && !(enc->enc_pic.enable_render_size))
enc->enc_pic.session_init.aligned_picture_height = av1_height + 2;
av1_encoding = true;
enc->enc_pic.session_init.padding_width =
enc->enc_pic.session_init.aligned_picture_width -
enc->enc_pic.pic_width_in_luma_samples;
enc->enc_pic.session_init.padding_height =
enc->enc_pic.session_init.aligned_picture_height - av1_height;
if (enc->enc_pic.enable_render_size)
enc->enc_pic.enable_render_size =
(enc->enc_pic.session_init.aligned_picture_width !=
enc->enc_pic.render_width) ||
(enc->enc_pic.session_init.aligned_picture_height !=
enc->enc_pic.render_height);
break;
default:
assert(0);
break;
}
enc->enc_pic.session_init.padding_width =
enc->enc_pic.session_init.aligned_picture_width - enc->base.width;
enc->enc_pic.session_init.padding_height =
enc->enc_pic.session_init.aligned_picture_height - enc->base.height;
if (av1_encoding) {
enc->enc_pic.session_init.padding_width =
enc->enc_pic.session_init.aligned_picture_width -
enc->enc_pic.pic_width_in_luma_samples;
enc->enc_pic.session_init.padding_height =
enc->enc_pic.session_init.aligned_picture_height - av1_height;
if (enc->enc_pic.enable_render_size)
enc->enc_pic.enable_render_size =
(enc->enc_pic.session_init.aligned_picture_width !=
enc->enc_pic.render_width) ||
(enc->enc_pic.session_init.aligned_picture_height !=
enc->enc_pic.render_height);
}
enc->enc_pic.session_init.slice_output_enabled = 0;
enc->enc_pic.session_init.display_remote = 0;
enc->enc_pic.session_init.pre_encode_mode = enc->enc_pic.quality_modes.pre_encode_mode;