streamsynchronizer: Don't override segment.base from upstream with 0

Upstream might want to use it to properly map timestamps to running/stream
times, if we just override it with 0 synchronization will be just wrong.

For this we remove some old 0.10 code related to segment accumulation, and
remove some more code that is useless now, and accumulate the group start time
(aka segment.base offset) manually now.

https://bugzilla.gnome.org/show_bug.cgi?id=635701
This commit is contained in:
Sebastian Dröge 2015-05-05 15:35:46 +02:00
parent 1a2c590cd2
commit a73631a29d

View file

@ -65,7 +65,6 @@ typedef struct
GstSegment segment;
gboolean wait; /* TRUE if waiting/blocking */
gboolean new_stream;
gboolean is_eos; /* TRUE if EOS was received */
gboolean eos_sent; /* when EOS was sent downstream */
gboolean flushing; /* set after flush-start and before flush-stop */
@ -325,7 +324,6 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
"Stream %d belongs to running stream %d, no waiting",
stream->stream_number, ostream->stream_number);
stream->wait = FALSE;
stream->new_stream = FALSE;
GST_STREAM_SYNCHRONIZER_UNLOCK (self);
break;
@ -340,7 +338,6 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
GST_DEBUG_OBJECT (pad, "Stream %d changed", stream->stream_number);
stream->wait = TRUE;
stream->new_stream = TRUE;
for (l = self->streams; l; l = l->next) {
GstStream *ostream = l->data;
@ -377,13 +374,19 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
position_running_time =
gst_segment_to_running_time (&ostream->segment,
GST_FORMAT_TIME, ostream->segment.position);
position =
MAX (position, MAX (stop_running_time,
position_running_time));
position_running_time =
MAX (position_running_time, stop_running_time);
position_running_time -=
gst_segment_to_running_time (&ostream->segment,
GST_FORMAT_TIME, ostream->segment.start);
position_running_time = MAX (0, position_running_time);
position = MAX (position, position_running_time);
}
}
position = MAX (0, position);
self->group_start_time = MAX (self->group_start_time, position);
self->group_start_time += position;
GST_DEBUG_OBJECT (self, "New group start time: %" GST_TIME_FORMAT,
GST_TIME_ARGS (self->group_start_time));
@ -417,10 +420,11 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
stream = gst_pad_get_element_private (pad);
if (stream && segment.format == GST_FORMAT_TIME) {
if (stream->new_stream) {
stream->new_stream = FALSE;
segment.base = self->group_start_time;
}
GST_DEBUG_OBJECT (pad,
"New stream, updating base from %" GST_TIME_FORMAT " to %"
GST_TIME_FORMAT, GST_TIME_ARGS (segment.base),
GST_TIME_ARGS (segment.base + self->group_start_time));
segment.base += self->group_start_time;
GST_DEBUG_OBJECT (pad, "Segment was: %" GST_SEGMENT_FORMAT,
&stream->segment);
@ -475,7 +479,6 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstObject * parent,
stream->eos_sent = FALSE;
stream->flushing = FALSE;
stream->wait = FALSE;
stream->new_stream = FALSE;
g_cond_broadcast (&stream->stream_finish_cond);
}
GST_STREAM_SYNCHRONIZER_UNLOCK (self);
@ -809,28 +812,6 @@ gst_stream_synchronizer_release_stream (GstStreamSynchronizer * self,
gst_pad_set_active (stream->sinkpad, FALSE);
gst_element_remove_pad (GST_ELEMENT_CAST (self), stream->sinkpad);
if (stream->segment.format == GST_FORMAT_TIME) {
gint64 stop_running_time;
gint64 position_running_time;
stop_running_time =
gst_segment_to_running_time (&stream->segment, GST_FORMAT_TIME,
stream->segment.stop);
position_running_time =
gst_segment_to_running_time (&stream->segment, GST_FORMAT_TIME,
stream->segment.position);
stop_running_time = MAX (stop_running_time, position_running_time);
if (stop_running_time > self->group_start_time) {
GST_DEBUG_OBJECT (stream->sinkpad,
"Updating global start running time from %" GST_TIME_FORMAT " to %"
GST_TIME_FORMAT, GST_TIME_ARGS (self->group_start_time),
GST_TIME_ARGS (stop_running_time));
self->group_start_time = stop_running_time;
}
}
g_cond_clear (&stream->stream_finish_cond);
g_slice_free (GstStream, stream);
@ -943,7 +924,6 @@ gst_stream_synchronizer_change_state (GstElement * element,
gst_segment_init (&stream->segment, GST_FORMAT_UNDEFINED);
stream->gap_duration = GST_CLOCK_TIME_NONE;
stream->wait = FALSE;
stream->new_stream = FALSE;
stream->is_eos = FALSE;
stream->eos_sent = FALSE;
stream->flushing = FALSE;