mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 05:06:17 +00:00
mpegdemux: clean up segment sending
... to use the src_segment as a basis for the sent segment, thereby properly conveying accumulated base_time etc. Also ensure src_segment is only adjusted once, so that all downstream segments are identical to avoid stream misalignment.
This commit is contained in:
parent
b8312df0a3
commit
44583eae90
2 changed files with 26 additions and 38 deletions
|
@ -335,6 +335,7 @@ gst_flups_demux_reset (GstFluPSDemux * demux)
|
||||||
demux->next_pts = G_MAXUINT64;
|
demux->next_pts = G_MAXUINT64;
|
||||||
demux->next_dts = G_MAXUINT64;
|
demux->next_dts = G_MAXUINT64;
|
||||||
demux->need_no_more_pads = TRUE;
|
demux->need_no_more_pads = TRUE;
|
||||||
|
demux->adjust_segment = TRUE;
|
||||||
gst_flups_demux_reset_psm (demux);
|
gst_flups_demux_reset_psm (demux);
|
||||||
gst_segment_init (&demux->sink_segment, GST_FORMAT_UNDEFINED);
|
gst_segment_init (&demux->sink_segment, GST_FORMAT_UNDEFINED);
|
||||||
gst_segment_init (&demux->src_segment, GST_FORMAT_TIME);
|
gst_segment_init (&demux->src_segment, GST_FORMAT_TIME);
|
||||||
|
@ -507,9 +508,7 @@ gst_flups_demux_send_segment (GstFluPSDemux * demux, GstFluPSStream * stream,
|
||||||
{
|
{
|
||||||
/* discont */
|
/* discont */
|
||||||
if (G_UNLIKELY (stream->need_segment)) {
|
if (G_UNLIKELY (stream->need_segment)) {
|
||||||
guint64 time, start, stop;
|
|
||||||
GstSegment segment;
|
GstSegment segment;
|
||||||
GstEvent *newsegment;
|
|
||||||
|
|
||||||
GST_DEBUG ("PTS timestamp:%" GST_TIME_FORMAT " base_time %" GST_TIME_FORMAT
|
GST_DEBUG ("PTS timestamp:%" GST_TIME_FORMAT " base_time %" GST_TIME_FORMAT
|
||||||
" src_segment.start:%" GST_TIME_FORMAT " .stop:%" GST_TIME_FORMAT,
|
" src_segment.start:%" GST_TIME_FORMAT " .stop:%" GST_TIME_FORMAT,
|
||||||
|
@ -517,48 +516,35 @@ gst_flups_demux_send_segment (GstFluPSDemux * demux, GstFluPSStream * stream,
|
||||||
GST_TIME_ARGS (demux->src_segment.start),
|
GST_TIME_ARGS (demux->src_segment.start),
|
||||||
GST_TIME_ARGS (demux->src_segment.stop));
|
GST_TIME_ARGS (demux->src_segment.stop));
|
||||||
|
|
||||||
if (GST_CLOCK_TIME_IS_VALID (demux->base_time) &&
|
/* adjust segment start if estimating a seek was off quite a bit,
|
||||||
GST_CLOCK_TIME_IS_VALID (demux->src_segment.start))
|
* make sure to do for all streams though to preserve a/v sync */
|
||||||
start = demux->base_time + demux->src_segment.start;
|
/* FIXME such adjustment tends to be frowned upon */
|
||||||
else
|
if (pts != GST_CLOCK_TIME_NONE && demux->adjust_segment) {
|
||||||
start = 0;
|
|
||||||
|
|
||||||
if (GST_CLOCK_TIME_IS_VALID (demux->src_segment.stop) &&
|
|
||||||
GST_CLOCK_TIME_IS_VALID (demux->base_time))
|
|
||||||
stop = demux->base_time + demux->src_segment.stop;
|
|
||||||
else
|
|
||||||
stop = -1;
|
|
||||||
|
|
||||||
if (pts != GST_CLOCK_TIME_NONE) {
|
|
||||||
if (demux->src_segment.rate > 0) {
|
if (demux->src_segment.rate > 0) {
|
||||||
if (GST_CLOCK_DIFF (start, pts) > GST_SECOND)
|
if (GST_CLOCK_DIFF (demux->src_segment.start, pts) > GST_SECOND)
|
||||||
start = pts;
|
demux->src_segment.start = pts - demux->base_time;
|
||||||
} else {
|
} else {
|
||||||
if (GST_CLOCK_DIFF (stop, pts) > GST_SECOND)
|
if (GST_CLOCK_DIFF (demux->src_segment.stop, pts) > GST_SECOND)
|
||||||
stop = pts;
|
demux->src_segment.stop = pts - demux->base_time;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (GST_CLOCK_TIME_IS_VALID (demux->base_time) && start > demux->base_time)
|
demux->adjust_segment = FALSE;
|
||||||
time = start - demux->base_time;
|
|
||||||
else
|
|
||||||
time = 0;
|
|
||||||
|
|
||||||
GST_INFO_OBJECT (demux, "sending new segment: rate %g applied_rate %g "
|
/* we should be in sync with downstream, so start from our segment notion,
|
||||||
"start: %" GST_TIME_FORMAT ", stop: %" GST_TIME_FORMAT
|
* which also includes proper base_time etc, tweak it a bit and send */
|
||||||
", time: %" GST_TIME_FORMAT " to pad %" GST_PTR_FORMAT,
|
gst_segment_copy_into (&demux->src_segment, &segment);
|
||||||
demux->sink_segment.rate, demux->sink_segment.applied_rate,
|
if (GST_CLOCK_TIME_IS_VALID (demux->base_time)) {
|
||||||
GST_TIME_ARGS (start), GST_TIME_ARGS (stop),
|
if (GST_CLOCK_TIME_IS_VALID (segment.start))
|
||||||
GST_TIME_ARGS (time), stream->pad);
|
segment.start += demux->base_time;
|
||||||
|
if (GST_CLOCK_TIME_IS_VALID (segment.stop))
|
||||||
|
segment.stop += demux->base_time;
|
||||||
|
segment.time = segment.start - demux->base_time;
|
||||||
|
}
|
||||||
|
|
||||||
gst_segment_init (&segment, GST_FORMAT_TIME);
|
GST_INFO_OBJECT (demux, "sending segment event %" GST_SEGMENT_FORMAT
|
||||||
segment.rate = demux->sink_segment.rate;
|
" to pad %" GST_PTR_FORMAT, &segment, stream->pad);
|
||||||
segment.applied_rate = demux->sink_segment.applied_rate;
|
|
||||||
segment.start = start;
|
|
||||||
segment.stop = stop;
|
|
||||||
segment.time = time;
|
|
||||||
newsegment = gst_event_new_segment (&segment);
|
|
||||||
|
|
||||||
gst_pad_push_event (stream->pad, newsegment);
|
gst_pad_push_event (stream->pad, gst_event_new_segment (&segment));
|
||||||
|
|
||||||
stream->need_segment = FALSE;
|
stream->need_segment = FALSE;
|
||||||
}
|
}
|
||||||
|
@ -652,13 +638,14 @@ gst_flups_demux_mark_discont (GstFluPSDemux * demux, gboolean discont,
|
||||||
if (G_LIKELY (stream)) {
|
if (G_LIKELY (stream)) {
|
||||||
stream->discont |= discont;
|
stream->discont |= discont;
|
||||||
stream->need_segment |= need_segment;
|
stream->need_segment |= need_segment;
|
||||||
|
demux->adjust_segment |= need_segment;
|
||||||
GST_DEBUG_OBJECT (demux, "marked stream as discont %d, need_segment %d",
|
GST_DEBUG_OBJECT (demux, "marked stream as discont %d, need_segment %d",
|
||||||
stream->discont, stream->need_segment);
|
stream->discont, stream->need_segment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static gboolean
|
||||||
gst_flups_demux_send_event (GstFluPSDemux * demux, GstEvent * event)
|
gst_flups_demux_send_event (GstFluPSDemux * demux, GstEvent * event)
|
||||||
{
|
{
|
||||||
gint i, count = demux->found_count;
|
gint i, count = demux->found_count;
|
||||||
|
|
|
@ -132,6 +132,7 @@ struct _GstFluPSDemux
|
||||||
|
|
||||||
GstSegment sink_segment;
|
GstSegment sink_segment;
|
||||||
GstSegment src_segment;
|
GstSegment src_segment;
|
||||||
|
gboolean adjust_segment;
|
||||||
|
|
||||||
/* stream output */
|
/* stream output */
|
||||||
GstFluPSStream *current_stream;
|
GstFluPSStream *current_stream;
|
||||||
|
|
Loading…
Reference in a new issue