bcm2708: boot tested on RPi B+ v1.2 bcm2709: boot tested on RPi 3B v1.2 and RPi 4B v1.1 4G bcm2710: boot tested on RPi 3B v1.2 bcm2711: boot tested on RPi 4B v1.1 4G Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
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;
 | 
						|
 
 |