mpegtspacketizer: Store PCR time/byte offsets in 64 bit integers
authorSebastian Dröge <sebastian@centricular.com>
Tue, 5 Aug 2014 09:45:55 +0000 (11:45 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 5 Aug 2014 09:45:55 +0000 (11:45 +0200)
32 bit integers are going to overflow, especially the PCR offset to
the first PCR will overflow after about 159 seconds. This makes playback
of streams stop at 159 seconds as suddenly the timestamps are starting
again from 0. Now we have a few more years time until it happens again
and 64 bits are too small.

gst/mpegtsdemux/mpegtspacketizer.c
gst/mpegtsdemux/mpegtspacketizer.h

index 60cb9a2fe1963a38e8cb65ba49f43e4e5f94d777..6663977efa9a5275e7800f7b4afbb2e2579d05bc 100644 (file)
@@ -1578,8 +1578,9 @@ _reevaluate_group_pcr_offset (MpegTSPCR * pcrtable, PCROffsetGroup * group)
             gst_util_uint64_scale (PCR_SECOND,
             current->pending[current->last].offset,
             current->pending[current->last].pcr);
-        GST_DEBUG ("Previous group bitrate (%u / %" GST_TIME_FORMAT ") : %"
-            G_GUINT64_FORMAT, current->pending[current->last].offset,
+        GST_DEBUG ("Previous group bitrate (%" G_GUINT64_FORMAT " / %"
+            GST_TIME_FORMAT ") : %" G_GUINT64_FORMAT,
+            current->pending[current->last].offset,
             GST_TIME_ARGS (PCRTIME_TO_GSTTIME (current->pending[current->
                         last].pcr)), prevbr);
       } else if (prev->values[prev->last_value].offset) {
@@ -1590,8 +1591,9 @@ _reevaluate_group_pcr_offset (MpegTSPCR * pcrtable, PCROffsetGroup * group)
             gst_util_uint64_scale (PCR_SECOND,
             prev->values[prev->last_value].offset,
             prev->values[prev->last_value].pcr);
-        GST_DEBUG ("Previous group bitrate (%u / %" GST_TIME_FORMAT ") : %"
-            G_GUINT64_FORMAT, prev->values[prev->last_value].offset,
+        GST_DEBUG ("Previous group bitrate (%" G_GUINT64_FORMAT " / %"
+            GST_TIME_FORMAT ") : %" G_GUINT64_FORMAT,
+            prev->values[prev->last_value].offset,
             GST_TIME_ARGS (PCRTIME_TO_GSTTIME (prev->values[prev->
                         last_value].pcr)), prevbr);
       } else {
@@ -1838,7 +1840,7 @@ _append_group_values (PCROffsetGroup * group, PCROffset pcroffset)
       GST_TIME_ARGS (PCRTIME_TO_GSTTIME (group->first_pcr)),
       group->first_offset,
       GST_TIME_ARGS (PCRTIME_TO_GSTTIME (group->pcr_offset)));
-  GST_DEBUG ("Last PCR: +%" GST_TIME_FORMAT " offset: +%u",
+  GST_DEBUG ("Last PCR: +%" GST_TIME_FORMAT " offset: +%" G_GUINT64_FORMAT,
       GST_TIME_ARGS (PCRTIME_TO_GSTTIME (pcroffset.pcr)), pcroffset.offset);
 }
 
@@ -1900,7 +1902,7 @@ record_pcr (MpegTSPacketizer2 * packetizer, MpegTSPCR * pcrtable,
           GST_TIME_ARGS (PCRTIME_TO_GSTTIME (group->first_pcr)),
           group->first_offset,
           GST_TIME_ARGS (PCRTIME_TO_GSTTIME (group->pcr_offset)));
-      GST_DEBUG ("Last PCR: +%" GST_TIME_FORMAT " offset: +%u",
+      GST_DEBUG ("Last PCR: +%" GST_TIME_FORMAT " offset: +%" G_GUINT64_FORMAT,
           GST_TIME_ARGS (PCRTIME_TO_GSTTIME (group->values[group->
                       last_value].pcr)),
           group->values[group->last_value].offset);
@@ -1940,7 +1942,7 @@ record_pcr (MpegTSPacketizer2 * packetizer, MpegTSPCR * pcrtable,
   GST_DEBUG ("First PCR:%" GST_TIME_FORMAT " offset:%" G_GUINT64_FORMAT,
       GST_TIME_ARGS (PCRTIME_TO_GSTTIME (current->first_pcr)),
       current->first_offset);
-  GST_DEBUG ("Last PCR: +%" GST_TIME_FORMAT " offset: +%u",
+  GST_DEBUG ("Last PCR: +%" GST_TIME_FORMAT " offset: +%" G_GUINT64_FORMAT,
       GST_TIME_ARGS (PCRTIME_TO_GSTTIME (current->pending[current->last].pcr)),
       current->pending[current->last].offset);
   GST_DEBUG ("To add (corrected) PCR:%" GST_TIME_FORMAT " offset:%"
@@ -1991,7 +1993,7 @@ record_pcr (MpegTSPacketizer2 * packetizer, MpegTSPCR * pcrtable,
   GST_DEBUG ("First PCR:%" GST_TIME_FORMAT " offset:%" G_GUINT64_FORMAT,
       GST_TIME_ARGS (PCRTIME_TO_GSTTIME (current->first_pcr)),
       current->first_offset);
-  GST_DEBUG ("Last PCR: +%" GST_TIME_FORMAT " offset: +%u",
+  GST_DEBUG ("Last PCR: +%" GST_TIME_FORMAT " offset: +%" G_GUINT64_FORMAT,
       GST_TIME_ARGS (PCRTIME_TO_GSTTIME (current->pending[current->last].pcr)),
       current->pending[current->last].offset);
 
index 2c889b009955bb49fd65a3f931202cd2379c4c81..f107b80a0a68529cccd57122959fa55c5207c037 100644 (file)
@@ -99,10 +99,10 @@ typedef struct
 typedef struct _PCROffset
 {
   /* PCR value (units: 1/27MHz) */
-  guint32 pcr;
+  guint64 pcr;
 
   /* The offset (units: bytes) */
-  guint32 offset;
+  guint64 offset;
 } PCROffset;
 
 /* Flags used on groups */