diff -up gst-plugins-good-0.10.15/sys/v4l2/gstv4l2src.c.foo gst-plugins-good-0.10.15/sys/v4l2/gstv4l2src.c
--- gst-plugins-good-0.10.15/sys/v4l2/gstv4l2src.c.foo	2009-05-12 02:00:07.000000000 +0200
+++ gst-plugins-good-0.10.15/sys/v4l2/gstv4l2src.c	2009-08-11 16:13:20.000000000 +0200
@@ -1371,20 +1371,21 @@ gst_v4l2src_create (GstPushSrc * src, Gs
     GST_OBJECT_UNLOCK (v4l2src);
 
     if (clock) {
-      GstClockTime latency;
-
       /* the time now is the time of the clock minus the base time */
       timestamp = gst_clock_get_time (clock) - timestamp;
       gst_object_unref (clock);
 
-      latency =
-          gst_util_uint64_scale_int (GST_SECOND, v4l2src->fps_d,
-          v4l2src->fps_n);
+      /* if we have a framerate adjust timestamp for frame latency */
+      if (v4l2src->fps_n > 0 && v4l2src->fps_d > 0) {
+        GstClockTime latency =
+           gst_util_uint64_scale_int (GST_SECOND, v4l2src->fps_d,
+           v4l2src->fps_n);
 
-      if (timestamp > latency)
-        timestamp -= latency;
-      else
-        timestamp = 0;
+        if (timestamp > latency)
+          timestamp -= latency;
+        else
+          timestamp = 0;
+      }
     }
 
     /* FIXME: use the timestamp from the buffer itself! */
