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

Commit 98ea28a1 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: vidc: Fix decoder output buffer size issue"

parents 3c5fb094 5703768a
Loading
Loading
Loading
Loading
+28 −55
Original line number Original line Diff line number Diff line
@@ -1086,13 +1086,6 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
		return -EINVAL;
		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;
	hdev = inst->core->device;
	if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
	if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
		fmt = inst->fmts[CAPTURE_PORT];
		fmt = inst->fmts[CAPTURE_PORT];
@@ -1135,13 +1128,6 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
	stride = inst->prop.width[CAPTURE_PORT];
	stride = inst->prop.width[CAPTURE_PORT];
	scanlines = inst->prop.height[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) {
	if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
		plane_sizes = &inst->bufq[OUTPUT_PORT].vb2_bufq.plane_sizes[0];
		plane_sizes = &inst->bufq[OUTPUT_PORT].vb2_bufq.plane_sizes[0];
		for (i = 0; i < fmt->num_planes; ++i) {
		for (i = 0; i < fmt->num_planes; ++i) {
@@ -1176,10 +1162,10 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
		scanlines = VENUS_Y_SCANLINES(color_format,
		scanlines = VENUS_Y_SCANLINES(color_format,
				inst->prop.height[CAPTURE_PORT]);
				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 =
		f->fmt.pix_mp.plane_fmt[0].sizeimage =
			bufreq ? bufreq->buffer_size : 0;
			fmt->get_frame_size(0,
			inst->prop.height[CAPTURE_PORT],
			inst->prop.width[CAPTURE_PORT]);


		extra_idx = EXTRADATA_IDX(fmt->num_planes);
		extra_idx = EXTRADATA_IDX(fmt->num_planes);
		if (extra_idx && extra_idx < VIDEO_MAX_PLANES) {
		if (extra_idx && extra_idx < VIDEO_MAX_PLANES) {
@@ -1316,28 +1302,6 @@ static int update_output_buffer_size(struct msm_vidc_inst *inst,
			goto exit;
			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:
exit:
	return rc;
	return rc;
}
}
@@ -1377,10 +1341,12 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
{
{
	struct msm_vidc_format *fmt = NULL;
	struct msm_vidc_format *fmt = NULL;
	struct hal_frame_size frame_sz;
	struct hal_frame_size frame_sz;
	unsigned int extra_idx = 0;
	int rc = 0;
	int rc = 0;
	int ret = 0;
	int ret = 0;
	int i;
	int i;
	int max_input_size = 0;
	int max_input_size = 0;
	struct hal_buffer_requirements *bufreq;


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


		ret = ret || msm_comm_try_get_bufreqs(inst);
		f->fmt.pix_mp.plane_fmt[0].sizeimage =
		if (ret) {
			fmt->get_frame_size(0,
			for (i = 0; i < fmt->num_planes; ++i) {
			f->fmt.pix_mp.height, f->fmt.pix_mp.width);
				f->fmt.pix_mp.plane_fmt[i].sizeimage =

					get_frame_size(inst, fmt, f->type, i);
		extra_idx = EXTRADATA_IDX(fmt->num_planes);
			}
		if (extra_idx && extra_idx < VIDEO_MAX_PLANES) {
		} else {
			bufreq = get_buff_req_buffer(inst,
			rc = update_output_buffer_size(inst, f,
					HAL_BUFFER_EXTRADATA_OUTPUT);
				fmt->num_planes);
			f->fmt.pix_mp.plane_fmt[extra_idx].sizeimage =
			if (rc) {
				bufreq ? bufreq->buffer_size : 0;
				dprintk(VIDC_ERR,
					"%s - failed to update buffer size: %d\n",
					__func__, rc);
				goto err_invalid_fmt;
			}
		}
		}


		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;
		f->fmt.pix_mp.num_planes = fmt->num_planes;
		for (i = 0; i < fmt->num_planes; ++i) {
		for (i = 0; i < fmt->num_planes; ++i) {
			inst->bufq[CAPTURE_PORT].vb2_bufq.plane_sizes[i] =
			inst->bufq[CAPTURE_PORT].vb2_bufq.plane_sizes[i] =
@@ -1619,6 +1584,13 @@ static int msm_vdec_queue_setup(struct vb2_queue *q,
		return -EINVAL;
		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) {
	switch (q->type) {
	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
	case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
		*num_planes = inst->fmts[OUTPUT_PORT]->num_planes;
		*num_planes = inst->fmts[OUTPUT_PORT]->num_planes;
@@ -1693,7 +1665,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_count_actual,
				inst->buff_req.buffer[1].buffer_size,
				inst->buff_req.buffer[1].buffer_size,
				inst->buff_req.buffer[1].buffer_alignment);
				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.
		 * Set actual buffer count to firmware for DPB buffers.
@@ -1734,6 +1706,7 @@ static int msm_vdec_queue_setup(struct vb2_queue *q,
		rc = -EINVAL;
		rc = -EINVAL;
		break;
		break;
	}
	}
exit:
	return rc;
	return rc;
}
}