Module: Mesa
Branch: master
Commit: e62c7e7c6caa6c9531afb694e7952a7fc3ac4401
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e62c7e7c6caa6c9531afb694e7952a7fc3ac4401

Author: Thong Thai <[email protected]>
Date:   Fri Apr  9 10:26:59 2021 -0400

radeon: Add cropping to encoded H.265 when padding is used

Because the VCN encoder needs the surface to be memory aligned, the
resolution of the image passed to the encoder might be larger and have
extra padding added - this change crops the resulting output to
compensate for the extra padding that might have been added.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/4559
Signed-off-by: Thong Thai <[email protected]>
Reviewed-by: Leo Liu <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10137>

---

 src/gallium/drivers/radeon/radeon_vcn_enc_1_2.c | 24 +++++++++++++++---------
 src/gallium/drivers/radeon/radeon_vcn_enc_2_0.c | 25 ++++++++++++++++---------
 2 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/src/gallium/drivers/radeon/radeon_vcn_enc_1_2.c 
b/src/gallium/drivers/radeon/radeon_vcn_enc_1_2.c
index 6e85eb33ff9..8302e3ffb3b 100644
--- a/src/gallium/drivers/radeon/radeon_vcn_enc_1_2.c
+++ b/src/gallium/drivers/radeon/radeon_vcn_enc_1_2.c
@@ -397,15 +397,21 @@ static void radeon_enc_nalu_sps_hevc(struct 
radeon_encoder *enc)
    radeon_enc_code_ue(enc, enc->enc_pic.session_init.aligned_picture_width);
    radeon_enc_code_ue(enc, enc->enc_pic.session_init.aligned_picture_height);
 
-       if ((enc->enc_pic.crop_left != 0) || (enc->enc_pic.crop_right  != 0) ||
-           (enc->enc_pic.crop_top  != 0) || (enc->enc_pic.crop_bottom != 0)) {
-               radeon_enc_code_fixed_bits(enc, 0x1, 1);
-               radeon_enc_code_ue(enc, enc->enc_pic.crop_left);
-               radeon_enc_code_ue(enc, enc->enc_pic.crop_right);
-               radeon_enc_code_ue(enc, enc->enc_pic.crop_top);
-               radeon_enc_code_ue(enc, enc->enc_pic.crop_bottom);
-       } else
-               radeon_enc_code_fixed_bits(enc, 0x0, 1);
+   if ((enc->enc_pic.crop_left != 0) || (enc->enc_pic.crop_right  != 0) ||
+       (enc->enc_pic.crop_top  != 0) || (enc->enc_pic.crop_bottom != 0)) {
+      radeon_enc_code_fixed_bits(enc, 0x1, 1);
+      radeon_enc_code_ue(enc, enc->enc_pic.crop_left);
+      radeon_enc_code_ue(enc, enc->enc_pic.crop_right);
+      radeon_enc_code_ue(enc, enc->enc_pic.crop_top);
+      radeon_enc_code_ue(enc, enc->enc_pic.crop_bottom);
+   } else if (enc->enc_pic.session_init.padding_width  != 0 ||
+              enc->enc_pic.session_init.padding_height != 0) {
+      radeon_enc_code_fixed_bits(enc, 0x1, 1);
+      radeon_enc_code_ue(enc, enc->enc_pic.session_init.padding_width / 2);
+      radeon_enc_code_ue(enc, enc->enc_pic.session_init.padding_width / 2);
+      radeon_enc_code_ue(enc, enc->enc_pic.session_init.padding_height / 2);
+      radeon_enc_code_ue(enc, enc->enc_pic.session_init.padding_height / 2);
+   } else
 
    radeon_enc_code_ue(enc, enc->enc_pic.bit_depth_luma_minus8);
    radeon_enc_code_ue(enc, enc->enc_pic.bit_depth_chroma_minus8);
diff --git a/src/gallium/drivers/radeon/radeon_vcn_enc_2_0.c 
b/src/gallium/drivers/radeon/radeon_vcn_enc_2_0.c
index 57595746344..d6cc7bbc022 100644
--- a/src/gallium/drivers/radeon/radeon_vcn_enc_2_0.c
+++ b/src/gallium/drivers/radeon/radeon_vcn_enc_2_0.c
@@ -284,15 +284,22 @@ static void radeon_enc_nalu_sps_hevc(struct 
radeon_encoder *enc)
    radeon_enc_code_ue(enc, enc->enc_pic.session_init.aligned_picture_width);
    radeon_enc_code_ue(enc, enc->enc_pic.session_init.aligned_picture_height);
 
-       if ((enc->enc_pic.crop_left != 0) || (enc->enc_pic.crop_right  != 0) ||
-           (enc->enc_pic.crop_top  != 0) || (enc->enc_pic.crop_bottom != 0)) {
-               radeon_enc_code_fixed_bits(enc, 0x1, 1);
-               radeon_enc_code_ue(enc, enc->enc_pic.crop_left);
-               radeon_enc_code_ue(enc, enc->enc_pic.crop_right);
-               radeon_enc_code_ue(enc, enc->enc_pic.crop_top);
-               radeon_enc_code_ue(enc, enc->enc_pic.crop_bottom);
-       } else
-               radeon_enc_code_fixed_bits(enc, 0x0, 1);
+   if ((enc->enc_pic.crop_left != 0) || (enc->enc_pic.crop_right  != 0) ||
+       (enc->enc_pic.crop_top  != 0) || (enc->enc_pic.crop_bottom != 0)) {
+      radeon_enc_code_fixed_bits(enc, 0x1, 1);
+      radeon_enc_code_ue(enc, enc->enc_pic.crop_left);
+      radeon_enc_code_ue(enc, enc->enc_pic.crop_right);
+      radeon_enc_code_ue(enc, enc->enc_pic.crop_top);
+      radeon_enc_code_ue(enc, enc->enc_pic.crop_bottom);
+   } else if (enc->enc_pic.session_init.padding_width  != 0 ||
+              enc->enc_pic.session_init.padding_height != 0) {
+      radeon_enc_code_fixed_bits(enc, 0x1, 1);
+      radeon_enc_code_ue(enc, enc->enc_pic.session_init.padding_width / 2);
+      radeon_enc_code_ue(enc, enc->enc_pic.session_init.padding_width / 2);
+      radeon_enc_code_ue(enc, enc->enc_pic.session_init.padding_height / 2);
+      radeon_enc_code_ue(enc, enc->enc_pic.session_init.padding_height / 2);
+   } else
+   radeon_enc_code_fixed_bits(enc, 0x0, 1);
 
    radeon_enc_code_ue(enc, enc->enc_pic.bit_depth_luma_minus8);
    radeon_enc_code_ue(enc, enc->enc_pic.bit_depth_chroma_minus8);

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to