media: venus: venc: set inband mode property to FW.
authorDikshita Agarwal <dikshita@codeaurora.org>
Fri, 8 Jan 2021 07:23:37 +0000 (08:23 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 27 Jan 2021 15:21:55 +0000 (16:21 +0100)
Set HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER to FW
to support inband sequence header mode.

Reviewed-by: Fritz Koenig <frkoenig@chromium.org>
Signed-off-by: Dikshita Agarwal <dikshita@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/venc.c
drivers/media/platform/qcom/venus/venc_ctrls.c

index d01add6eb449c3f6d68be70c9b839db87d1e43a6..c04474afd812a9a07de0646e981329be6f6c2ebc 100644 (file)
@@ -545,6 +545,7 @@ static int venc_set_properties(struct venus_inst *inst)
        struct hfi_idr_period idrp;
        struct hfi_quantization quant;
        struct hfi_quantization_range quant_range;
+       struct hfi_enable en;
        u32 ptype, rate_control, bitrate;
        u32 profile, level;
        int ret;
@@ -664,6 +665,19 @@ static int venc_set_properties(struct venus_inst *inst)
        if (ret)
                return ret;
 
+       if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H264 ||
+           inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
+               ptype = HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER;
+               if (ctr->header_mode == V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE)
+                       en.enable = 0;
+               else
+                       en.enable = 1;
+
+               ret = hfi_session_set_property(inst, ptype, &en);
+               if (ret)
+                       return ret;
+       }
+
        if (!ctr->bitrate_peak)
                bitrate *= 2;
        else
index 9fbe8388a938cd576a62baaba9a354a0945addfa..a52b8005517370b532368185c4259b53c9a75ad6 100644 (file)
@@ -209,6 +209,20 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
                break;
        case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
                ctr->header_mode = ctrl->val;
+               mutex_lock(&inst->lock);
+               if (inst->streamon_out && inst->streamon_cap) {
+                       if (ctrl->val == V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE)
+                               en.enable = 0;
+                       else
+                               en.enable = 1;
+                       ptype = HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER;
+                       ret = hfi_session_set_property(inst, ptype, &en);
+                       if (ret) {
+                               mutex_unlock(&inst->lock);
+                               return ret;
+                       }
+               }
+               mutex_unlock(&inst->lock);
                break;
        case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB:
                break;
@@ -343,7 +357,8 @@ int venc_ctrl_init(struct venus_inst *inst)
        v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,
                V4L2_CID_MPEG_VIDEO_HEADER_MODE,
                V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
-               1 << V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
+               ~((1 << V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) |
+               (1 << V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME)),
                V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE);
 
        v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,