media: coda: do not try to propagate format if capture queue busy
authorPhilipp Zabel <p.zabel@pengutronix.de>
Fri, 27 Apr 2018 16:19:16 +0000 (12:19 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Wed, 9 May 2018 20:22:52 +0000 (16:22 -0400)
The driver helpfully resets the capture queue format and selection
rectangle whenever output format is changed. This only works while
the capture queue is not busy.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/platform/coda/coda-common.c

index 40632df9e3e8a482a805bb51269b6088ff7732bb..d3e22c14fad48d5fbb1b34eda77d023fc9317a7d 100644 (file)
@@ -787,6 +787,7 @@ static int coda_s_fmt_vid_out(struct file *file, void *priv,
 {
        struct coda_ctx *ctx = fh_to_ctx(priv);
        struct v4l2_format f_cap;
+       struct vb2_queue *dst_vq;
        int ret;
 
        ret = coda_try_fmt_vid_out(file, priv, f);
@@ -802,6 +803,19 @@ static int coda_s_fmt_vid_out(struct file *file, void *priv,
        ctx->ycbcr_enc = f->fmt.pix.ycbcr_enc;
        ctx->quantization = f->fmt.pix.quantization;
 
+       dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
+       if (!dst_vq)
+               return -EINVAL;
+
+       /*
+        * Setting the capture queue format is not possible while the capture
+        * queue is still busy. This is not an error, but the user will have to
+        * make sure themselves that the capture format is set correctly before
+        * starting the output queue again.
+        */
+       if (vb2_is_busy(dst_vq))
+               return 0;
+
        memset(&f_cap, 0, sizeof(f_cap));
        f_cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        coda_g_fmt(file, priv, &f_cap);