mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 00:01:23 +00:00
mpegtsmux: Don't disrupt buffer state in the clip function
Collectpads assumes that it can pass any buffer to the clip function for adjustment, some of which are artificially injected - so don't adjust global timestamp tracking there. Instead, only adjust the buffer timestamps and use them directly in the collection function. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=698748
This commit is contained in:
parent
3149dbb44b
commit
14a56b6964
2 changed files with 14 additions and 22 deletions
|
@ -321,8 +321,7 @@ static void
|
|||
mpegtsmux_pad_reset (MpegTsPadData * pad_data)
|
||||
{
|
||||
pad_data->pid = 0;
|
||||
pad_data->last_pts = GST_CLOCK_TIME_NONE;
|
||||
pad_data->last_dts = GST_CLOCK_TIME_NONE;
|
||||
pad_data->min_dts = GST_CLOCK_TIME_NONE;
|
||||
pad_data->prog_id = -1;
|
||||
#if 0
|
||||
pad_data->prog_id = -1;
|
||||
|
@ -1020,7 +1019,6 @@ mpegtsmux_clip_inc_running_time (GstCollectPads * pads,
|
|||
GST_LOG_OBJECT (cdata->pad, "buffer pts %" GST_TIME_FORMAT " -> %"
|
||||
GST_TIME_FORMAT " running time",
|
||||
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (time));
|
||||
pad_data->last_pts = time;
|
||||
buf = *outbuf = gst_buffer_make_writable (buf);
|
||||
GST_BUFFER_TIMESTAMP (*outbuf) = time;
|
||||
}
|
||||
|
@ -1039,14 +1037,11 @@ mpegtsmux_clip_inc_running_time (GstCollectPads * pads,
|
|||
GST_LOG_OBJECT (cdata->pad, "buffer dts %" GST_TIME_FORMAT " -> %"
|
||||
GST_TIME_FORMAT " running time",
|
||||
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (time));
|
||||
if (GST_CLOCK_TIME_IS_VALID (pad_data->last_dts) &&
|
||||
time < pad_data->last_dts) {
|
||||
/* FIXME DTS/PTS mess again;
|
||||
* probably needs a whole lot more subtle handling (cf qtmux) */
|
||||
if (GST_CLOCK_TIME_IS_VALID (pad_data->min_dts) &&
|
||||
time < pad_data->min_dts) {
|
||||
/* Ignore DTS going backward */
|
||||
GST_WARNING_OBJECT (cdata->pad, "ignoring DTS going backward");
|
||||
time = pad_data->last_dts;
|
||||
} else {
|
||||
pad_data->last_dts = time;
|
||||
time = pad_data->min_dts;
|
||||
}
|
||||
buf = *outbuf = gst_buffer_make_writable (buf);
|
||||
GST_BUFFER_DTS (*outbuf) = time;
|
||||
|
@ -1154,18 +1149,16 @@ mpegtsmux_collected_buffer (GstCollectPads * pads, GstCollectData * data,
|
|||
GST_DEBUG_OBJECT (COLLECT_DATA_PAD (best),
|
||||
"Chose stream for output (PID: 0x%04x)", best->pid);
|
||||
|
||||
if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_PTS (buf)) &&
|
||||
GST_CLOCK_TIME_IS_VALID (best->last_pts)) {
|
||||
pts = GSTTIME_TO_MPEGTIME (best->last_pts);
|
||||
if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_PTS (buf))) {
|
||||
pts = GSTTIME_TO_MPEGTIME (GST_BUFFER_PTS (buf));
|
||||
GST_DEBUG_OBJECT (mux, "Buffer has PTS %" GST_TIME_FORMAT " pts %"
|
||||
G_GINT64_FORMAT, GST_TIME_ARGS (best->last_pts), pts);
|
||||
G_GINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_PTS (buf)), pts);
|
||||
}
|
||||
|
||||
if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS (buf)) &&
|
||||
GST_CLOCK_TIME_IS_VALID (best->last_dts)) {
|
||||
dts = GSTTIME_TO_MPEGTIME (best->last_dts);
|
||||
if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS (buf))) {
|
||||
dts = GSTTIME_TO_MPEGTIME (GST_BUFFER_DTS (buf));
|
||||
GST_DEBUG_OBJECT (mux, "Buffer has DTS %" GST_TIME_FORMAT " dts %"
|
||||
G_GINT64_FORMAT, GST_TIME_ARGS (best->last_dts), dts);
|
||||
G_GINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_DTS (buf)), dts);
|
||||
}
|
||||
|
||||
/* should not have a DTS without PTS */
|
||||
|
@ -1197,8 +1190,8 @@ mpegtsmux_collected_buffer (GstCollectPads * pads, GstCollectData * data,
|
|||
if (prog->pcr_stream == best->stream) {
|
||||
/* prefer DTS if present for PCR as it should be monotone */
|
||||
mux->last_ts =
|
||||
GST_CLOCK_TIME_IS_VALID (best->last_dts) ? best->last_dts : best->
|
||||
last_pts;
|
||||
GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS (buf)) ?
|
||||
GST_BUFFER_DTS (buf) : GST_BUFFER_PTS (buf);
|
||||
}
|
||||
|
||||
mux->is_delta = delta;
|
||||
|
|
|
@ -185,8 +185,7 @@ struct MpegTsPadData {
|
|||
TsMuxStream *stream;
|
||||
|
||||
/* most recent valid TS for this stream */
|
||||
GstClockTime last_pts;
|
||||
GstClockTime last_dts;
|
||||
GstClockTime min_dts;
|
||||
|
||||
#if 0
|
||||
/* (optional) index writing */
|
||||
|
|
Loading…
Reference in a new issue