rtsp-media: fix RECORD getting stuck
authorMathieu Duponchelle <mathieu@centricular.com>
Thu, 22 Feb 2018 19:17:33 +0000 (20:17 +0100)
committerMathieu Duponchelle <mathieu@centricular.com>
Fri, 23 Feb 2018 15:13:56 +0000 (16:13 +0100)
The test_record case was working because async=false had
been added in https://bugzilla.gnome.org/show_bug.cgi?id=757488
but that was incorrect, as it should not be needed.

Removing async=false made the test fail as expected, this is
fixed by not trying to preroll when preparing the media for
RECORD, as start_prepare is called upon receiving ANNOUNCE,
and our peer will not start sending media until it has received
a response to that request, and sent and received a response
to RECORD as well, thus obviously preventing preroll.

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

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

index 193f5e0..8f21fa9 100644 (file)
@@ -3058,8 +3058,14 @@ start_prepare (GstRTSPMedia * media)
     g_object_set_data (G_OBJECT (elem), "gst-rtsp-dynpay-handlers", handlers);
   }
 
-  if (!start_preroll (media))
+  if (priv->nb_dynamic_elements == 0 && is_receive_only (media)) {
+    /* If we are receive_only (RECORD), do not try to preroll, to avoid
+     * a second ASYNC state change failing */
+    priv->is_live = TRUE;
+    gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_PREPARED);
+  } else if (!start_preroll (media)) {
     goto preroll_failed;
+  }
 
   g_rec_mutex_unlock (&priv->state_lock);
 
index da2f2dd..ddafdba 100644 (file)
@@ -157,7 +157,7 @@ GST_START_TEST (test_record)
 
   mfactory =
       start_record_server
-      ("( rtppcmadepay name=depay0 ! appsink name=sink async=false )");
+      ("( rtppcmadepay name=depay0 ! appsink name=sink )");
 
   g_signal_connect (mfactory, "media-constructed",
       G_CALLBACK (media_constructed_cb), &server_sink);