]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: venus: venc: add support for V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM control
authorMansur Alisha Shaik <mansur@codeaurora.org>
Thu, 29 Jul 2021 11:30:40 +0000 (13:30 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 4 Aug 2021 12:43:52 +0000 (14:43 +0200)
Add support for V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM control for
H264 high profile and constrained high profile.

Signed-off-by: Mansur Alisha Shaik <mansur@codeaurora.org>
Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/qcom/venus/core.h
drivers/media/platform/qcom/venus/hfi_cmds.c
drivers/media/platform/qcom/venus/hfi_helper.h
drivers/media/platform/qcom/venus/venc.c
drivers/media/platform/qcom/venus/venc_ctrls.c

index df9f79f5b164f7e37a3cb374cf42431863faa198..5ec851115eca8c3bb0b63f9f46a7daccec457c12 100644 (file)
@@ -234,6 +234,7 @@ struct venc_controls {
        u32 h264_loop_filter_mode;
        s32 h264_loop_filter_alpha;
        s32 h264_loop_filter_beta;
+       u32 h264_8x8_transform;
 
        u32 hevc_i_qp;
        u32 hevc_p_qp;
index f5102478699165c36816bf9c53a10ae2c32628ce..60f4b8e4b8d0202f4885de407ddffa2aa81a2742 100644 (file)
@@ -1239,6 +1239,14 @@ pkt_session_set_property_4xx(struct hfi_session_set_property_pkt *pkt,
                break;
        }
 
+       case HFI_PROPERTY_PARAM_VENC_H264_TRANSFORM_8X8: {
+               struct hfi_h264_8x8_transform *in = pdata, *tm = prop_data;
+
+               tm->enable_type = in->enable_type;
+               pkt->shdr.hdr.size += sizeof(u32) + sizeof(*tm);
+               break;
+       }
+
        case HFI_PROPERTY_CONFIG_VENC_MAX_BITRATE:
        case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER:
        case HFI_PROPERTY_PARAM_BUFFER_ALLOC_MODE:
index b0a9beb4163c4b4507fa5bcca0a5abf141643b2f..bec4feb63ceb1c0f8b8b62e2404e3ce0be4a35fa 100644 (file)
 #define HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES               0x2005020
 #define HFI_PROPERTY_PARAM_VENC_H264_VUI_BITSTREAM_RESTRC      0x2005021
 #define HFI_PROPERTY_PARAM_VENC_PRESERVE_TEXT_QUALITY          0x2005023
+#define HFI_PROPERTY_PARAM_VENC_H264_TRANSFORM_8X8                     0x2005025
 #define HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER       0x2005026
 #define HFI_PROPERTY_PARAM_VENC_DISABLE_RC_TIMESTAMP           0x2005027
 #define HFI_PROPERTY_PARAM_VENC_INITIAL_QP                     0x2005028
@@ -562,6 +563,10 @@ struct hfi_bitrate {
        u32 layer_id;
 };
 
+struct hfi_h264_8x8_transform {
+       u32 enable_type;
+};
+
 #define HFI_CAPABILITY_FRAME_WIDTH                     0x01
 #define HFI_CAPABILITY_FRAME_HEIGHT                    0x02
 #define HFI_CAPABILITY_MBS_PER_FRAME                   0x03
index a027495398ed7d5cdc5ebf04c907245e97b73219..bc1c42dd53c04490d5021aa89c38766089d73085 100644 (file)
@@ -570,6 +570,7 @@ static int venc_set_properties(struct venus_inst *inst)
                struct hfi_h264_vui_timing_info info;
                struct hfi_h264_entropy_control entropy;
                struct hfi_h264_db_control deblock;
+               struct hfi_h264_8x8_transform h264_transform;
 
                ptype = HFI_PROPERTY_PARAM_VENC_H264_VUI_TIMING_INFO;
                info.enable = 1;
@@ -600,6 +601,17 @@ static int venc_set_properties(struct venus_inst *inst)
                ret = hfi_session_set_property(inst, ptype, &deblock);
                if (ret)
                        return ret;
+
+               ptype = HFI_PROPERTY_PARAM_VENC_H264_TRANSFORM_8X8;
+               h264_transform.enable_type = 0;
+               if (ctr->profile.h264 == HFI_H264_PROFILE_HIGH ||
+                   ctr->profile.h264 == HFI_H264_PROFILE_CONSTRAINED_HIGH)
+                       h264_transform.enable_type = ctr->h264_8x8_transform;
+
+               ret = hfi_session_set_property(inst, ptype, &h264_transform);
+               if (ret)
+                       return ret;
+
        }
 
        if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H264 ||
index eb10affc627715b654569039f1ba59d26bc20716..1ada42df314dc3b6a607501f2df790a1cfd28bbd 100644 (file)
@@ -319,6 +319,25 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
        case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD:
                ctr->intra_refresh_period = ctrl->val;
                break;
+       case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
+               if (ctr->profile.h264 != HFI_H264_PROFILE_HIGH &&
+                   ctr->profile.h264 != HFI_H264_PROFILE_CONSTRAINED_HIGH)
+                       return -EINVAL;
+
+               /*
+                * In video firmware, 8x8 transform is supported only for
+                * high profile(HP) and constrained high profile(CHP).
+                * If client wants to disable 8x8 transform for HP/CHP,
+                * it is better to set profile as main profile(MP).
+                * Because there is no difference between HP and MP
+                * if we disable 8x8 transform for HP.
+                */
+
+               if (ctrl->val == 0)
+                       return -EINVAL;
+
+               ctr->h264_8x8_transform = ctrl->val;
+               break;
        default:
                return -EINVAL;
        }
@@ -334,7 +353,7 @@ int venc_ctrl_init(struct venus_inst *inst)
 {
        int ret;
 
-       ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 57);
+       ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 58);
        if (ret)
                return ret;
 
@@ -437,6 +456,9 @@ int venc_ctrl_init(struct venus_inst *inst)
        v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
                          V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP, 1, 51, 1, 1);
 
+       v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
+                         V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM, 0, 1, 1, 0);
+
        v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
                          V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP, 1, 51, 1, 1);