Commit f07602ac authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

media: v4l2-mem2mem: add new_frame detection

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: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent bef41d93
...@@ -319,8 +319,10 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev, ...@@ -319,8 +319,10 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev,
goto job_unlock; goto job_unlock;
} }
if (src && dst && m2m_ctx->new_frame = true;
dst->is_held && dst->vb2_buf.copied_timestamp &&
if (src && dst && dst->is_held &&
dst->vb2_buf.copied_timestamp &&
dst->vb2_buf.timestamp != src->vb2_buf.timestamp) { dst->vb2_buf.timestamp != src->vb2_buf.timestamp) {
dst->is_held = false; dst->is_held = false;
v4l2_m2m_dst_buf_remove(m2m_ctx); v4l2_m2m_dst_buf_remove(m2m_ctx);
...@@ -333,6 +335,11 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev, ...@@ -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 if (m2m_dev->m2m_ops->job_ready
&& (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) { && (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) {
dprintk("Driver not ready\n"); dprintk("Driver not ready\n");
......
...@@ -75,6 +75,11 @@ struct v4l2_m2m_queue_ctx { ...@@ -75,6 +75,11 @@ struct v4l2_m2m_queue_ctx {
* struct v4l2_m2m_ctx - Memory to memory context structure * struct v4l2_m2m_ctx - Memory to memory context structure
* *
* @q_lock: struct &mutex lock * @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 * @m2m_dev: opaque pointer to the internal data to handle M2M context
* @cap_q_ctx: Capture (output to memory) queue context * @cap_q_ctx: Capture (output to memory) queue context
* @out_q_ctx: Output (input from memory) queue context * @out_q_ctx: Output (input from memory) queue context
...@@ -91,6 +96,8 @@ struct v4l2_m2m_ctx { ...@@ -91,6 +96,8 @@ struct v4l2_m2m_ctx {
/* optional cap/out vb2 queues lock */ /* optional cap/out vb2 queues lock */
struct mutex *q_lock; struct mutex *q_lock;
bool new_frame;
/* internal use only */ /* internal use only */
struct v4l2_m2m_dev *m2m_dev; struct v4l2_m2m_dev *m2m_dev;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment