xingmux: Properly calculate the number of frames
authorGautier Portet <kassoulet@gmail.com>
Fri, 9 Nov 2012 10:33:40 +0000 (11:33 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 9 Nov 2012 10:33:40 +0000 (11:33 +0100)
First, the xing header frame is never added to the count,
we have to increment the count.
Secondly, there is a rounding error when calculating the
frame duration, as spf*GST_SECOND/rate is not an integer
(26122448.9) an it must be 26122449.

gst/xingmux/gstxingmux.c

index 5ace7b017c819225d6b5e5a79e3078786be48ae2..dacd1ec3be5253c7e902777f58f2cb8ba785e802 100644 (file)
@@ -318,6 +318,7 @@ generate_xing_header (GstXingMux * xing)
      * SamplesPerFrame and SamplingRate are values for the current frame. 
      */
     number_of_frames = gst_util_uint64_scale (duration, rate, GST_SECOND) / spf;
+    number_of_frames += 1;      /* Xing Header Frame */
     GST_DEBUG ("Setting number of frames to %u", number_of_frames);
     number_of_frames = GUINT32_TO_BE (number_of_frames);
     memcpy (data, &number_of_frames, 4);
@@ -555,7 +556,7 @@ gst_xing_mux_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
     seek_entry->byte = (seek_entry->timestamp == 0) ? 0 : xing->byte_count;
     xing->seek_table = g_list_append (xing->seek_table, seek_entry);
 
-    duration = gst_util_uint64_scale (spf, GST_SECOND, rate);
+    duration = gst_util_uint64_scale_ceil (spf, GST_SECOND, rate);
 
     GST_BUFFER_TIMESTAMP (outbuf) =
         (xing->duration == GST_CLOCK_TIME_NONE) ? 0 : xing->duration;