media: coda: allow flagging last output buffer internally
authorPhilipp Zabel <p.zabel@pengutronix.de>
Tue, 18 Jun 2019 16:45:23 +0000 (12:45 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 24 Jun 2019 18:35:44 +0000 (14:35 -0400)
Since V4L2_BUF_FLAG_LAST is a CAPTURE only flag, clear it from OUTPUT
buffers in QBUF and DQBUF. This allows to use the flag internally to
signal the last buffer to decode after a decoder stop command was
issued.

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

index 0f5e6dc..935e8c4 100644 (file)
@@ -879,9 +879,27 @@ static int coda_qbuf(struct file *file, void *priv,
 {
        struct coda_ctx *ctx = fh_to_ctx(priv);
 
+       if (ctx->inst_type == CODA_INST_DECODER &&
+           buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
+               buf->flags &= ~V4L2_BUF_FLAG_LAST;
+
        return v4l2_m2m_qbuf(file, ctx->fh.m2m_ctx, buf);
 }
 
+static int coda_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
+{
+       struct coda_ctx *ctx = fh_to_ctx(priv);
+       int ret;
+
+       ret = v4l2_m2m_dqbuf(file, ctx->fh.m2m_ctx, buf);
+
+       if (ctx->inst_type == CODA_INST_DECODER &&
+           buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
+               buf->flags &= ~V4L2_BUF_FLAG_LAST;
+
+       return ret;
+}
+
 static bool coda_buf_is_end_of_stream(struct coda_ctx *ctx,
                                      struct vb2_v4l2_buffer *buf)
 {
@@ -1295,7 +1313,7 @@ static const struct v4l2_ioctl_ops coda_ioctl_ops = {
 
        .vidioc_qbuf            = coda_qbuf,
        .vidioc_expbuf          = v4l2_m2m_ioctl_expbuf,
-       .vidioc_dqbuf           = v4l2_m2m_ioctl_dqbuf,
+       .vidioc_dqbuf           = coda_dqbuf,
        .vidioc_create_bufs     = v4l2_m2m_ioctl_create_bufs,
        .vidioc_prepare_buf     = v4l2_m2m_ioctl_prepare_buf,