mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-23 22:46:24 +00:00
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:
parent
405b47a79a
commit
1605bef4b9
1 changed files with 27 additions and 1 deletions
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue