Procházet zdrojové kódy

video: driver: adjust properties during reqbufs

- Adjust v4l2 properties during reqbufs of
  master port. Set properties to firmware
  during streamon of master port.
- Calculate buffer size and buffer counts
  during reqbufs call of each port.
- This is done to recalculate buffer sizes
  and counts after client has configured
  all the controls and updated size and
  count can be returned to client before
  streamon.

Change-Id: Ifc7ee36456d5d4e1c862952de581af3d7ae126b0
Signed-off-by: Darshana Patil <[email protected]>
Darshana Patil před 2 roky
rodič
revize
7affdd1031

+ 2 - 1
driver/vidc/inc/msm_vidc_control.h

@@ -16,7 +16,8 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl);
 int msm_v4l2_op_g_volatile_ctrl(struct v4l2_ctrl *ctrl);
 int msm_vidc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl);
 int msm_vidc_prepare_dependency_list(struct msm_vidc_inst *inst);
-int msm_vidc_adjust_set_v4l2_properties(struct msm_vidc_inst *inst);
+int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst);
+int msm_vidc_set_v4l2_properties(struct msm_vidc_inst *inst);
 bool is_valid_cap_id(enum msm_vidc_inst_capability_type cap_id);
 bool is_valid_cap(struct msm_vidc_inst *inst,
 		enum msm_vidc_inst_capability_type cap_id);

+ 2 - 0
driver/vidc/inc/msm_vidc_inst.h

@@ -127,6 +127,7 @@ struct msm_vidc_inst {
 	bool                               once_per_session_set;
 	bool                               ipsc_properties_set;
 	bool                               opsc_properties_set;
+	bool                               caps_list_prepared;
 	struct dentry                     *debugfs_root;
 	struct msm_vidc_debug              debug;
 	struct debug_buf_count             debug_count;
@@ -146,6 +147,7 @@ struct msm_vidc_inst {
 	bool                               ir_enabled;
 	u32                                adjust_priority;
 	bool                               iframe;
+	u32                                fw_min_count;
 };
 
 #endif // _MSM_VIDC_INST_H_

+ 5 - 1
driver/vidc/src/msm_vdec.c

@@ -1338,8 +1338,11 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst)
 		inst->fmts[OUTPUT_PORT].fmt.pix_mp.quantization;
 
 	inst->buffers.output.min_count = subsc_params.fw_min_count;
+	inst->fw_min_count = subsc_params.fw_min_count;
 	inst->buffers.output.extra_count = call_session_op(core,
 		extra_count, inst, MSM_VIDC_BUF_OUTPUT);
