mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-06 02:32:23 +00:00
rtsp-media: Do not prepare media after media times out
Deferred calls to start_prepare() can be deferred past the point until which wait_preroll() and by proxy gst_rtsp_media_get_status() is prepared to wait. Previously there was no lock and no check for this situation. This meant that a media could be prepared and unprepared simultaneously by two different threads. Now a lock is in place and a suitable check is done. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=759773
This commit is contained in:
parent
c8f179948e
commit
b2abb97043
1 changed files with 14 additions and 0 deletions
|
@ -2555,6 +2555,10 @@ start_prepare (GstRTSPMedia * media)
|
||||||
guint i;
|
guint i;
|
||||||
GList *walk;
|
GList *walk;
|
||||||
|
|
||||||
|
g_rec_mutex_lock (&priv->state_lock);
|
||||||
|
if (priv->status != GST_RTSP_MEDIA_STATUS_PREPARING)
|
||||||
|
goto no_longer_preparing;
|
||||||
|
|
||||||
/* link streams we already have, other streams might appear when we have
|
/* link streams we already have, other streams might appear when we have
|
||||||
* dynamic elements */
|
* dynamic elements */
|
||||||
for (i = 0; i < priv->streams->len; i++) {
|
for (i = 0; i < priv->streams->len; i++) {
|
||||||
|
@ -2603,18 +2607,28 @@ start_prepare (GstRTSPMedia * media)
|
||||||
if (!start_preroll (media))
|
if (!start_preroll (media))
|
||||||
goto preroll_failed;
|
goto preroll_failed;
|
||||||
|
|
||||||
|
g_rec_mutex_unlock (&priv->state_lock);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
no_longer_preparing:
|
||||||
|
{
|
||||||
|
GST_INFO ("media is no longer preparing");
|
||||||
|
g_rec_mutex_unlock (&priv->state_lock);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
join_bin_failed:
|
join_bin_failed:
|
||||||
{
|
{
|
||||||
GST_WARNING ("failed to join bin element");
|
GST_WARNING ("failed to join bin element");
|
||||||
gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_ERROR);
|
gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_ERROR);
|
||||||
|
g_rec_mutex_unlock (&priv->state_lock);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
preroll_failed:
|
preroll_failed:
|
||||||
{
|
{
|
||||||
GST_WARNING ("failed to preroll pipeline");
|
GST_WARNING ("failed to preroll pipeline");
|
||||||
gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_ERROR);
|
gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_ERROR);
|
||||||
|
g_rec_mutex_unlock (&priv->state_lock);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue