streamsynchronizer: Fix another deadlock when going PAUSED->READY while streams are waiting for the GCond
This commit is contained in:
parent
b93edac480
commit
ec3c19189d
@ -350,6 +350,12 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstEvent * event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (self->shutdown) {
|
||||||
|
GST_STREAM_SYNCHRONIZER_UNLOCK (self);
|
||||||
|
gst_event_unref (event);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
if (stream && format == GST_FORMAT_TIME) {
|
if (stream && format == GST_FORMAT_TIME) {
|
||||||
if (stream->new_stream) {
|
if (stream->new_stream) {
|
||||||
gint64 last_stop_running_time = 0;
|
gint64 last_stop_running_time = 0;
|
||||||
@ -451,6 +457,7 @@ gst_stream_synchronizer_sink_event (GstPad * pad, GstEvent * event)
|
|||||||
gst_object_unref (opad);
|
gst_object_unref (opad);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
gst_object_unref (self);
|
gst_object_unref (self);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -687,14 +694,23 @@ gst_stream_synchronizer_change_state (GstElement * element,
|
|||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
GST_DEBUG_OBJECT (self, "State change NULL->READY");
|
GST_DEBUG_OBJECT (self, "State change NULL->READY");
|
||||||
|
self->shutdown = FALSE;
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
GST_DEBUG_OBJECT (self, "State change READY->PAUSED");
|
GST_DEBUG_OBJECT (self, "State change READY->PAUSED");
|
||||||
self->group_start_time = 0;
|
self->group_start_time = 0;
|
||||||
|
self->shutdown = FALSE;
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
||||||
GST_DEBUG_OBJECT (self, "State change PAUSED->PLAYING");
|
GST_DEBUG_OBJECT (self, "State change PAUSED->PLAYING");
|
||||||
break;
|
break;
|
||||||
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
|
GST_DEBUG_OBJECT (self, "State change READY->NULL");
|
||||||
|
|
||||||
|
GST_STREAM_SYNCHRONIZER_LOCK (self);
|
||||||
|
g_cond_broadcast (self->stream_finish_cond);
|
||||||
|
self->shutdown = TRUE;
|
||||||
|
GST_STREAM_SYNCHRONIZER_UNLOCK (self);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -734,7 +750,6 @@ gst_stream_synchronizer_change_state (GstElement * element,
|
|||||||
GST_DEBUG_OBJECT (self, "State change READY->NULL");
|
GST_DEBUG_OBJECT (self, "State change READY->NULL");
|
||||||
|
|
||||||
GST_STREAM_SYNCHRONIZER_LOCK (self);
|
GST_STREAM_SYNCHRONIZER_LOCK (self);
|
||||||
g_cond_broadcast (self->stream_finish_cond);
|
|
||||||
while (self->streams)
|
while (self->streams)
|
||||||
gst_stream_synchronizer_release_stream (self, self->streams->data);
|
gst_stream_synchronizer_release_stream (self, self->streams->data);
|
||||||
self->current_stream_number = 0;
|
self->current_stream_number = 0;
|
||||||
|
@ -47,6 +47,7 @@ struct _GstStreamSynchronizer
|
|||||||
/* < private > */
|
/* < private > */
|
||||||
GMutex *lock;
|
GMutex *lock;
|
||||||
GCond *stream_finish_cond;
|
GCond *stream_finish_cond;
|
||||||
|
gboolean shutdown;
|
||||||
|
|
||||||
GList *streams;
|
GList *streams;
|
||||||
guint current_stream_number;
|
guint current_stream_number;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user