gst-rtsp-server: Fix pushing backlog to client
authorBruce Liang <Bruce.Liang@Abilitycorp.com.tw>
Wed, 24 Aug 2022 11:50:19 +0000 (19:50 +0800)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 2 Sep 2022 16:04:06 +0000 (16:04 +0000)
Check back pressure of a stream transport before popping buffer from its backlog.

If the stream transport is not experiencing back pressure, the buffer can be popped from backlog and pushed to client.

Fixes:#1298

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2936>

subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-server-internal.h
subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-stream-transport.c
subprojects/gst-rtsp-server/gst/rtsp-server/rtsp-stream.c

index b5aaeff..6015d68 100644 (file)
@@ -40,6 +40,8 @@ gboolean                 gst_rtsp_stream_transport_backlog_pop   (GstRTSPStreamT
                                                                   GstBufferList **buffer_list,
                                                                   gboolean *is_rtp);
 
+gboolean                 gst_rtsp_stream_transport_backlog_peek_is_rtp (GstRTSPStreamTransport * trans);
+
 gboolean                 gst_rtsp_stream_transport_backlog_is_empty (GstRTSPStreamTransport *trans);
 
 void                     gst_rtsp_stream_transport_clear_backlog (GstRTSPStreamTransport * trans);
index d293a95..4502ec1 100644 (file)
@@ -953,6 +953,25 @@ gst_rtsp_stream_transport_backlog_pop (GstRTSPStreamTransport * trans,
 /* Not MT-safe, caller should ensure consistent locking.
  * See gst_rtsp_stream_transport_lock_backlog() */
 gboolean
+gst_rtsp_stream_transport_backlog_peek_is_rtp (GstRTSPStreamTransport * trans)
+{
+  BackLogItem *item;
+  GstRTSPStreamTransportPrivate *priv;
+
+  g_return_val_if_fail (!gst_rtsp_stream_transport_backlog_is_empty (trans),
+      FALSE);
+
+  priv = trans->priv;
+
+  item = (BackLogItem *) gst_queue_array_peek_head_struct (priv->items);
+
+  return item->is_rtp;
+}
+
+
+/* Not MT-safe, caller should ensure consistent locking.
+ * See gst_rtsp_stream_transport_lock_backlog() */
+gboolean
 gst_rtsp_stream_transport_backlog_is_empty (GstRTSPStreamTransport * trans)
 {
   return gst_queue_array_is_empty (trans->priv->items);
index fed62d8..99d87e9 100644 (file)
@@ -2644,16 +2644,20 @@ check_transport_backlog (GstRTSPStream * stream, GstRTSPStreamTransport * trans)
     gboolean is_rtp;
     gboolean popped;
 
-    popped =
-        gst_rtsp_stream_transport_backlog_pop (trans, &buffer, &buffer_list,
-        &is_rtp);
+    is_rtp = gst_rtsp_stream_transport_backlog_peek_is_rtp (trans);
 
-    g_assert (popped == TRUE);
+    if (!gst_rtsp_stream_transport_check_back_pressure (trans, is_rtp)) {
+      popped =
+          gst_rtsp_stream_transport_backlog_pop (trans, &buffer, &buffer_list,
+          &is_rtp);
 
-    send_ret = push_data (stream, trans, buffer, buffer_list, is_rtp);
+      g_assert (popped == TRUE);
 
-    gst_clear_buffer (&buffer);
-    gst_clear_buffer_list (&buffer_list);
+      send_ret = push_data (stream, trans, buffer, buffer_list, is_rtp);
+
+      gst_clear_buffer (&buffer);
+      gst_clear_buffer_list (&buffer_list);
+    }
   }
 
   gst_rtsp_stream_transport_unlock_backlog (trans);