v4l2: precalculate duration
authorStefan Kost <ensonic@users.sf.net>
Tue, 22 Jun 2010 12:46:51 +0000 (15:46 +0300)
committerStefan Kost <ensonic@users.sf.net>
Tue, 22 Jun 2010 12:46:51 +0000 (15:46 +0300)
Have frame duration in the instance struct and calculate it after changing the caps.

sys/v4l2/gstv4l2src.c
sys/v4l2/gstv4l2src.h
sys/v4l2/v4l2src_calls.c

index 6b2b451affc16a59586e388cfe663b6aea3bc8a0..7f2139a08ea3f138c9de11ccbc428506f953b66b 100644 (file)
@@ -913,7 +913,6 @@ gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf)
   if (G_LIKELY (ret == GST_FLOW_OK && *buf)) {
     GstClock *clock;
     GstClockTime timestamp;
-    GstClockTime duration = GST_CLOCK_TIME_NONE;
 
     GST_BUFFER_OFFSET (*buf) = v4l2src->offset++;
     GST_BUFFER_OFFSET_END (*buf) = v4l2src->offset;
@@ -930,30 +929,23 @@ gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf)
     }
     GST_OBJECT_UNLOCK (v4l2src);
 
-    if (clock) {
+    if (G_LIKELY (clock)) {
       /* the time now is the time of the clock minus the base time */
       timestamp = gst_clock_get_time (clock) - timestamp;
       gst_object_unref (clock);
 
       /* if we have a framerate adjust timestamp for frame latency */
-      if (v4l2src->fps_n > 0 && v4l2src->fps_d > 0) {
-        GstClockTime latency;
-
-        latency = gst_util_uint64_scale_int (GST_SECOND, v4l2src->fps_d,
-            v4l2src->fps_n);
-
-        if (timestamp > latency)
-          timestamp -= latency;
+      if (GST_CLOCK_TIME_IS_VALID (v4l2src->duration)) {
+        if (timestamp > v4l2src->duration)
+          timestamp -= v4l2src->duration;
         else
           timestamp = 0;
-
-        duration = latency;
       }
     }
 
     /* FIXME: use the timestamp from the buffer itself! */
     GST_BUFFER_TIMESTAMP (*buf) = timestamp;
-    GST_BUFFER_DURATION (*buf) = duration;
+    GST_BUFFER_DURATION (*buf) = v4l2src->duration;
   }
   return ret;
 }
index 68f45d97d69e4afc379bda2244216a75e17eb299..13a3942da00589b04c70b1e39cf3ac377813ea81 100644 (file)
@@ -80,6 +80,7 @@ struct _GstV4l2Src
   guint64 offset;
 
   gint     fps_d, fps_n;       /* framerate if device is open */
+  GstClockTime duration;       /* duration of one frame */
   
   GstV4l2SrcGetFunc get_frame;
 };
index 9a2ff5de43420ce87fd7d22f3d10ee2387f7c933..ebdb0b339188bcb1b8f96845b6f7056fd603987b 100644 (file)
@@ -272,7 +272,18 @@ gst_v4l2src_set_capture (GstV4l2Src * v4l2src, guint32 pixelformat,
 
   v4l2src->fps_n = fps_n;
   v4l2src->fps_d = fps_d;
-  GST_INFO_OBJECT (v4l2src, "Set framerate to %u/%u", fps_n, fps_d);
+
+  /* if we have a framerate pre-calculate duration */
+  if (fps_n > 0 && fps_d > 0) {
+    v4l2src->duration = gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n);
+  } else {
+    v4l2src->duration = GST_CLOCK_TIME_NONE;
+  }
+
+  GST_INFO_OBJECT (v4l2src,
+      "Set framerate to %u/%u and duration to %" GST_TIME_FORMAT, fps_n, fps_d,
+      GST_TIME_ARGS (v4l2src->duration));
+
 
 done: