streamsynchronizer: Drop DISCONT flag on first buffer for new streams

Also reset stream state when going back to READY and on flush-stop.
This commit is contained in:
Sebastian Dröge 2010-07-16 18:25:38 +02:00
parent 405b47a79a
commit 1605bef4b9

View file

@ -65,6 +65,7 @@ typedef struct
gboolean wait; gboolean wait;
gboolean new_stream; gboolean new_stream;
gboolean drop_discont;
gint64 running_time_diff; gint64 running_time_diff;
} GstStream; } GstStream;
@ -389,6 +390,7 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstEvent * event)
GST_TIME_ARGS (stop_running_time)); GST_TIME_ARGS (stop_running_time));
} }
stream->new_stream = FALSE; stream->new_stream = FALSE;
stream->drop_discont = TRUE;
if (stop_running_time < self->group_start_time) { if (stop_running_time < self->group_start_time) {
gint64 diff = self->group_start_time - stop_running_time; gint64 diff = self->group_start_time - stop_running_time;
@ -430,6 +432,10 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstEvent * event)
GST_DEBUG_OBJECT (pad, "Resetting segment for stream %d", GST_DEBUG_OBJECT (pad, "Resetting segment for stream %d",
stream->stream_number); stream->stream_number);
gst_segment_init (&stream->segment, GST_FORMAT_UNDEFINED); gst_segment_init (&stream->segment, GST_FORMAT_UNDEFINED);
stream->wait = FALSE;
stream->new_stream = FALSE;
stream->drop_discont = FALSE;
} }
GST_STREAM_SYNCHRONIZER_UNLOCK (self); GST_STREAM_SYNCHRONIZER_UNLOCK (self);
break; break;
@ -496,6 +502,12 @@ gst_stream_synchronizer_sink_chain (GstPad * pad, GstBuffer * buffer)
GST_STREAM_SYNCHRONIZER_LOCK (self); GST_STREAM_SYNCHRONIZER_LOCK (self);
stream = gst_pad_get_element_private (pad); stream = gst_pad_get_element_private (pad);
if (stream && stream->drop_discont) {
buffer = gst_buffer_make_metadata_writable (buffer);
GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DISCONT);
stream->drop_discont = FALSE;
}
if (stream && stream->segment.format == GST_FORMAT_TIME if (stream && stream->segment.format == GST_FORMAT_TIME
&& GST_CLOCK_TIME_IS_VALID (timestamp)) { && GST_CLOCK_TIME_IS_VALID (timestamp)) {
GST_LOG_OBJECT (pad, GST_LOG_OBJECT (pad,
@ -709,10 +721,24 @@ gst_stream_synchronizer_change_state (GstElement * element,
case GST_STATE_CHANGE_PLAYING_TO_PAUSED: case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
GST_DEBUG_OBJECT (self, "State change PLAYING->PAUSED"); GST_DEBUG_OBJECT (self, "State change PLAYING->PAUSED");
break; break;
case GST_STATE_CHANGE_PAUSED_TO_READY: case GST_STATE_CHANGE_PAUSED_TO_READY:{
GList *l;
GST_DEBUG_OBJECT (self, "State change PAUSED->READY"); GST_DEBUG_OBJECT (self, "State change PAUSED->READY");
self->group_start_time = 0; self->group_start_time = 0;
GST_STREAM_SYNCHRONIZER_LOCK (self);
for (l = self->streams; l; l = l->next) {
GstStream *stream = l->data;
gst_segment_init (&stream->segment, GST_FORMAT_UNDEFINED);
stream->wait = FALSE;
stream->new_stream = FALSE;
stream->drop_discont = FALSE;
}
GST_STREAM_SYNCHRONIZER_UNLOCK (self);
break; break;
}
case GST_STATE_CHANGE_READY_TO_NULL:{ case GST_STATE_CHANGE_READY_TO_NULL:{
GST_DEBUG_OBJECT (self, "State change READY->NULL"); GST_DEBUG_OBJECT (self, "State change READY->NULL");
break; break;