From 75ecec1bb554c3ab5b411e9f6c0be6330445283c Mon Sep 17 00:00:00 2001 From: Vikash Garodia Date: Tue, 27 Apr 2021 19:34:18 +0530 Subject: [PATCH] video: driver: Add support dynamic low latency for decoder Latency property is set to firmware during streamon output port, if set as part of initial configuration by client. During runtime, the property is set as and when configured by client. 1. Make the latency property dynamic for decoder. 2. For encoder, the same gets set to firmware with regular v4l2 set properties. 3. For decoder, set the property explicitly during streamon output port. Change-Id: I35990614b95e57f113ddacfc2272cad6ae0dde82 Signed-off-by: Vikash Garodia --- driver/platform/waipio/src/msm_vidc_waipio.c | 18 +++++++++-- driver/vidc/inc/msm_vidc_control.h | 2 ++ driver/vidc/src/msm_vdec.c | 31 +----------------- driver/vidc/src/msm_venc.c | 33 -------------------- driver/vidc/src/msm_vidc_control.c | 30 ++++++++++++++++++ driver/vidc/src/msm_vidc_driver.c | 1 + 6 files changed, 49 insertions(+), 66 deletions(-) diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index b98e583c82..27bf9acfbf 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -465,12 +465,19 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_CSC_MATRIX, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, */ - {LOWLATENCY_MODE, ENC|DEC, H264|HEVC|VP9, + {LOWLATENCY_MODE, ENC, H264 | HEVC, + V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, + 1, V4L2_MPEG_MSM_VIDC_DISABLE, + V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST}, + + {LOWLATENCY_MODE, DEC, H264|HEVC|VP9, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, 1, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST, HFI_PROP_STAGE, - CAP_FLAG_ROOT}, + CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + NULL, msm_vidc_set_stage}, {LTR_COUNT, ENC, H264|HEVC, 0, 2, 1, 0, @@ -1142,7 +1149,12 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {STAGE, DEC|ENC, CODECS_ALL, MSM_VIDC_STAGE_1, MSM_VIDC_STAGE_2, 1, - MSM_VIDC_STAGE_2}, + MSM_VIDC_STAGE_2, + 0, + HFI_PROP_STAGE, + CAP_FLAG_ROOT, + {0}, {0}, + NULL, msm_vidc_set_stage}, {PIPE, DEC|ENC, CODECS_ALL, MSM_VIDC_PIPE_1, MSM_VIDC_PIPE_4, 1, diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index b92216695b..0b2a1ce105 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -86,6 +86,8 @@ int msm_vidc_set_blur_type(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_blur_resolution(void *instance, enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_stage(void *instance, + enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_s32(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_q16(void *instance, diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index 88c7570c1b..7de78b7a78 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -528,35 +528,6 @@ static int msm_vdec_set_colorformat(struct msm_vidc_inst *inst) return rc; } -static int msm_vdec_set_stage(struct msm_vidc_inst *inst) -{ - int rc = 0; - u32 stage = 0; - struct msm_vidc_core *core = inst->core; - struct msm_vidc_inst_capability *capability = inst->capabilities; - - rc = call_session_op(core, decide_work_mode, inst); - if (rc) { - i_vpr_e(inst, "%s: decide_work_mode failed %d\n", - __func__); - return -EINVAL; - } - - stage = capability->cap[STAGE].value; - i_vpr_h(inst, "%s: stage: %d", __func__, stage); - rc = venus_hfi_session_property(inst, - HFI_PROP_STAGE, - HFI_HOST_FLAGS_NONE, - HFI_PORT_NONE, - HFI_PAYLOAD_U32, - &stage, - sizeof(u32)); - if (rc) - i_vpr_e(inst, "%s: set property failed\n", __func__); - - return rc; -} - static int msm_vdec_set_pipe(struct msm_vidc_inst *inst) { int rc = 0; @@ -816,7 +787,7 @@ static int msm_vdec_set_output_properties(struct msm_vidc_inst *inst) if (rc) return rc; - rc = msm_vdec_set_stage(inst); + rc = msm_vidc_set_stage(inst, STAGE); if (rc) return rc; diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index a632c36714..c5c03e055f 100644 --- a/driver/vidc/src/msm_venc.c +++ b/driver/vidc/src/msm_venc.c @@ -399,34 +399,6 @@ static int msm_venc_set_csc(struct msm_vidc_inst* inst, return 0; } -static int msm_venc_set_stage(struct msm_vidc_inst *inst) -{ - int rc = 0; - struct msm_vidc_core *core = inst->core; - struct msm_vidc_inst_capability *capability = inst->capabilities; - u32 stage; - - rc = call_session_op(core, decide_work_mode, inst); - if (rc) { - i_vpr_e(inst, "%s: decide_work_mode failed\n", - __func__); - return -EINVAL; - } - - stage = capability->cap[STAGE].value; - i_vpr_h(inst, "%s: stage: %u\n", __func__, stage); - rc = venus_hfi_session_property(inst, - HFI_PROP_STAGE, - HFI_HOST_FLAGS_NONE, - HFI_PORT_NONE, - HFI_PAYLOAD_U32, - &stage, - sizeof(u32)); - if (rc) - return rc; - return 0; -} - static int msm_venc_set_pipe(struct msm_vidc_inst *inst) { int rc = 0; @@ -568,11 +540,6 @@ static int msm_venc_set_internal_properties(struct msm_vidc_inst *inst) } i_vpr_h(inst, "%s()\n", __func__); - //TODO: set HFI_PORT_NONE properties at master port streamon. - rc = msm_venc_set_stage(inst); - if (rc) - return rc; - rc = msm_venc_set_pipe(inst); if (rc) return rc; diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index f4e9f55710..2bc821886c 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -3113,3 +3113,33 @@ set_default: capability->cap[cap_id].v4l2_id, *value); return 0; } + +int msm_vidc_set_stage(void *instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + u32 stage = 0; + struct msm_vidc_core *core; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance; + + if (!inst || !inst->capabilities || !inst->core) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + core = inst->core; + + rc = call_session_op(core, decide_work_mode, inst); + if (rc) { + i_vpr_e(inst, "%s: decide_work_mode failed\n", __func__); + return -EINVAL; + } + + stage = inst->capabilities->cap[STAGE].value; + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32, + &stage, sizeof(u32), __func__); + if (rc) + return rc; + + return rc; +} diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 1f5f180c73..2697ce02d7 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -1108,6 +1108,7 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id) switch (id) { case V4L2_CID_MPEG_VIDC_CODEC_CONFIG: case V4L2_CID_MPEG_VIDC_PRIORITY: + case V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST: allow = true; break; default: