v4l2: use v4l2 capture device sequence counter
authorPeter Seiderer <ps.report@gmx.net>
Fri, 14 Nov 2014 12:48:51 +0000 (13:48 +0100)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 2 Apr 2015 21:40:19 +0000 (17:40 -0400)
Use the v4l2 capture device sequence counter for
setting the GstBuffer offset/offset_end values.

https://bugzilla.gnome.org/show_bug.cgi?id=745441

sys/v4l2/gstv4l2bufferpool.c
sys/v4l2/gstv4l2src.c

index dec617b..7c963cc 100644 (file)
@@ -1247,6 +1247,8 @@ gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool * pool, GstBuffer ** buffer)
     GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_CORRUPTED);
 
   GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
+  GST_BUFFER_OFFSET (outbuf) = group->buffer.sequence;
+  GST_BUFFER_OFFSET_END (outbuf) = group->buffer.sequence + 1;
 
 done:
   *buffer = outbuf;
index 28a2d0f..e4b0687 100644 (file)
@@ -778,8 +778,13 @@ retry:
   }
 
   /* set buffer metadata */
-  GST_BUFFER_OFFSET (*buf) = v4l2src->offset++;
-  GST_BUFFER_OFFSET_END (*buf) = v4l2src->offset;
+
+  /* use generated offset values only if there are not already valid ones
+   * set by the v4l2 device */
+  if (!GST_BUFFER_OFFSET_IS_VALID (*buf) || !GST_BUFFER_OFFSET_END_IS_VALID (*buf)) {
+    GST_BUFFER_OFFSET (*buf) = v4l2src->offset++;
+    GST_BUFFER_OFFSET_END (*buf) = v4l2src->offset;
+  }
 
   if (G_LIKELY (abs_time != GST_CLOCK_TIME_NONE)) {
     /* the time now is the time of the clock minus the base time */