| From 1d55acac432983ad8301f5430c42ac549b4b4c6f Mon Sep 17 00:00:00 2001 |
| From: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Date: Fri, 11 Oct 2019 06:32:44 -0300 |
| Subject: [PATCH] media: v4l2-mem2mem: add new_frame detection |
| |
| 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 | 11 +++++++++-- |
| include/media/v4l2-mem2mem.h | 7 +++++++ |
| 2 files changed, 16 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/media/v4l2-core/v4l2-mem2mem.c |
| +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c |
| @@ -319,8 +319,10 @@ static void __v4l2_m2m_try_queue(struct |
| 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 |
| } |
| } |
| |
| + 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"); |
| --- a/include/media/v4l2-mem2mem.h |
| +++ b/include/media/v4l2-mem2mem.h |
| @@ -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; |
| |