ext/vorbis/vorbisdec.c: Use scale functions to avoid overflow when calculating durati...
authorMichael Smith <msmith@xiph.org>
Thu, 12 Apr 2007 12:57:33 +0000 (12:57 +0000)
committerMichael Smith <msmith@xiph.org>
Thu, 12 Apr 2007 12:57:33 +0000 (12:57 +0000)
Original commit message from CVS:
* ext/vorbis/vorbisdec.c: (vorbis_handle_data_packet):
Use scale functions to avoid overflow when calculating duration of
vorbis buffers.

ChangeLog
ext/vorbis/vorbisdec.c

index e203eb6..569faff 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-04-12  Michael Smith  <msmith@fluendo.com>
+
+       * ext/vorbis/vorbisdec.c: (vorbis_handle_data_packet):
+         Use scale functions to avoid overflow when calculating duration of 
+         vorbis buffers.
+
 2007-04-12  Tim-Philipp Müller  <tim at centricular dot net>
 
        * docs/libs/gst-plugins-base-libs-sections.txt:
index 58c3fd9..35a84f2 100644 (file)
@@ -947,7 +947,7 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet)
   guint sample_count;
   GstBuffer *out;
   GstFlowReturn result;
-  GstClockTime timestamp = -1;
+  GstClockTime timestamp = -1, nextts;
   gint size;
 
   if (!vd->initialized)
@@ -1026,11 +1026,13 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet)
       GST_BUFFER_OFFSET_END (out) = vd->granulepos + sample_count;
       timestamp =
           gst_util_uint64_scale_int (vd->granulepos, GST_SECOND, vd->vi.rate);
+      nextts =
+          gst_util_uint64_scale_int (vd->granulepos + sample_count,
+          GST_SECOND, vd->vi.rate);
       GST_DEBUG_OBJECT (vd, "corresponding timestamp %" GST_TIME_FORMAT,
           GST_TIME_ARGS (timestamp));
       /* calculate a nano-second accurate duration */
-      GST_BUFFER_DURATION (out) = GST_CLOCK_DIFF (timestamp,
-          (vd->granulepos + sample_count) * GST_SECOND / vd->vi.rate);
+      GST_BUFFER_DURATION (out) = GST_CLOCK_DIFF (timestamp, nextts);
       GST_DEBUG_OBJECT (vd, "set duration %" GST_TIME_FORMAT,
           GST_TIME_ARGS (GST_BUFFER_DURATION (out)));
     } else {