mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +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>
|
2008-10-07 Jan Schmidt <jan.schmidt@sun.com>
|
||||||
|
|
||||||
* ext/resindvd/resindvdsrc.c:
|
* ext/resindvd/resindvdsrc.c:
|
||||||
|
|
|
@ -442,12 +442,22 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream,
|
||||||
if (stream == NULL)
|
if (stream == NULL)
|
||||||
goto no_stream;
|
goto no_stream;
|
||||||
|
|
||||||
|
/* timestamps */
|
||||||
|
if (demux->next_pts != G_MAXUINT64)
|
||||||
|
timestamp = MPEGTIME_TO_GSTTIME (demux->next_pts);
|
||||||
|
else
|
||||||
|
timestamp = GST_CLOCK_TIME_NONE;
|
||||||
|
|
||||||
/* discont */
|
/* discont */
|
||||||
if (stream->need_segment) {
|
if (stream->need_segment) {
|
||||||
gint64 time, start, stop;
|
gint64 time, start, stop;
|
||||||
GstEvent *newsegment;
|
GstEvent *newsegment;
|
||||||
|
|
||||||
start = demux->base_time + demux->src_segment.start;
|
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)
|
if (demux->src_segment.stop != -1)
|
||||||
stop = demux->base_time + demux->src_segment.stop;
|
stop = demux->base_time + demux->src_segment.stop;
|
||||||
else
|
else
|
||||||
|
@ -481,12 +491,6 @@ gst_flups_demux_send_data (GstFluPSDemux * demux, GstFluPSStream * stream,
|
||||||
stream->need_segment = FALSE;
|
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 */
|
/* OK, sent new segment now prepare the buffer for sending */
|
||||||
/* caps */
|
/* caps */
|
||||||
gst_buffer_set_caps (buf, GST_PAD_CAPS (stream->pad));
|
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 */
|
/* adjustment of the SCR */
|
||||||
if (demux->current_scr != G_MAXUINT64) {
|
if (demux->current_scr != G_MAXUINT64) {
|
||||||
gint64 diff;
|
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 */
|
/* keep SCR of the previous packet */
|
||||||
old_scr = demux->current_scr;
|
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
|
/* estimate the new SCR using the previous one according the notes
|
||||||
on point 2.5.2.2 of the ISO/IEC 13818-1 document */
|
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)
|
if (demux->sink_segment.rate >= 0.0)
|
||||||
demux->next_scr = old_scr + adjust;
|
demux->next_scr = old_scr + adjust;
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue