rtsp-media: Unblock blocked streams in unprepare
authorLinus Svensson <linussn@axis.com>
Tue, 1 Apr 2014 11:16:26 +0000 (13:16 +0200)
committerWim Taymans <wtaymans@redhat.com>
Tue, 8 Apr 2014 12:58:23 +0000 (14:58 +0200)
The streams will be blocked when a live media is prepared.
The streams should be unblocked in gst_rtsp_media_unprepare.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=727231

gst/rtsp-server/rtsp-media.c
tests/check/gst/media.c

index ff40ec8..9848171 100644 (file)
@@ -2401,6 +2401,8 @@ gst_rtsp_media_unprepare (GstRTSPMedia * media)
     goto is_busy;
 
   GST_INFO ("unprepare media %p", media);
+  if (priv->blocked)
+    media_streams_set_blocked (media, FALSE);
   set_target_state (media, GST_STATE_NULL, FALSE);
   success = TRUE;
 
index df3e1c2..a026159 100644 (file)
@@ -123,29 +123,27 @@ GST_START_TEST (test_media)
 
 GST_END_TEST;
 
-GST_START_TEST (test_media_prepare)
+static void
+test_prepare_reusable (GstRTSPThreadPool * pool, const gchar * launch_line)
 {
   GstRTSPMediaFactory *factory;
   GstRTSPMedia *media;
   GstRTSPUrl *url;
-  GstRTSPThreadPool *pool;
   GstRTSPThread *thread;
 
-  pool = gst_rtsp_thread_pool_new ();
-
-  /* test non-reusable media first */
   factory = gst_rtsp_media_factory_new ();
   fail_if (gst_rtsp_media_factory_is_shared (factory));
   fail_unless (gst_rtsp_url_parse ("rtsp://localhost:8554/test",
           &url) == GST_RTSP_OK);
 
-  gst_rtsp_media_factory_set_launch (factory,
-      "( videotestsrc ! rtpvrawpay pt=96 name=pay0 )");
+  gst_rtsp_media_factory_set_launch (factory, launch_line);
 
   media = gst_rtsp_media_factory_construct (factory, url);
   fail_unless (GST_IS_RTSP_MEDIA (media));
   fail_unless (gst_rtsp_media_n_streams (media) == 1);
 
+  g_object_set (G_OBJECT (media), "reusable", TRUE, NULL);
+
   thread = gst_rtsp_thread_pool_get_thread (pool,
       GST_RTSP_THREAD_TYPE_MEDIA, NULL);
   fail_unless (gst_rtsp_media_prepare (media, thread));
@@ -154,13 +152,25 @@ GST_START_TEST (test_media_prepare)
 
   thread = gst_rtsp_thread_pool_get_thread (pool,
       GST_RTSP_THREAD_TYPE_MEDIA, NULL);
-  fail_if (gst_rtsp_media_prepare (media, thread));
+  fail_unless (gst_rtsp_media_prepare (media, thread));
+  fail_unless (gst_rtsp_media_unprepare (media));
 
   g_object_unref (media);
   gst_rtsp_url_free (url);
   g_object_unref (factory);
+}
 
-  /* test reusable media */
+GST_START_TEST (test_media_prepare)
+{
+  GstRTSPMediaFactory *factory;
+  GstRTSPMedia *media;
+  GstRTSPUrl *url;
+  GstRTSPThreadPool *pool;
+  GstRTSPThread *thread;
+
+  pool = gst_rtsp_thread_pool_new ();
+
+  /* test non-reusable media first */
   factory = gst_rtsp_media_factory_new ();
   fail_if (gst_rtsp_media_factory_is_shared (factory));
   fail_unless (gst_rtsp_url_parse ("rtsp://localhost:8554/test",
@@ -173,8 +183,6 @@ GST_START_TEST (test_media_prepare)
   fail_unless (GST_IS_RTSP_MEDIA (media));
   fail_unless (gst_rtsp_media_n_streams (media) == 1);
 
-  g_object_set (G_OBJECT (media), "reusable", TRUE, NULL);
-
   thread = gst_rtsp_thread_pool_get_thread (pool,
       GST_RTSP_THREAD_TYPE_MEDIA, NULL);
   fail_unless (gst_rtsp_media_prepare (media, thread));
@@ -183,12 +191,17 @@ GST_START_TEST (test_media_prepare)
 
   thread = gst_rtsp_thread_pool_get_thread (pool,
       GST_RTSP_THREAD_TYPE_MEDIA, NULL);
-  fail_unless (gst_rtsp_media_prepare (media, thread));
-  fail_unless (gst_rtsp_media_unprepare (media));
+  fail_if (gst_rtsp_media_prepare (media, thread));
 
   g_object_unref (media);
   gst_rtsp_url_free (url);
   g_object_unref (factory);
+
+  /* test reusable media */
+  test_prepare_reusable (pool, "( videotestsrc ! rtpvrawpay pt=96 name=pay0 )");
+  test_prepare_reusable (pool,
+      "( videotestsrc is-live=true ! rtpvrawpay pt=96 name=pay0 )");
+
   g_object_unref (pool);
 }