summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2014-08-05 11:45:55 +0200
committerSebastian Dröge <sebastian@centricular.com>2014-08-05 11:45:55 +0200
commit54c61efe449e8b10576f06668e452c036b783ea5 (patch)
tree050ecb96c1486084792d28b8b44d685c6dc30c52 /gst
parentcb293af93d5268dcfbd00c9f0a044969a9f354b4 (diff)
downloadgstreamer-plugins-bad-54c61efe449e8b10576f06668e452c036b783ea5.tar.gz
mpegtspacketizer: Store PCR time/byte offsets in 64 bit integers
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.
Diffstat (limited to 'gst')
-rw-r--r--gst/mpegtsdemux/mpegtspacketizer.c18
-rw-r--r--gst/mpegtsdemux/mpegtspacketizer.h4
2 files changed, 12 insertions, 10 deletions
diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c
index 60cb9a2fe..6663977ef 100644
--- a/gst/mpegtsdemux/mpegtspacketizer.c
+++ b/gst/mpegtsdemux/mpegtspacketizer.c
@@ -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);
diff --git a/gst/mpegtsdemux/mpegtspacketizer.h b/gst/mpegtsdemux/mpegtspacketizer.h
index 2c889b009..f107b80a0 100644
--- a/gst/mpegtsdemux/mpegtspacketizer.h
+++ b/gst/mpegtsdemux/mpegtspacketizer.h
@@ -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 */