[media] [FOR,v3.3] uvcvideo: Avoid division by 0 in timestamp calculation
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Sun, 15 Jan 2012 16:53:45 +0000 (13:53 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 27 Feb 2012 16:16:22 +0000 (13:16 -0300)
Use system timestamps if the timestamp can't be computed from the data
sent by the device.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/uvc/uvc_video.c

index c7e69b8f81c9555b5a1296b96355957b8e91089b..4a44f9a1bae00e0610f8c3d382cd5110d422f851 100644 (file)
@@ -611,9 +611,11 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
        delta_stc = buf->pts - (1UL << 31);
        x1 = first->dev_stc - delta_stc;
        x2 = last->dev_stc - delta_stc;
+       if (x1 == x2)
+               goto done;
+
        y1 = (first->dev_sof + 2048) << 16;
        y2 = (last->dev_sof + 2048) << 16;
-
        if (y2 < y1)
                y2 += 2048 << 16;
 
@@ -631,14 +633,16 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
                  x1, x2, y1, y2, clock->sof_offset);
 
        /* Second step, SOF to host clock conversion. */
-       ts = timespec_sub(last->host_ts, first->host_ts);
        x1 = (uvc_video_clock_host_sof(first) + 2048) << 16;
        x2 = (uvc_video_clock_host_sof(last) + 2048) << 16;
-       y1 = NSEC_PER_SEC;
-       y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec;
-
        if (x2 < x1)
                x2 += 2048 << 16;
+       if (x1 == x2)
+               goto done;
+
+       ts = timespec_sub(last->host_ts, first->host_ts);
+       y1 = NSEC_PER_SEC;
+       y2 = (ts.tv_sec + 1) * NSEC_PER_SEC + ts.tv_nsec;
 
        /* Interpolated and host SOF timestamps can wrap around at slightly
         * different times. Handle this by adding or removing 2048 to or from