diff --git a/driver/platform/kalama/src/msm_vidc_kalama.c b/driver/platform/kalama/src/msm_vidc_kalama.c index 6d1a4ffd4c..76bfa9a2de 100644 --- a/driver/platform/kalama/src/msm_vidc_kalama.c +++ b/driver/platform/kalama/src/msm_vidc_kalama.c @@ -252,19 +252,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 8cbcc86278..bd3da45ef3 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 d5947c7112..a26ee1d329 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 45fd2e4143..e8d6109ca1 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) @@ -2770,6 +2771,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)