From: suresh guttula <[email protected]>

This patch will add support for frame_cropping when the input size is not
matched with aligned size. Currently vaapi driver ignores frame cropping
values provided by client. This change will update SPS nalu with proper
cropping values.

Signed-off-by: suresh guttula <[email protected]>
Signed-off-by: Satyajit Sahu <[email protected]>
---
 src/gallium/drivers/radeon/radeon_vce_52.c       | 8 ++++++--
 src/gallium/include/pipe/p_video_state.h         | 5 +++++
 src/gallium/state_trackers/va/picture_h264_enc.c | 8 ++++++++
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/radeon/radeon_vce_52.c 
b/src/gallium/drivers/radeon/radeon_vce_52.c
index fc7ddc62a90..593730756d5 100644
--- a/src/gallium/drivers/radeon/radeon_vce_52.c
+++ b/src/gallium/drivers/radeon/radeon_vce_52.c
@@ -81,8 +81,12 @@ static void get_pic_control_param(struct rvce_encoder *enc, 
struct pipe_h264_enc
        unsigned encNumMBsPerSlice;
        encNumMBsPerSlice = align(enc->base.width, 16) / 16;
        encNumMBsPerSlice *= align(enc->base.height, 16) / 16;
-       enc->enc_pic.pc.enc_crop_right_offset = (align(enc->base.width, 16) - 
enc->base.width) >> 1;
-       enc->enc_pic.pc.enc_crop_bottom_offset = (align(enc->base.height, 16) - 
enc->base.height) >> 1;
+       if (pic->pic_ctrl.enc_frame_cropping_flag) {
+               enc->enc_pic.pc.enc_crop_left_offset = 
pic->pic_ctrl.enc_frame_crop_left_offset;
+               enc->enc_pic.pc.enc_crop_right_offset = 
pic->pic_ctrl.enc_frame_crop_right_offset;
+               enc->enc_pic.pc.enc_crop_top_offset = 
pic->pic_ctrl.enc_frame_crop_top_offset;
+               enc->enc_pic.pc.enc_crop_bottom_offset = 
pic->pic_ctrl.enc_frame_crop_bottom_offset;
+       }
        enc->enc_pic.pc.enc_num_mbs_per_slice = encNumMBsPerSlice;
        enc->enc_pic.pc.enc_b_pic_pattern = MAX2(enc->base.max_references, 1) - 
1;
        enc->enc_pic.pc.enc_number_of_reference_frames = 
MIN2(enc->base.max_references, 2);
diff --git a/src/gallium/include/pipe/p_video_state.h 
b/src/gallium/include/pipe/p_video_state.h
index 05855a36e23..1369f1a8ca6 100644
--- a/src/gallium/include/pipe/p_video_state.h
+++ b/src/gallium/include/pipe/p_video_state.h
@@ -395,6 +395,11 @@ struct pipe_h264_enc_pic_control
 {
    unsigned enc_cabac_enable;
    unsigned enc_constraint_set_flags;
+   unsigned enc_frame_cropping_flag;
+   unsigned enc_frame_crop_left_offset;
+   unsigned enc_frame_crop_right_offset;
+   unsigned enc_frame_crop_top_offset;
+   unsigned enc_frame_crop_bottom_offset;
 };
 
 struct pipe_h264_enc_picture_desc
diff --git a/src/gallium/state_trackers/va/picture_h264_enc.c 
b/src/gallium/state_trackers/va/picture_h264_enc.c
index abfd39633de..f46b3425566 100644
--- a/src/gallium/state_trackers/va/picture_h264_enc.c
+++ b/src/gallium/state_trackers/va/picture_h264_enc.c
@@ -127,6 +127,14 @@ vlVaHandleVAEncSequenceParameterBufferTypeH264(vlVaDriver 
*drv, vlVaContext *con
    context->desc.h264enc.rate_ctrl.frame_rate_num = h264->time_scale / 2;
    context->desc.h264enc.rate_ctrl.frame_rate_den = h264->num_units_in_tick;
    context->desc.h264enc.pic_order_cnt_type = 
h264->seq_fields.bits.pic_order_cnt_type;
+
+   if (h264->frame_cropping_flag) {
+      context->desc.h264enc.pic_ctrl.enc_frame_cropping_flag = 
h264->frame_cropping_flag;
+      context->desc.h264enc.pic_ctrl.enc_frame_crop_left_offset = 
h264->frame_crop_left_offset;
+      context->desc.h264enc.pic_ctrl.enc_frame_crop_right_offset = 
h264->frame_crop_right_offset;
+      context->desc.h264enc.pic_ctrl.enc_frame_crop_top_offset = 
h264->frame_crop_top_offset;
+      context->desc.h264enc.pic_ctrl.enc_frame_crop_bottom_offset = 
h264->frame_crop_bottom_offset;
+   }
    return VA_STATUS_SUCCESS;
 }
 
-- 
2.19.1

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

Reply via email to