From c1bf1d2bc958bbcf5add04998cc7f9ecf92183e5 Mon Sep 17 00:00:00 2001 From: Vikash Garodia Date: Fri, 28 May 2021 15:28:52 +0530 Subject: [PATCH] video: driver: Set proper HFI during low latency for decoder Decoder supports dynamic low latency. When client configures the video session in low latency mode, driver would configure the firmware such that HFI_CMD_SETTINGS_CHANGE is triggerred on sync frame boundary. Change-Id: Ie70eaaeb8ad420db926f0d99f77723476deee400 Signed-off-by: Vikash Garodia --- driver/platform/waipio/src/msm_vidc_waipio.c | 6 +++--- driver/vidc/inc/msm_vidc_control.h | 2 ++ driver/vidc/src/msm_vdec.c | 4 ++++ driver/vidc/src/msm_vidc_control.c | 21 ++++++++++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 7c48727cc9..e83b7ff608 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -481,10 +481,10 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { 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_DYNAMIC_ALLOWED, + HFI_PROP_SEQ_CHANGE_AT_SYNC_FRAME, + CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, {0}, {0}, - NULL, msm_vidc_set_stage}, + NULL, msm_vidc_set_seq_change_at_sync_frame}, {LTR_COUNT, ENC, H264|HEVC, 0, 2, 1, 0, diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index 9595717963..f0aebcc2de 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -95,6 +95,8 @@ int msm_vidc_set_csc_custom_matrix(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_session_priority(void* instance, enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_seq_change_at_sync_frame(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 afdaeb82af..f0f17d09f6 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -778,6 +778,10 @@ static int msm_vdec_set_output_properties(struct msm_vidc_inst *inst) if (rc) return rc; + rc = msm_vidc_set_seq_change_at_sync_frame(inst, LOWLATENCY_MODE); + if (rc) + return rc; + return rc; } diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index d41214c136..4d948e79f1 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -3351,3 +3351,24 @@ int msm_vidc_set_pipe(void *instance, return rc; } + +int msm_vidc_set_seq_change_at_sync_frame(void* instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + u32 payload; + struct msm_vidc_inst* inst = (struct msm_vidc_inst*)instance; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + payload = inst->capabilities->cap[LOWLATENCY_MODE].value; + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32, + &payload, sizeof(u32), __func__); + if (rc) + return rc; + + return rc; +} \ No newline at end of file