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: