summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSayantan Majumder <quic_smajumde@quicinc.com>2022-11-17 17:53:25 +0530
committerSayantan Majumder <quic_smajumde@quicinc.com>2022-11-21 12:32:11 +0530
commit6f8e71b643a9eedad18e582580a0a87c75357e41 (patch)
tree6e39149523260d60af4584016e85291b67a30c8c
parentea1ec63548943fedd3a1f8f8f7a9832c0fac5c51 (diff)
downloadvideo-driver-6f8e71b643a9eedad18e582580a0a87c75357e41.tar.gz
msm: vidc: Enable layered intra cyclic refresh
Inclusion of new HFI & V4L2 for adding provision of enabling only base layer IR cyclic encoding in case of multiple layers as per requirement of customers. Change-Id: I16983dd0971ce4aa2f8f65b5fad4b62175de6d9e Signed-off-by: Sayantan Majumder <quic_smajumde@quicinc.com>
-rw-r--r--msm/vidc/msm_venc.c32
-rw-r--r--msm/vidc/vidc_hfi_helper.h2
2 files changed, 34 insertions, 0 deletions
diff --git a/msm/vidc/msm_venc.c b/msm/vidc/msm_venc.c
index 5fc5bc6..60b7cc7 100644
--- a/msm/vidc/msm_venc.c
+++ b/msm/vidc/msm_venc.c
@@ -1003,6 +1003,15 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
),
.qmenu = roi_map_type,
},
+ {
+ .id = V4L2_CID_MPEG_VIDC_ENABLE_ONLY_BASE_LAYER_IR,
+ .name = "Enable Only Base Layer IR",
+ .type = V4L2_CTRL_TYPE_BOOLEAN,
+ .minimum = V4L2_MPEG_MSM_VIDC_DISABLE,
+ .maximum = V4L2_MPEG_MSM_VIDC_ENABLE,
+ .default_value = V4L2_MPEG_MSM_VIDC_DISABLE,
+ .step = 1,
+ },
};
#define NUM_CTRLS ARRAY_SIZE(msm_venc_ctrls)
@@ -1971,6 +1980,7 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
case V4L2_CID_MPEG_VIDC_VENC_BITRATE_SAVINGS:
case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET:
case V4L2_CID_MPEG_VIDC_SUPERFRAME:
+ case V4L2_CID_MPEG_VIDC_ENABLE_ONLY_BASE_LAYER_IR:
s_vpr_h(sid, "Control set: ID : 0x%x Val : %d\n",
ctrl->id, ctrl->val);
break;
@@ -3266,6 +3276,9 @@ int msm_venc_set_intra_refresh_mode(struct msm_vidc_inst *inst)
struct v4l2_ctrl *ctrl = NULL;
struct hfi_intra_refresh intra_refresh;
struct v4l2_format *f;
+ struct hfi_enable enable;
+ struct v4l2_ctrl *layer = NULL;
+ struct v4l2_ctrl *max_layer = NULL;
if (!inst || !inst->core) {
d_vpr_e("%s: invalid params %pK\n", __func__, inst);
@@ -3277,6 +3290,13 @@ int msm_venc_set_intra_refresh_mode(struct msm_vidc_inst *inst)
inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR))
return 0;
+ /* Check for base layer only intra refresh in case of multiple layers */
+ layer = get_ctrl(inst, V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER);
+ max_layer = get_ctrl(inst,
+ V4L2_CID_MPEG_VIDC_VIDEO_HEVC_MAX_HIER_CODING_LAYER);
+ ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_ENABLE_ONLY_BASE_LAYER_IR);
+ enable.enable = !!ctrl->val;
+
intra_refresh.mode = HFI_INTRA_REFRESH_RANDOM;
ctrl = get_ctrl(inst, V4L2_CID_MPEG_VIDC_VIDEO_INTRA_REFRESH_RANDOM);
@@ -3301,6 +3321,18 @@ int msm_venc_set_intra_refresh_mode(struct msm_vidc_inst *inst)
if (!intra_refresh.mbs) {
intra_refresh.mode = HFI_INTRA_REFRESH_NONE;
intra_refresh.mbs = 0;
+ } else {
+ if (enable.enable && layer->val && max_layer->val) {
+ s_vpr_h(inst->sid, "%s: Enable only base layer IR:%d\n",
+ __func__, enable.enable);
+ rc = call_hfi_op(hdev, session_set_property,
+ inst->session,
+ HFI_PROPERTY_PARAM_ENABLE_ONLY_BASE_LAYER_IR,
+ &enable, sizeof(enable));
+ if (rc)
+ s_vpr_e(inst->sid,
+ "%s: set property failed\n", __func__);
+ }
}
s_vpr_h(inst->sid, "%s: %d %d\n", __func__,
diff --git a/msm/vidc/vidc_hfi_helper.h b/msm/vidc/vidc_hfi_helper.h
index 1448d4a..c0e9708 100644
--- a/msm/vidc/vidc_hfi_helper.h
+++ b/msm/vidc/vidc_hfi_helper.h
@@ -352,6 +352,8 @@ struct hfi_buffer_info {
(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x039)
#define HFI_PROPERTY_PARAM_HEVC_PPS_CB_CR_OFFSET \
(HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x040)
+#define HFI_PROPERTY_PARAM_ENABLE_ONLY_BASE_LAYER_IR \
+ (HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x041)
#define HFI_PROPERTY_CONFIG_VENC_COMMON_START \
(HFI_DOMAIN_BASE_VENC + HFI_ARCH_COMMON_OFFSET + 0x6000)