From f60ff0d92c09b1111a91ac645ee22cf459570c82 Mon Sep 17 00:00:00 2001 From: Dikshita Agarwal Date: Thu, 17 Mar 2022 19:14:27 +0530 Subject: [PATCH] video: driver: use custom v4l2 ctrls in place of S/G_PARM on decoder Introduce new v4l2 controls to set frame rate and operating rate on decoder as VIDIOC_S/G_PARM is not allowed on decoder. fix: v4l2-compliance:S/G_PARM Change-Id: I6c090c0ae541a086c73bb79564dd29ed4aa755b3 Signed-off-by: Dikshita Agarwal Signed-off-by: Maheshwar Ajja --- driver/platform/kalama/src/msm_vidc_kalama.c | 36 +++++++++-- driver/platform/waipio/src/msm_vidc_waipio.c | 36 +++++++++-- driver/vidc/inc/msm_vidc_control.h | 2 + driver/vidc/src/msm_vidc_control.c | 64 +++++++++++++++++++ driver/vidc/src/msm_vidc_driver.c | 2 + .../uapi/vidc/media/v4l2_vidc_extensions.h | 3 + 6 files changed, 135 insertions(+), 8 deletions(-) diff --git a/driver/platform/kalama/src/msm_vidc_kalama.c b/driver/platform/kalama/src/msm_vidc_kalama.c index 8309fffaa9..558e30000d 100644 --- a/driver/platform/kalama/src/msm_vidc_kalama.c +++ b/driver/platform/kalama/src/msm_vidc_kalama.c @@ -251,19 +251,47 @@ static struct msm_platform_inst_capability instance_data_kalama[] = { {FRAME_RATE, DEC, CODECS_ALL, (MINIMUM_FPS << 16), (MAXIMUM_FPS << 16), - 1, (DEFAULT_FPS << 16)}, + 1, (DEFAULT_FPS << 16), + V4L2_CID_MPEG_VIDC_FRAME_RATE, + 0, + CAP_FLAG_OUTPUT_PORT | + CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_frame_rate}, {FRAME_RATE, DEC, VP9, (MINIMUM_FPS << 16), (MAXIMUM_OVERRIDE_VP9_FPS << 16), - 1, (DEFAULT_FPS << 16)}, + 1, (DEFAULT_FPS << 16), + V4L2_CID_MPEG_VIDC_FRAME_RATE, + 0, + CAP_FLAG_OUTPUT_PORT | + CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_frame_rate}, - {OPERATING_RATE, ENC|DEC, CODECS_ALL, + {OPERATING_RATE, ENC, CODECS_ALL, (MINIMUM_FPS << 16), (MAXIMUM_FPS << 16), 1, (DEFAULT_FPS << 16)}, + {OPERATING_RATE, DEC, CODECS_ALL, + (MINIMUM_FPS << 16), (MAXIMUM_FPS << 16), + 1, (DEFAULT_FPS << 16), + V4L2_CID_MPEG_VIDC_OPERATING_RATE, + 0, + CAP_FLAG_OUTPUT_PORT | + CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_operating_rate}, + {OPERATING_RATE, DEC, VP9, (MINIMUM_FPS << 16), (MAXIMUM_OVERRIDE_VP9_FPS << 16), - 1, (DEFAULT_FPS << 16)}, + 1, (DEFAULT_FPS << 16), + V4L2_CID_MPEG_VIDC_OPERATING_RATE, + 0, + CAP_FLAG_OUTPUT_PORT | + CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_operating_rate}, {INPUT_RATE, ENC|DEC, CODECS_ALL, (MINIMUM_FPS << 16), INT_MAX, diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 89bdcabe2d..5683be2599 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -237,19 +237,47 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {FRAME_RATE, DEC, CODECS_ALL, (MINIMUM_FPS << 16), (MAXIMUM_FPS << 16), - 1, (DEFAULT_FPS << 16)}, + 1, (DEFAULT_FPS << 16), + V4L2_CID_MPEG_VIDC_FRAME_RATE, + 0, + CAP_FLAG_OUTPUT_PORT | + CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_frame_rate}, {FRAME_RATE, DEC, VP9, (MINIMUM_FPS << 16), (MAXIMUM_OVERRIDE_VP9_FPS << 16), - 1, (DEFAULT_FPS << 16)}, + 1, (DEFAULT_FPS << 16), + V4L2_CID_MPEG_VIDC_FRAME_RATE, + 0, + CAP_FLAG_OUTPUT_PORT | + CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_frame_rate}, - {OPERATING_RATE, ENC|DEC, CODECS_ALL, + {OPERATING_RATE, ENC, CODECS_ALL, (MINIMUM_FPS << 16), (MAXIMUM_FPS << 16), 1, (DEFAULT_FPS << 16)}, + {OPERATING_RATE, DEC, CODECS_ALL, + (MINIMUM_FPS << 16), (MAXIMUM_FPS << 16), + 1, (DEFAULT_FPS << 16), + V4L2_CID_MPEG_VIDC_OPERATING_RATE, + 0, + CAP_FLAG_OUTPUT_PORT | + CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_operating_rate}, + {OPERATING_RATE, DEC, VP9, (MINIMUM_FPS << 16), (MAXIMUM_OVERRIDE_VP9_FPS << 16), - 1, (DEFAULT_FPS << 16)}, + 1, (DEFAULT_FPS << 16), + V4L2_CID_MPEG_VIDC_OPERATING_RATE, + 0, + CAP_FLAG_OUTPUT_PORT | + CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + msm_vidc_adjust_operating_rate}, {INPUT_RATE, ENC|DEC, CODECS_ALL, (MINIMUM_FPS << 16), INT_MAX, diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index adef833ee2..03ab6d5cb7 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -52,6 +52,8 @@ int msm_vidc_prepare_dependency_list(struct msm_vidc_inst *inst); int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_all_intra(void *instance, struct v4l2_ctrl *ctrl); +int msm_vidc_adjust_frame_rate(void *instance, struct v4l2_ctrl *ctrl); +int msm_vidc_adjust_operating_rate(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_set_header_mode(void *instance, enum msm_vidc_inst_capability_type cap_id); diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index 2b3c25e7fd..4fcff7dc43 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -1040,6 +1040,7 @@ static int msm_vidc_update_static_property(struct msm_vidc_inst *inst, if (rc) return rc; } + if (ctrl->id == V4L2_CID_MPEG_VIDC_PRIORITY) { rc = msm_vidc_adjust_session_priority(inst, ctrl); if (rc) @@ -2745,6 +2746,69 @@ int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl) return 0; } +int msm_vidc_adjust_frame_rate(void *instance, struct v4l2_ctrl *ctrl) +{ + int rc = 0; + struct msm_vidc_inst_capability *capability; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + u32 adjusted_value; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + adjusted_value = ctrl ? ctrl->val : capability->cap[FRAME_RATE].value; + + if (is_realtime_session(inst)) { + rc = msm_vidc_check_core_mbps(inst); + if (rc) { + i_vpr_e(inst, "%s: unsupported load\n", __func__); + return rc; + } + } + + inst->priority_level = MSM_VIDC_PRIORITY_HIGH; + capability->cap[FRAME_RATE].flags |= CAP_FLAG_CLIENT_SET; + + msm_vidc_update_cap_value(inst, FRAME_RATE, adjusted_value, __func__); + + return 0; +} + +int msm_vidc_adjust_operating_rate(void *instance, struct v4l2_ctrl *ctrl) +{ + int rc = 0; + struct msm_vidc_inst_capability *capability; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + u32 adjusted_value; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + adjusted_value = ctrl ? ctrl->val : capability->cap[OPERATING_RATE].value; + + if (is_realtime_session(inst)) { + rc = msm_vidc_check_core_mbps(inst); + if (rc) { + i_vpr_e(inst, "%s: unsupported load\n", __func__); + return rc; + } + } + + inst->priority_level = MSM_VIDC_PRIORITY_HIGH; + capability->cap[OPERATING_RATE].flags |= CAP_FLAG_CLIENT_SET; + + msm_vidc_update_cap_value(inst, OPERATING_RATE, adjusted_value, __func__); + + return 0; +} + + int msm_vidc_prepare_dependency_list(struct msm_vidc_inst *inst) { struct list_head root_list, opt_list; diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 5030c29eab..b85682cf52 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -1316,6 +1316,8 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id) case V4L2_CID_MPEG_VIDC_PRIORITY: case V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST: case V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD: + case V4L2_CID_MPEG_VIDC_FRAME_RATE: + case V4L2_CID_MPEG_VIDC_OPERATING_RATE: allow = true; break; default: diff --git a/include/uapi/vidc/media/v4l2_vidc_extensions.h b/include/uapi/vidc/media/v4l2_vidc_extensions.h index d99e096d0d..ed33dc50c5 100644 --- a/include/uapi/vidc/media/v4l2_vidc_extensions.h +++ b/include/uapi/vidc/media/v4l2_vidc_extensions.h @@ -66,6 +66,9 @@ #define V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST (V4L2_CID_MPEG_VIDC_BASE + 0x3) /* FIXme: */ #define V4L2_CID_MPEG_VIDC_CODEC_CONFIG (V4L2_CID_MPEG_VIDC_BASE + 0x4) +#define V4L2_CID_MPEG_VIDC_FRAME_RATE (V4L2_CID_MPEG_VIDC_BASE + 0x5) +#define V4L2_CID_MPEG_VIDC_OPERATING_RATE (V4L2_CID_MPEG_VIDC_BASE + 0x6) + /* Encoder Intra refresh period */ #define V4L2_CID_MPEG_VIDC_INTRA_REFRESH_PERIOD (V4L2_CID_MPEG_VIDC_BASE + 0xB) #define V4L2_CID_MPEG_VIDC_TIME_DELTA_BASED_RC (V4L2_CID_MPEG_VIDC_BASE + 0xD)