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:
@@ -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,
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
Viittaa uudesa ongelmassa
Block a user