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

Commit 836f094f authored by Praneeth Paladugu's avatar Praneeth Paladugu Committed by Gerrit - the friendly Code Review server
Browse files

msm: vidc: Fix decoder output buffer size issue



Decoder YUV buffer size should be derived based on current
resolution using Venus MACROS. This the only size that
clients are aware of. Using the size from FW will make
buffer sizes mismatches and unnecessary failures.

By not using buffer size from Venus, driver can avoid
unnecessary buffer requirement calls. This will reduce the
start-up latency.

CRs-Fixed: 1011881
Change-Id: I90762967e8b7888a775ce4771b6cdb08528b6513
Signed-off-by: default avatarPraneeth Paladugu <ppaladug@codeaurora.org>
parent 22194df2
Loading
Loading
Loading
Loading
+29 −55
Original line number Diff line number Diff line
@@ -1083,13 +1083,6 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
		return -EINVAL;
	}

	rc = msm_comm_try_get_bufreqs(inst);
	if (rc) {
		dprintk(VIDC_ERR, "Getting buffer requirements failed: %d\n",
				rc);
		return rc;
	}

	hdev = inst->core->device;
	if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
		fmt = inst->fmts[CAPTURE_PORT];
@@ -1132,13 +1125,6 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
	stride = inst->prop.width[CAPTURE_PORT];
	scanlines = inst->prop.height[CAPTURE_PORT];

	rc = msm_comm_try_get_bufreqs(inst);
	if (rc) {
		dprintk(VIDC_ERR,
				"%s: Failed : Buffer requirements\n", __func__);
		goto exit;
	}

	if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
		plane_sizes = &inst->bufq[OUTPUT_PORT].vb2_bufq.plane_sizes[0];
		for (i = 0; i < fmt->num_planes; ++i) {
@@ -1173,10 +1159,9 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
		scanlines = VENUS_Y_SCANLINES(color_format,
				inst->prop.height[CAPTURE_PORT]);

		bufreq = get_buff_req_buffer(inst,
				msm_comm_get_hal_output_buffer(inst));
		f->fmt.pix_mp.plane_fmt[0].sizeimage =
			bufreq ? bufreq->buffer_size : 0;
			fmt->get_frame_size(0,
			f->fmt.pix_mp.height, f->fmt.pix_mp.width);

		extra_idx = EXTRADATA_IDX(fmt->num_planes);
		if (extra_idx && extra_idx < VIDEO_MAX_PLANES) {
@@ -1313,28 +1298,6 @@ static int update_output_buffer_size(struct msm_vidc_inst *inst,
			goto exit;
	}

	/* Query buffer requirements from firmware */
	rc = msm_comm_try_get_bufreqs(inst);
	if (rc)
		dprintk(VIDC_WARN,
			"Failed to get buf req, %d\n", rc);

	/* Read back updated firmware size */
	for (i = 0; i < num_planes; ++i) {
		enum hal_buffer type = msm_comm_get_hal_output_buffer(inst);

		if (EXTRADATA_IDX(num_planes) &&
			i == EXTRADATA_IDX(num_planes)) {
			type = HAL_BUFFER_EXTRADATA_OUTPUT;
		}

		bufreq = get_buff_req_buffer(inst, type);
		f->fmt.pix_mp.plane_fmt[i].sizeimage = bufreq ?
					bufreq->buffer_size : 0;
		dprintk(VIDC_DBG,
				"updated buffer size for plane[%d] = %d\n",
				i, f->fmt.pix_mp.plane_fmt[i].sizeimage);
	}
exit:
	return rc;
}
@@ -1374,10 +1337,12 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
{
	struct msm_vidc_format *fmt = NULL;
	struct hal_frame_size frame_sz;
	unsigned int extra_idx = 0;
	int rc = 0;
	int ret = 0;
	int i;
	int max_input_size = 0;
	struct hal_buffer_requirements *bufreq;

	if (!inst || !f) {
		dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
@@ -1422,23 +1387,22 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
				HAL_PARAM_FRAME_SIZE, &frame_sz);
		}

		ret = ret || msm_comm_try_get_bufreqs(inst);
		if (ret) {
			for (i = 0; i < fmt->num_planes; ++i) {
				f->fmt.pix_mp.plane_fmt[i].sizeimage =
					get_frame_size(inst, fmt, f->type, i);
			}
		} else {
			rc = update_output_buffer_size(inst, f,
				fmt->num_planes);
			if (rc) {
				dprintk(VIDC_ERR,
					"%s - failed to update buffer size: %d\n",
					__func__, rc);
				goto err_invalid_fmt;
			}
		f->fmt.pix_mp.plane_fmt[0].sizeimage =
			fmt->get_frame_size(0,
			f->fmt.pix_mp.height, f->fmt.pix_mp.width);

		extra_idx = EXTRADATA_IDX(fmt->num_planes);
		if (extra_idx && extra_idx < VIDEO_MAX_PLANES) {
			bufreq = get_buff_req_buffer(inst,
					HAL_BUFFER_EXTRADATA_OUTPUT);
			f->fmt.pix_mp.plane_fmt[extra_idx].sizeimage =
				bufreq ? bufreq->buffer_size : 0;
		}

		for (i = 0; i < fmt->num_planes; ++i)
			inst->bufq[CAPTURE_PORT].vb2_bufq.plane_sizes[i] =
				f->fmt.pix_mp.plane_fmt[i].sizeimage;

		f->fmt.pix_mp.num_planes = fmt->num_planes;
		for (i = 0; i < fmt->num_planes; ++i) {
			inst->bufq[CAPTURE_PORT].vb2_bufq.plane_sizes[i] =
@@ -1615,6 +1579,15 @@ static int msm_vdec_queue_setup(struct vb2_queue *q,
		return -EINVAL;
	}

	rc = msm_comm_try_get_bufreqs(inst);
	if (rc) {
		dprintk(VIDC_ERR,
				"%s: Failed : Buffer requirements\n", __func__);
		goto exit;
	}



	switch (q->type) {
	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
		*num_planes = inst->fmts[OUTPUT_PORT]->num_planes;
@@ -1689,7 +1662,7 @@ static int msm_vdec_queue_setup(struct vb2_queue *q,
				inst->buff_req.buffer[1].buffer_count_actual,
				inst->buff_req.buffer[1].buffer_size,
				inst->buff_req.buffer[1].buffer_alignment);
		sizes[0] = bufreq->buffer_size;
		sizes[0] = inst->bufq[CAPTURE_PORT].vb2_bufq.plane_sizes[0];

		/*
		 * Set actual buffer count to firmware for DPB buffers.
@@ -1730,6 +1703,7 @@ static int msm_vdec_queue_setup(struct vb2_queue *q,
		rc = -EINVAL;
		break;
	}
exit:
	return rc;
}