+	inst->buffers.output_meta.min_count = inst->buffers.output.min_count;
+	inst->buffers.output_meta.extra_count = inst->buffers.output.extra_count;
 	if (is_thumbnail_session(inst) && inst->codec != MSM_VIDC_VP9) {
 		if (inst->buffers.output.min_count != 1) {
 			i_vpr_e(inst, "%s: invalid min count %d in thumbnail case\n",
@@ -1448,7 +1451,7 @@ int msm_vdec_streamon_input(struct msm_vidc_inst *inst)
 	if (rc)
 		goto error;
 
-	rc = msm_vidc_adjust_set_v4l2_properties(inst);
+	rc = msm_vidc_set_v4l2_properties(inst);
 	if (rc)
 		goto error;
 
@@ -2692,6 +2695,7 @@ int msm_vdec_inst_init(struct msm_vidc_inst *inst)
 			inst->buffers.output.extra_count;
 	inst->buffers.output.size = f->fmt.pix_mp.plane_fmt[0].sizeimage;
 	inst->max_map_output_count = MAX_MAP_OUTPUT_COUNT;
+	inst->fw_min_count = 0;
 
 	f = &inst->fmts[OUTPUT_META_PORT];
 	f->type = OUTPUT_META_PLANE;

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

@@ -1067,7 +1067,7 @@ int msm_venc_streamon_output(struct msm_vidc_inst *inst)
 	if (rc)
 		goto error;
 
-	rc = msm_vidc_adjust_set_v4l2_properties(inst);
+	rc = msm_vidc_set_v4l2_properties(inst);
 	if (rc)
 		goto error;
 

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

@@ -922,6 +922,7 @@ void *msm_vidc_open(void *vidc_core, u32 session_type)
 	inst->request = false;
 	inst->ipsc_properties_set = false;
 	inst->opsc_properties_set = false;
+	inst->caps_list_prepared = false;
 	inst->has_bframe = false;
 	inst->iframe = false;
 	inst->auto_framerate = DEFAULT_FPS << 16;

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

@@ -65,6 +65,9 @@ u32 msm_vidc_output_min_count(struct msm_vidc_inst *inst)
 		return 1;
 
 	if (is_decode_session(inst)) {
+		if (inst->fw_min_count)
+			return inst->fw_min_count;
+
 		switch (inst->codec) {
 		case MSM_VIDC_H264:
 		case MSM_VIDC_HEVC:

+ 15 - 5
driver/vidc/src/msm_vidc_control.c

@@ -1049,11 +1049,7 @@ error:
 	return rc;
 }
 
-/*
- * Loop over instance capabilities from caps_list
- * and call adjust and set function
- */
-int msm_vidc_adjust_set_v4l2_properties(struct msm_vidc_inst *inst)
+int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst)
 {
 	struct msm_vidc_inst_cap_entry *entry = NULL, *temp = NULL;
 	int rc = 0;
@@ -1074,6 +1070,20 @@ int msm_vidc_adjust_set_v4l2_properties(struct msm_vidc_inst *inst)
 			return rc;
 	}
 
+	return rc;
+}
+
+int msm_vidc_set_v4l2_properties(struct msm_vidc_inst *inst)
+{
+	struct msm_vidc_inst_cap_entry *entry = NULL, *temp = NULL;
+	int rc = 0;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+	i_vpr_h(inst, "%s()\n", __func__);
+
 	/* set all caps from caps_list */
 	list_for_each_entry_safe(entry, temp, &inst->caps_list, list) {
 		rc = msm_vidc_set_cap(inst, entry->cap_id, __func__);

+ 32 - 35
driver/vidc/src/msm_vidc_vb2.c

@@ -247,6 +247,7 @@ int msm_vb2_queue_setup(struct vb2_queue *q,
 	enum msm_vidc_buffer_type buffer_type = 0;
 	enum msm_vidc_buffer_region region = MSM_VIDC_REGION_NONE;
 	struct context_bank_info *cb = NULL;
+	struct msm_vidc_buffers *buffers;
 
 	if (!q || !num_buffers || !num_planes
 		|| !sizes || !q->drv_priv) {
@@ -270,6 +271,24 @@ int msm_vb2_queue_setup(struct vb2_queue *q,
 	if (port < 0)
 		return -EINVAL;
 
+	/* prepare dependency list once per session */
+	if (!inst->caps_list_prepared) {
+		rc = msm_vidc_prepare_dependency_list(inst);
+		if (rc)
+			return rc;
+		inst->caps_list_prepared = true;
+	}
+
+	/* adjust v4l2 properties for master port */
+	if ((is_encode_session(inst) && port == OUTPUT_PORT) ||
+		(is_decode_session(inst) && port == INPUT_PORT)) {
+		rc = msm_vidc_adjust_v4l2_properties(inst);
+		if (rc) {
+			i_vpr_e(inst, "%s: failed to adjust properties\n", __func__);
+			return rc;
+		}
+	}
+
 	if (*num_planes && (port == INPUT_PORT || port == OUTPUT_PORT)) {
 		f = &inst->fmts[port];
 		if (*num_planes != f->fmt.pix_mp.num_planes) {
@@ -295,44 +314,26 @@ int msm_vb2_queue_setup(struct vb2_queue *q,
 		return rc;
 	}
 
-	if (port == INPUT_PORT) {
-		*num_planes = 1;
-		if (*num_buffers < inst->buffers.input.min_count +
-			inst->buffers.input.extra_count)
-			*num_buffers = inst->buffers.input.min_count +
-				inst->buffers.input.extra_count;
-		inst->buffers.input.actual_count = *num_buffers;
-
-	} else if (port == INPUT_META_PORT) {
-		*num_planes = 1;
-		if (*num_buffers < inst->buffers.input_meta.min_count +
-			inst->buffers.input_meta.extra_count)
-			*num_buffers = inst->buffers.input_meta.min_count +
-				inst->buffers.input_meta.extra_count;
-		inst->buffers.input_meta.actual_count = *num_buffers;
-
-	} else if (port == OUTPUT_PORT) {
-		*num_planes = 1;
-		if (*num_buffers < inst->buffers.output.min_count +
-			inst->buffers.output.extra_count)
-			*num_buffers = inst->buffers.output.min_count +
-				inst->buffers.output.extra_count;
-		inst->buffers.output.actual_count = *num_buffers;
+	buffers = msm_vidc_get_buffers(inst, buffer_type, __func__);
+	if (!buffers)
+		return -EINVAL;
 
-	} else if (port == OUTPUT_META_PORT) {
-		*num_planes = 1;
-		if (*num_buffers < inst->buffers.output_meta.min_count +
-			inst->buffers.output_meta.extra_count)
-			*num_buffers = inst->buffers.output_meta.min_count +
-				inst->buffers.output_meta.extra_count;
-		inst->buffers.output_meta.actual_count = *num_buffers;
-	}
+	buffers->min_count = call_session_op(core, min_count, inst, buffer_type);
+	buffers->extra_count = call_session_op(core, extra_count, inst, buffer_type);
+	if (*num_buffers < buffers->min_count + buffers->extra_count)
+		*num_buffers = buffers->min_count + buffers->extra_count;
+	buffers->actual_count = *num_buffers;
+	*num_planes = 1;
 
+	buffers->size = call_session_op(core, buffer_size, inst, buffer_type);
 	if (port == INPUT_PORT || port == OUTPUT_PORT) {
+		inst->fmts[port].fmt.pix_mp.plane_fmt[0].sizeimage = buffers->size;
 		sizes[0] = inst->fmts[port].fmt.pix_mp.plane_fmt[0].sizeimage;
 	} else if (port == OUTPUT_META_PORT) {
+		inst->fmts[port].fmt.meta.buffersize = buffers->size;
 		sizes[0] = inst->fmts[port].fmt.meta.buffersize;
 	} else if (port == INPUT_META_PORT) {
+		inst->fmts[port].fmt.meta.buffersize = buffers->size;
 		if (inst->capabilities->cap[SUPER_FRAME].value)
 			sizes[0] = inst->capabilities->cap[SUPER_FRAME].value *
 				inst->fmts[port].fmt.meta.buffersize;
@@ -428,10 +429,6 @@ int msm_vidc_start_streaming(struct msm_vidc_inst *inst, struct vb2_queue *q)
 
 	if (!inst->once_per_session_set) {
 		inst->once_per_session_set = true;
-		rc = msm_vidc_prepare_dependency_list(inst);
-		if (rc)
-			return rc;
-
 		rc = msm_vidc_session_set_codec(inst);
 		if (rc)
 			return rc;