media: v4l2-mem2mem: add new_frame detection
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Fri, 11 Oct 2019 09:32:44 +0000 (06:32 -0300)
committerpopcornmix <popcornmix@gmail.com>
Wed, 1 Jul 2020 15:33:30 +0000 (16:33 +0100)
Commit f07602ac388723233e9e3c5a05b54baf34e0a3e9 upstream.

Drivers that support VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF
typically want to know if a new frame is started (i.e. the first
slice is about to be processed). Add a new_frame bool to v4l2_m2m_ctx
and set it accordingly.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/v4l2-core/v4l2-mem2mem.c
include/media/v4l2-mem2mem.h

index 9f8b816..5867d81 100644 (file)
@@ -319,8 +319,10 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev,
                goto job_unlock;
        }
 
-       if (src && dst &&
-           dst->is_held && dst->vb2_buf.copied_timestamp &&
+       m2m_ctx->new_frame = true;
+
+       if (src && dst && dst->is_held &&
+           dst->vb2_buf.copied_timestamp &&
            dst->vb2_buf.timestamp != src->vb2_buf.timestamp) {
                dst->is_held = false;
                v4l2_m2m_dst_buf_remove(m2m_ctx);
@@ -333,6 +335,11 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev,
                }
        }
 
+       if (src && dst && (m2m_ctx->cap_q_ctx.q.subsystem_flags &
+                          VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF))
+               m2m_ctx->new_frame = !dst->vb2_buf.copied_timestamp ||
+                       dst->vb2_buf.timestamp != src->vb2_buf.timestamp;
+
        if (m2m_dev->m2m_ops->job_ready
                && (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) {
                dprintk("Driver not ready\n");
index 3d9e48e..1d85e24 100644 (file)
@@ -75,6 +75,11 @@ struct v4l2_m2m_queue_ctx {
  * struct v4l2_m2m_ctx - Memory to memory context structure
  *
  * @q_lock: struct &mutex lock
+ * @new_frame: valid in the device_run callback: if true, then this
+ *             starts a new frame; if false, then this is a new slice
+ *             for an existing frame. This is always true unless
+ *             V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF is set, which
+ *             indicates slicing support.
  * @m2m_dev: opaque pointer to the internal data to handle M2M context
  * @cap_q_ctx: Capture (output to memory) queue context
  * @out_q_ctx: Output (input from memory) queue context
@@ -91,6 +96,8 @@ struct v4l2_m2m_ctx {
        /* optional cap/out vb2 queues lock */
        struct mutex                    *q_lock;
 
+       bool                            new_frame;
+
        /* internal use only */
        struct v4l2_m2m_dev             *m2m_dev;