浏览代码

Merge "video: driver: optimize thumbnail input buffer count"

qctecmdr 4 年之前
父节点
当前提交
c2501b7b53
共有 3 个文件被更改,包括 80 次插入2 次删除
  1. 1 0
      driver/vidc/inc/msm_vidc_driver.h
  2. 5 2
      driver/vidc/src/msm_vidc_control.c
  3. 74 0
      driver/vidc/src/msm_vidc_driver.c

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

@@ -358,6 +358,7 @@ void inst_unlock(struct msm_vidc_inst *inst, const char *function);
 bool inst_lock_check(struct msm_vidc_inst *inst, const char *function);
 int msm_vidc_update_bitstream_buffer_size(struct msm_vidc_inst *inst);
 int msm_vidc_update_meta_port_settings(struct msm_vidc_inst *inst);
+int msm_vidc_update_buffer_count(struct msm_vidc_inst *inst, u32 port);
 void msm_vidc_schedule_core_deinit(struct msm_vidc_core *core);
 bool msm_vidc_is_super_buffer(struct msm_vidc_inst *inst);
 int msm_vidc_init_core_caps(struct msm_vidc_core* core);

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

@@ -658,13 +658,16 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl)
 			if (rc)
 				return rc;
 		}
-
 		if (ctrl->id == V4L2_CID_MPEG_VIDC_PRIORITY) {
 			rc = msm_vidc_adjust_session_priority(inst, ctrl);
 			if (rc)
 				return rc;
 		}
-
+		if (ctrl->id == V4L2_CID_MPEG_VIDC_THUMBNAIL_MODE) {
+			rc = msm_vidc_update_buffer_count(inst, INPUT_PORT);
+			if (rc)
+				return rc;
+		}
 		if (is_meta_ctrl(ctrl->id)) {
 			if (cap_id == META_DPB_TAG_LIST) {
 				/*

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

@@ -4296,6 +4296,80 @@ int msm_vidc_update_meta_port_settings(struct msm_vidc_inst *inst)
 	return 0;
 }
 
+int msm_vidc_update_buffer_count(struct msm_vidc_inst *inst, u32 port)
+{
+	struct msm_vidc_core *core;
+
+	if (!inst || !inst->core) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+	core = inst->core;
+
+	switch (port) {
+	case INPUT_PORT:
+		inst->buffers.input.min_count = call_session_op(core,
+			min_count, inst, MSM_VIDC_BUF_INPUT);
+		inst->buffers.input.extra_count = call_session_op(core,
+			extra_count, inst, MSM_VIDC_BUF_INPUT);
+		if (inst->buffers.input.actual_count <
+			inst->buffers.input.min_count +
+			inst->buffers.input.extra_count) {
+			inst->buffers.input.actual_count =
+				inst->buffers.input.min_count +
+				inst->buffers.input.extra_count;
+		}
+		if (is_input_meta_enabled(inst)) {
+			inst->buffers.input_meta.min_count =
+					inst->buffers.input.min_count;
+			inst->buffers.input_meta.extra_count =
+					inst->buffers.input.extra_count;
+			inst->buffers.input_meta.actual_count =
+					inst->buffers.input.actual_count;
+		} else {
+			inst->buffers.input_meta.min_count = 0;
+			inst->buffers.input_meta.extra_count = 0;
+			inst->buffers.input_meta.actual_count = 0;
+		}
+		d_vpr_h("update input min buffer to %u\n",
+			inst->buffers.input.min_count);
+		break;
+	case OUTPUT_PORT:
+		if (!inst->vb2q[INPUT_PORT].streaming)
+			inst->buffers.output.min_count = call_session_op(core,
+				min_count, inst, MSM_VIDC_BUF_OUTPUT);
+		inst->buffers.output.extra_count = call_session_op(core,
+			extra_count, inst, MSM_VIDC_BUF_OUTPUT);
+		if (inst->buffers.output.actual_count <
+			inst->buffers.output.min_count +
+			inst->buffers.output.extra_count) {
+			inst->buffers.output.actual_count =
+				inst->buffers.output.min_count +
+				inst->buffers.output.extra_count;
+		}
+		if (is_output_meta_enabled(inst)) {
+			inst->buffers.output_meta.min_count =
+					inst->buffers.output.min_count;
+			inst->buffers.output_meta.extra_count =
+					inst->buffers.output.extra_count;
+			inst->buffers.output_meta.actual_count =
+					inst->buffers.output.actual_count;
+		} else {
+			inst->buffers.output_meta.min_count = 0;
+			inst->buffers.output_meta.extra_count = 0;
+			inst->buffers.output_meta.actual_count = 0;
+		}
+		d_vpr_h("update output min buffer to %u\n",
+			inst->buffers.output.min_count);
+		break;
+	default:
+		d_vpr_e("%s unknown port %d\n", __func__, port);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 void msm_vidc_schedule_core_deinit(struct msm_vidc_core *core)
 {
 	if (!core)