mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 16:51:10 +00:00
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:
parent
a1b977dc8b
commit
453b704a09
2 changed files with 29 additions and 8 deletions
15
ChangeLog
15
ChangeLog
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue