video: driver: use CAP_FLAG_DYNAMIC_ALLOWED flag to allow ctrls

Currently ctrl_id is being used to decide whether to allow or not
certain control dynamically i.e. after stream on.
Use CAP_FLAG_DYNAMIC_ALLOWED to do the same instead.

Change-Id: I56bf5e725ae7bd4ece8aa2bde0aa84c42e759c17
Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
This commit is contained in:
Dikshita Agarwal
2022-07-13 12:01:51 +05:30
부모 b3fa32cf81
커밋 fd5d2c059b
3개의 변경된 파일23개의 추가작업 그리고 65개의 파일을 삭제

파일 보기

@@ -499,7 +499,8 @@ struct msm_vidc_inst *get_inst(struct msm_vidc_core *core,
u32 session_id); u32 session_id);
void put_inst(struct msm_vidc_inst *inst); 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_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, bool msm_vidc_allow_metadata_delivery(struct msm_vidc_inst *inst,
u32 cap_id, u32 port); u32 cap_id, u32 port);
bool msm_vidc_allow_metadata_subscription(struct msm_vidc_inst *inst, bool msm_vidc_allow_metadata_subscription(struct msm_vidc_inst *inst,

파일 보기

@@ -1178,11 +1178,6 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl)
i_vpr_h(inst, FMT_STRING_SET_CTRL, i_vpr_h(inst, FMT_STRING_SET_CTRL,
__func__, state_name(inst->state), ctrl->name, ctrl->id, ctrl->val); __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); cap_id = msm_vidc_get_cap_id(inst, ctrl->id);
if (!is_valid_cap_id(cap_id)) { if (!is_valid_cap_id(cap_id)) {
i_vpr_e(inst, "%s: could not find cap_id for ctrl %s\n", 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; 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->id == V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD) {
if (ctrl->val == INVALID_FD || ctrl->val == INT_MAX) { if (ctrl->val == INVALID_FD || ctrl->val == INT_MAX) {
i_vpr_e(inst, i_vpr_e(inst,

파일 보기

@@ -1379,11 +1379,12 @@ exit:
return allow; 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; bool allow = false;
if (!inst) { if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__); d_vpr_e("%s: invalid params\n", __func__);
return false; return false;
} }
@@ -1391,26 +1392,22 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id)
allow = true; allow = true;
goto exit; 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 (is_decode_session(inst)) {
if (!inst->bufq[INPUT_PORT].vb2q->streaming) { if (!inst->bufq[INPUT_PORT].vb2q->streaming) {
allow = true; allow = true;
goto exit; goto exit;
} }
if (inst->bufq[INPUT_PORT].vb2q->streaming) { if (inst->bufq[INPUT_PORT].vb2q->streaming) {
switch (id) { if (inst->capabilities->cap[cap_id].flags &
case V4L2_CID_MPEG_VIDC_CODEC_CONFIG: CAP_FLAG_DYNAMIC_ALLOWED)
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:
allow = true; allow = true;
break;
default:
allow = false;
break;
}
} }
} else if (is_encode_session(inst)) { } else if (is_encode_session(inst)) {
if (!inst->bufq[OUTPUT_PORT].vb2q->streaming) { 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; goto exit;
} }
if (inst->bufq[OUTPUT_PORT].vb2q->streaming) { if (inst->bufq[OUTPUT_PORT].vb2q->streaming) {
switch (id) { if (inst->capabilities->cap[cap_id].flags &
case V4L2_CID_MPEG_VIDEO_BITRATE: CAP_FLAG_DYNAMIC_ALLOWED)
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:
allow = true; allow = true;
break;
default:
allow = false;
break;
}
} }
} }
exit: exit:
if (!allow) if (!allow)
i_vpr_e(inst, "%s: id %#x not allowed in state %s\n", i_vpr_e(inst, "%s: cap_id %#x not allowed in state %s\n",
__func__, id, state_name(inst->state)); __func__, cap_id, state_name(inst->state));
return allow; return allow;
} }