OSDN Git Service

media: vb2: add vb2_find_timestamp()
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Wed, 24 Oct 2018 10:51:01 +0000 (06:51 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 7 Jan 2019 18:19:48 +0000 (13:19 -0500)
Use v4l2_timeval_to_ns instead of timeval_to_ns to ensure that
both kernelspace and userspace will use the same conversion
function.

Next add a new vb2_find_timestamp() function to find buffers
with a specific timestamp.

This function will only look at DEQUEUED and DONE buffers, i.e.
buffers that are already processed.

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

index 3a0ca2f..75ea90e 100644 (file)
@@ -143,7 +143,7 @@ static void __copy_timestamp(struct vb2_buffer *vb, const void *pb)
                 * and the timecode field and flag if needed.
                 */
                if (q->copy_timestamp)
-                       vb->timestamp = timeval_to_ns(&b->timestamp);
+                       vb->timestamp = v4l2_timeval_to_ns(&b->timestamp);
                vbuf->flags |= b->flags & V4L2_BUF_FLAG_TIMECODE;
                if (b->flags & V4L2_BUF_FLAG_TIMECODE)
                        vbuf->timecode = b->timecode;
@@ -589,6 +589,23 @@ static const struct vb2_buf_ops v4l2_buf_ops = {
        .copy_timestamp         = __copy_timestamp,
 };
 
+int vb2_find_timestamp(const struct vb2_queue *q, u64 timestamp,
+                      unsigned int start_idx)
+{
+       unsigned int i;
+
+       for (i = start_idx; i < q->num_buffers; i++) {
+               struct vb2_buffer *vb = q->bufs[i];
+
+               if ((vb->state == VB2_BUF_STATE_DEQUEUED ||
+                    vb->state == VB2_BUF_STATE_DONE) &&
+                   vb->timestamp == timestamp)
+                       return i;
+       }
+       return -1;
+}
+EXPORT_SYMBOL_GPL(vb2_find_timestamp);
+
 /*
  * vb2_querybuf() - query video buffer information
  * @q:         videobuf queue
index 7278554..a9961bc 100644 (file)
@@ -55,6 +55,23 @@ struct vb2_v4l2_buffer {
 #define to_vb2_v4l2_buffer(vb) \
        container_of(vb, struct vb2_v4l2_buffer, vb2_buf)
 
+/**
+ * vb2_find_timestamp() - Find buffer with given timestamp in the queue
+ *
+ * @q:         pointer to &struct vb2_queue with videobuf2 queue.
+ * @timestamp: the timestamp to find. Only buffers in state DEQUEUED or DONE
+ *             are considered.
+ * @start_idx: the start index (usually 0) in the buffer array to start
+ *             searching from. Note that there may be multiple buffers
+ *             with the same timestamp value, so you can restart the search
+ *             by setting @start_idx to the previously found index + 1.
+ *
+ * Returns the buffer index of the buffer with the given @timestamp, or
+ * -1 if no buffer with @timestamp was found.
+ */
+int vb2_find_timestamp(const struct vb2_queue *q, u64 timestamp,
+                      unsigned int start_idx);
+
 int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b);
 
 /**