Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c41612ec authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: tune input buffer size based on buffer_size_limit"

parents 82bdad8d 2c0ee3a2
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -685,7 +685,7 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
		}

		mplane->plane_fmt[0].sizeimage =
			msm_vidc_calculate_dec_input_frame_size(inst);
			msm_vidc_calculate_dec_input_frame_size(inst, inst->buffer_size_limit);

		/* Driver can recalculate buffer count only for
		 * only for bitstream port. Decoder YUV port reconfig
@@ -733,7 +733,7 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
	} else if (f->type == INPUT_MPLANE) {
		fmt = &inst->fmts[INPUT_PORT].v4l2_fmt;
		fmt->fmt.pix_mp.plane_fmt[0].sizeimage =
			msm_vidc_calculate_dec_input_frame_size(inst);
			msm_vidc_calculate_dec_input_frame_size(inst, inst->buffer_size_limit);
		memcpy(f, fmt, sizeof(struct v4l2_format));
	} else {
		s_vpr_e(inst->sid, "%s: Unsupported buf type: %d\n",
@@ -817,7 +817,7 @@ int msm_vdec_inst_init(struct msm_vidc_inst *inst)
	f->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
	f->fmt.pix_mp.num_planes = 1;
	f->fmt.pix_mp.plane_fmt[0].sizeimage =
		msm_vidc_calculate_dec_input_frame_size(inst);
		msm_vidc_calculate_dec_input_frame_size(inst, inst->buffer_size_limit);
	fmt_desc = msm_comm_get_pixel_fmt_fourcc(vdec_input_formats,
		ARRAY_SIZE(vdec_input_formats), f->fmt.pix_mp.pixelformat,
		inst->sid);
+3 −4
Original line number Diff line number Diff line
@@ -876,7 +876,7 @@ static int msm_vidc_get_extra_output_buff_count(struct msm_vidc_inst *inst)
	return extra_output_count;
}

u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst)
u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst, u32 buffer_size_limit)
{
	u32 frame_size, num_mbs;
	u32 div_factor = 1;
@@ -928,9 +928,8 @@ u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst)
		inst->core->platform_data->vpu_ver != VPU_VERSION_AR50_LITE)
		frame_size = frame_size + (frame_size >> 2);

	if (inst->buffer_size_limit &&
		(inst->buffer_size_limit < frame_size)) {
		frame_size = inst->buffer_size_limit;
	if (buffer_size_limit && (buffer_size_limit < frame_size)) {
		frame_size = buffer_size_limit;
		s_vpr_h(inst->sid, "input buffer size limited to %d\n",
			frame_size);
	} else {
+2 −1
Original line number Diff line number Diff line
@@ -37,7 +37,8 @@ int msm_vidc_calculate_output_buffer_count(struct msm_vidc_inst *inst);
int msm_vidc_calculate_buffer_counts(struct msm_vidc_inst *inst);
int msm_vidc_get_extra_buff_count(struct msm_vidc_inst *inst,
	enum hal_buffer buffer_type);
u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst,
	u32 buffer_size_limit);
u32 msm_vidc_calculate_dec_output_frame_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_dec_output_extra_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_enc_input_frame_size(struct msm_vidc_inst *inst);
+13 −3
Original line number Diff line number Diff line
@@ -3351,6 +3351,9 @@ static void msm_comm_print_mem_usage(struct msm_vidc_core *core)
				break;
			}
		}
		if (is_decode_session(inst))
			sz_i = msm_vidc_calculate_dec_input_frame_size(inst, 0);
		else
			sz_i = iplane->plane_fmt[0].sizeimage;
		sz_i_e = iplane->plane_fmt[1].sizeimage;
		cnt_i = inp_f->count_min_host;
@@ -5802,7 +5805,7 @@ int msm_comm_check_memory_supported(struct msm_vidc_inst *vidc_inst)
	struct v4l2_format *f;
	struct hal_buffer_requirements *req;
	struct context_bank_info *cb = NULL;
	u32 i, dpb_cnt = 0, dpb_size = 0, rc = 0;
	u32 i, dpb_cnt = 0, dpb_size = 0, input_size = 1, rc = 0;
	u32 inst_mem_size, non_sec_cb_size = 0;
	u64 total_mem_size = 0, non_sec_mem_size = 0;
	u32 memory_limit_mbytes;
@@ -5812,10 +5815,17 @@ int msm_comm_check_memory_supported(struct msm_vidc_inst *vidc_inst)
	mutex_lock(&core->lock);
	list_for_each_entry(inst, &core->instances, list) {
		inst_mem_size = 0;
		input_size = 1;
		/* input port buffers memory size */
		fmt = &inst->fmts[INPUT_PORT];
		f = &fmt->v4l2_fmt;
		for (i = 0; i < f->fmt.pix_mp.num_planes; i++)
		if (is_decode_session(inst))
			input_size = msm_vidc_calculate_dec_input_frame_size(inst, 0);
		else
			input_size = f->fmt.pix_mp.plane_fmt[0].sizeimage;
		inst_mem_size += input_size * fmt->count_min_host;

		for (i = 1; i < f->fmt.pix_mp.num_planes; i++)
			inst_mem_size += f->fmt.pix_mp.plane_fmt[i].sizeimage *
							fmt->count_min_host;