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
parent b3fa32cf81
commit fd5d2c059b
3 ha cambiato i file con 23 aggiunte e 65 eliminazioni

Vedi File

@@ -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,

Vedi File

@@ -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,

Vedi File

@@ -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;
}