client: raise the backlog limits before pausing
authorGöran Jönsson <goranjn@axis.com>
Tue, 16 Sep 2014 09:41:52 +0000 (11:41 +0200)
committerWim Taymans <wtaymans@redhat.com>
Tue, 16 Sep 2014 09:41:52 +0000 (11:41 +0200)
We need to raise the backlog limits before pausing the pipeline or else
the appsink might be blocking in the render method in wait_backlog() and
we would deadlock waiting for paused.

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

gst/rtsp-server/rtsp-client.c

index d616e84..9cd69bc 100644 (file)
@@ -961,6 +961,7 @@ bad_request:
 static gboolean
 handle_pause_request (GstRTSPClient * client, GstRTSPContext * ctx)
 {
+  GstRTSPClientPrivate *priv = client->priv;
   GstRTSPSession *session;
   GstRTSPClientClass *klass;
   GstRTSPSessionMedia *sessmedia;
@@ -996,6 +997,11 @@ handle_pause_request (GstRTSPClient * client, GstRTSPContext * ctx)
       rtspstate != GST_RTSP_STATE_RECORDING)
     goto invalid_state;
 
+  /* No limit on watch queue because else we might be blocking in the appsink
+   * render method and the PAUSE below will hang */
+  if (priv->watch != NULL)
+    gst_rtsp_watch_set_send_backlog (priv->watch, 0, 0);
+
   /* then pause sending */
   gst_rtsp_session_media_set_state (sessmedia, GST_STATE_PAUSED);
 
@@ -1006,6 +1012,9 @@ handle_pause_request (GstRTSPClient * client, GstRTSPContext * ctx)
 
   send_message (client, ctx, ctx->response, FALSE);
 
+  if (priv->watch != NULL)
+    gst_rtsp_watch_set_send_backlog (priv->watch, 0, WATCH_BACKLOG_SIZE);
+
   /* the state is now READY */
   gst_rtsp_session_media_set_rtsp_state (sessmedia, GST_RTSP_STATE_READY);