gst/mpegdemux/gstmpegdemux.c: Prevent a division by zero if last mux rate was zero.

Original commit message from CVS:
* gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_send_data),
(gst_flups_demux_parse_pack_start):
Prevent a division by zero if last mux rate was zero.
If we're going to send a NEWSEGMENT event but the segment start
and the current buffer timestamp differ by more than a second we
will start the NEWSEGMENT at the buffer timestamp.
This fixes playback of the tv2-1_25.mpg file, which has 0 as first SCR
but the first PTS are around 1 hour and 40 minutes.
Fixes bug #553755.
This commit is contained in:
Sebastian Dröge 2008-10-08 10:21:20 +00:00
parent a1b977dc8b
commit 453b704a09
2 changed files with 29 additions and 8 deletions

View file

@ -1,3 +1,18 @@
2008-10-08 Sebastian Dröge <sebastian.droege@collabora.co.uk>
* gst/mpegdemux/gstmpegdemux.c: (gst_flups_demux_send_data),
(gst_flups_demux_parse_pack_start):
Prevent a division by zero if last mux rate was zero.
If we're going to send a NEWSEGMENT event but the segment start
and the current buffer timestamp differ by more than a second we
will start the NEWSEGMENT at the buffer timestamp.
This fixes playback of the tv2-1_25.mpg file, which has 0 as first SCR
but the first PTS are around 1 hour and 40 minutes.
Fixes bug #553755.
2008-10-07 Jan Schmidt <jan.schmidt@sun.com>
* ext/resindvd/resindvdsrc.c:

View file

@ -442,12 +442,22 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream,
if (stream == NULL)
goto no_stream;
/* timestamps */
if (demux->next_pts != G_MAXUINT64)
timestamp = MPEGTIME_TO_GSTTIME (demux->next_pts);
else
timestamp = GST_CLOCK_TIME_NONE;
/* discont */
if (stream->need_segment) {
gint64 time, start, stop;
GstEvent *newsegment;
start = demux->base_time + demux->src_segment.start;
if (timestamp != GST_CLOCK_TIME_NONE &&
GST_CLOCK_DIFF (start, timestamp) > GST_SECOND)
start = timestamp;
if (demux->src_segment.stop != -1)
stop = demux->base_time + demux->src_segment.stop;
else
@ -481,12 +491,6 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream,
stream->need_segment = FALSE;
}
/* timestamps */
if (demux->next_pts != G_MAXUINT64)
timestamp = MPEGTIME_TO_GSTTIME (demux->next_pts);
else
timestamp = GST_CLOCK_TIME_NONE;
/* OK, sent new segment now prepare the buffer for sending */
/* caps */
gst_buffer_set_caps (buf, GST_PAD_CAPS (stream->pad));
@ -1123,7 +1127,7 @@ gst_flups_demux_parse_pack_start (GstFluPSDemux * demux)
/* adjustment of the SCR */
if (demux->current_scr != G_MAXUINT64) {
gint64 diff;
guint64 old_scr, old_mux_rate, bss, adjust;
guint64 old_scr, old_mux_rate, bss, adjust = 0;
/* keep SCR of the previous packet */
old_scr = demux->current_scr;
@ -1137,7 +1141,9 @@ gst_flups_demux_parse_pack_start (GstFluPSDemux * demux)
/* estimate the new SCR using the previous one according the notes
on point 2.5.2.2 of the ISO/IEC 13818-1 document */
adjust = (bss * CLOCK_FREQ) / old_mux_rate;
if (old_mux_rate != 0)
adjust = (bss * CLOCK_FREQ) / old_mux_rate;
if (demux->sink_segment.rate >= 0.0)
demux->next_scr = old_scr + adjust;
else