summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohnnLee <johnnlee@google.com>2023-02-10 12:40:14 +0800
committerJohnnLee <johnnlee@google.com>2023-02-10 12:40:25 +0800
commitef619e539fbd7a3adc26f470fadfb56e36a1188d (patch)
treeb8dfc38b770f6fdaee18cdb32e61c1b8b2ffaa7d
parente4187f63654ad04775a7b1558c46e13f50cbd15a (diff)
parent38e60daa0651919e6aca44f09977caada11430d4 (diff)
downloadvideo-driver-ef619e539fbd7a3adc26f470fadfb56e36a1188d.tar.gz
Merge branch 'LA.UM.9.12.C10.11.00.00.840.517' via branch 'qcom-msm-4.19-7250' into android-msm-pixel-4.19android-u-beta-2_r0.1android-u-beta-2.1_r0.1android-msm-redbull-4.19-u-beta2
Bug: 268575472 Change-Id: Ibf2d4e4a92f8a581498b29a8958cef5895616d43 Signed-off-by: JohnnLee <johnnlee@google.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 50a27b0..b96a08a 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)