[PATCH] media: hantro: relax s_fmt(out) busy error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Setting the output format resets the capture queue, so we return -EBUSY
while the capture queue has buffers allocated. If capture dimensions
and pixel format don't change though, we can allow setting the output
format without reallocating the capture queue.

Signed-off-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx>
---
This applies on top of https://patchwork.linuxtv.org/patch/59337/
("media: hantro: Fix s_fmt for dynamic resolution changes").
---
 drivers/staging/media/hantro/hantro_v4l2.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/staging/media/hantro/hantro_v4l2.c b/drivers/staging/media/hantro/hantro_v4l2.c
index 586d243cc3cc..05c3edce27a9 100644
--- a/drivers/staging/media/hantro/hantro_v4l2.c
+++ b/drivers/staging/media/hantro/hantro_v4l2.c
@@ -368,7 +368,7 @@ vidioc_s_fmt_out_mplane(struct file *file, void *priv, struct v4l2_format *f)
 	struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
 	struct hantro_ctx *ctx = fh_to_ctx(priv);
 	struct vb2_queue *vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
-	const struct hantro_fmt *formats;
+	const struct hantro_fmt *raw_vpu_fmt, *formats;
 	unsigned int num_fmts;
 	int ret;
 
@@ -394,8 +394,16 @@ vidioc_s_fmt_out_mplane(struct file *file, void *priv, struct v4l2_format *f)
 		 */
 		peer_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx,
 					  V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
-		if (vb2_is_busy(peer_vq))
-			return -EBUSY;
+		if (vb2_is_busy(peer_vq)) {
+			formats = hantro_get_formats(ctx, &num_fmts);
+			raw_vpu_fmt = hantro_get_default_fmt(formats, num_fmts,
+							     false);
+
+			if (ctx->dst_fmt.width != pix_mp->width ||
+			    ctx->dst_fmt.height != pix_mp->height ||
+			    ctx->dst_fmt.pixelformat != raw_vpu_fmt->fourcc)
+				return -EBUSY;
+		}
 	} else {
 		/*
 		 * The encoder doesn't admit a format change if
-- 
2.20.1




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux