Ver código fonte

Merge "video: driver: add try_fmt allow checks inside state handler"

qctecmdr 2 anos atrás
pai
commit
547e7c4988

+ 0 - 1
driver/vidc/inc/msm_vidc_driver.h

@@ -518,7 +518,6 @@ struct msm_vidc_inst *get_inst_ref(struct msm_vidc_core *core,
 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_metadata_delivery(struct msm_vidc_inst *inst,
 	u32 cap_id, u32 port);
 bool msm_vidc_allow_metadata_subscription(struct msm_vidc_inst *inst,

+ 1 - 0
driver/vidc/inc/msm_vidc_state.h

@@ -19,6 +19,7 @@ struct msm_vidc_core;
 }
 
 #define FOREACH_EVENT(EVENT) {                         \
+	EVENT(TRY_FMT)                                 \
 	EVENT(S_FMT)                                   \
 	EVENT(REQBUFS)                                 \
 	EVENT(S_CTRL)                                  \

+ 0 - 3
driver/vidc/src/msm_vidc.c

@@ -228,9 +228,6 @@ int msm_vidc_try_fmt(void *instance, struct v4l2_format *f)
 		return -EINVAL;
 	}
 
-	if (!msm_vidc_allow_s_fmt(inst, f->type))
-		return -EBUSY;
-
 	if (inst->domain == MSM_VIDC_DECODER)
 		rc = msm_vdec_try_fmt(inst, f);
 	if (inst->domain == MSM_VIDC_ENCODER)

+ 0 - 32
driver/vidc/src/msm_vidc_driver.c

@@ -941,38 +941,6 @@ int signal_session_msg_receipt(struct msm_vidc_inst *inst,
 	return 0;
 }
 
-bool msm_vidc_allow_s_fmt(struct msm_vidc_inst *inst, u32 type)
-{
-	bool allow = false;
-
-	if (!inst) {
-		d_vpr_e("%s: invalid params\n", __func__);
-		return false;
-	}
-	if (is_state(inst, MSM_VIDC_OPEN)) {
-		allow = true;
-		goto exit;
-	}
-	if (type == OUTPUT_MPLANE || type == OUTPUT_META_PLANE) {
-		if (is_state(inst, MSM_VIDC_INPUT_STREAMING)) {
-			allow = true;
-			goto exit;
-		}
-	}
-	if (type == INPUT_MPLANE || type == INPUT_META_PLANE) {
-		if (is_state(inst, MSM_VIDC_OUTPUT_STREAMING)) {
-			allow = true;
-			goto exit;
-		}
-	}
-
-exit:
-	if (!allow)
-		i_vpr_e(inst, "%s: type %d not allowed in state %s\n",
-				__func__, type, state_name(inst->state));
-	return allow;
-}
-
 bool msm_vidc_allow_metadata_delivery(struct msm_vidc_inst *inst, u32 cap_id,
 	u32 port)
 {

+ 42 - 0
driver/vidc/src/msm_vidc_state.c

@@ -645,6 +645,16 @@ static int msm_vidc_open_state(struct msm_vidc_inst *inst,
 	}
 
 	switch (event) {
+	case MSM_VIDC_TRY_FMT:
+	{
+		struct v4l2_format *f = (struct v4l2_format *)data;
+
+		/* allow try_fmt request in open state */
+		rc = msm_vidc_try_fmt(inst, f);
+		if (rc)
+			return rc;
+		break;
+	}
 	case MSM_VIDC_S_FMT:
 	{
 		struct v4l2_format *f = (struct v4l2_format *)data;
@@ -772,6 +782,22 @@ static int msm_vidc_input_streaming_state(struct msm_vidc_inst *inst,
 			return rc;
 		break;
 	}
+	case MSM_VIDC_TRY_FMT:
+	{
+		struct v4l2_format *f = (struct v4l2_format *)data;
+
+		/* disallow */
+		if (f->type == INPUT_MPLANE || f->type == INPUT_META_PLANE) {
+			i_vpr_e(inst, "%s: (%s) not allowed for (%s) port\n",
+				__func__, event_name(event), v4l2_type_name(f->type));
+			return -EBUSY;
+		}
+
+		rc = msm_vidc_try_fmt(inst, f);
+		if (rc)
+			return rc;
+		break;
+	}
 	case MSM_VIDC_S_FMT:
 	{
 		struct v4l2_format *f = (struct v4l2_format *)data;
@@ -958,6 +984,22 @@ static int msm_vidc_output_streaming_state(struct msm_vidc_inst *inst,
 			return rc;
 		break;
 	}
+	case MSM_VIDC_TRY_FMT:
+	{
+		struct v4l2_format *f = (struct v4l2_format *)data;
+
+		/* disallow */
+		if (f->type == OUTPUT_MPLANE || f->type == OUTPUT_META_PLANE) {
+			i_vpr_e(inst, "%s: (%s) not allowed for (%s) port\n",
+				__func__, event_name(event), v4l2_type_name(f->type));
+			return -EBUSY;
+		}
+
+		rc = msm_vidc_try_fmt(inst, f);
+		if (rc)
+			return rc;
+		break;
+	}
 	case MSM_VIDC_S_FMT:
 	{
 		struct v4l2_format *f = (struct v4l2_format *)data;

+ 1 - 1
driver/vidc/src/msm_vidc_v4l2.c

@@ -135,7 +135,7 @@ int msm_v4l2_try_fmt(struct file *filp, void *fh, struct v4l2_format *f)
 		rc = -EBUSY;
 		goto unlock;
 	}
-	rc = msm_vidc_try_fmt((void *)inst, f);
+	rc = inst->event_handle(inst, MSM_VIDC_TRY_FMT, f);
 	if (rc)
 		goto unlock;