diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index f94be4417f..a66000321b 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -499,7 +499,8 @@ struct msm_vidc_inst *get_inst(struct msm_vidc_core *core, u32 session_id); void put_inst(struct msm_vidc_inst *inst); bool msm_vidc_allow_s_fmt(struct msm_vidc_inst *inst, u32 type); -bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id); +bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, + enum msm_vidc_inst_capability_type cap_id); bool msm_vidc_allow_metadata_delivery(struct msm_vidc_inst *inst, u32 cap_id, u32 port); bool msm_vidc_allow_metadata_subscription(struct msm_vidc_inst *inst, diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index 09c7a1d0fa..af3234f419 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -1178,11 +1178,6 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl) i_vpr_h(inst, FMT_STRING_SET_CTRL, __func__, state_name(inst->state), ctrl->name, ctrl->id, ctrl->val); - if (!msm_vidc_allow_s_ctrl(inst, ctrl->id)) { - rc = -EINVAL; - goto unlock; - } - cap_id = msm_vidc_get_cap_id(inst, ctrl->id); if (!is_valid_cap_id(cap_id)) { i_vpr_e(inst, "%s: could not find cap_id for ctrl %s\n", @@ -1191,6 +1186,11 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl) goto unlock; } + if (!msm_vidc_allow_s_ctrl(inst, cap_id)) { + rc = -EINVAL; + goto unlock; + } + if (ctrl->id == V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD) { if (ctrl->val == INVALID_FD || ctrl->val == INT_MAX) { i_vpr_e(inst, diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index bd589a02af..0ff8ddc267 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -1379,11 +1379,12 @@ exit: return allow; } -bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id) +bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, + enum msm_vidc_inst_capability_type cap_id) { bool allow = false; - if (!inst) { + if (!inst || !inst->capabilities) { d_vpr_e("%s: invalid params\n", __func__); return false; } @@ -1391,26 +1392,22 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id) allow = true; goto exit; } + + if (!inst->capabilities->cap[cap_id].cap_id || + !inst->capabilities->cap[cap_id].v4l2_id) { + allow = false; + goto exit; + } + if (is_decode_session(inst)) { if (!inst->bufq[INPUT_PORT].vb2q->streaming) { allow = true; goto exit; } if (inst->bufq[INPUT_PORT].vb2q->streaming) { - switch (id) { - case V4L2_CID_MPEG_VIDC_CODEC_CONFIG: - 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: - case V4L2_CID_MPEG_VIDC_SW_FENCE_ID: + if (inst->capabilities->cap[cap_id].flags & + CAP_FLAG_DYNAMIC_ALLOWED) allow = true; - break; - default: - allow = false; - break; - } } } else if (is_encode_session(inst)) { if (!inst->bufq[OUTPUT_PORT].vb2q->streaming) { @@ -1418,56 +1415,16 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id) goto exit; } if (inst->bufq[OUTPUT_PORT].vb2q->streaming) { - switch (id) { - case V4L2_CID_MPEG_VIDEO_BITRATE: - case V4L2_CID_MPEG_VIDEO_GOP_SIZE: - case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME: - case V4L2_CID_HFLIP: - case V4L2_CID_VFLIP: - case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP: - case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP: - case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP: - case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP: - case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP: - case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP: - case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER: - case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER: - case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR: - case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR: - case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR: - case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR: - case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR: - case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR: - case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR: - case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR: - case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR: - case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR: - case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR: - case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR: - case V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES: - case V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX: - case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES: - case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_RESOLUTION: - case V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY: - case V4L2_CID_MPEG_VIDC_ENC_INPUT_COMPRESSION_RATIO: - case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: - case V4L2_CID_MPEG_VIDC_PRIORITY: - case V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD: - case V4L2_CID_MPEG_VIDC_INTRA_REFRESH_PERIOD: - case V4L2_CID_MPEG_VIDC_RESERVE_DURATION: + if (inst->capabilities->cap[cap_id].flags & + CAP_FLAG_DYNAMIC_ALLOWED) allow = true; - break; - default: - allow = false; - break; - } } } exit: if (!allow) - i_vpr_e(inst, "%s: id %#x not allowed in state %s\n", - __func__, id, state_name(inst->state)); + i_vpr_e(inst, "%s: cap_id %#x not allowed in state %s\n", + __func__, cap_id, state_name(inst->state)); return allow; }