gst-rtsp-server: Fix pushing backlog to client

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>
This commit is contained in:
Bruce Liang 2022-08-24 19:50:19 +08:00 committed by GStreamer Marge Bot
parent ef6f157205
commit 657cc3e6d6
3 changed files with 32 additions and 7 deletions

View file

@ -40,6 +40,8 @@ gboolean gst_rtsp_stream_transport_backlog_pop (GstRTSPStreamT
GstBufferList **buffer_list, GstBufferList **buffer_list,
gboolean *is_rtp); gboolean *is_rtp);
gboolean gst_rtsp_stream_transport_backlog_peek_is_rtp (GstRTSPStreamTransport * trans);
gboolean gst_rtsp_stream_transport_backlog_is_empty (GstRTSPStreamTransport *trans); gboolean gst_rtsp_stream_transport_backlog_is_empty (GstRTSPStreamTransport *trans);
void gst_rtsp_stream_transport_clear_backlog (GstRTSPStreamTransport * trans); void gst_rtsp_stream_transport_clear_backlog (GstRTSPStreamTransport * trans);

View file

@ -950,6 +950,25 @@ gst_rtsp_stream_transport_backlog_pop (GstRTSPStreamTransport * trans,
return TRUE; return TRUE;
} }
/* 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. /* Not MT-safe, caller should ensure consistent locking.
* See gst_rtsp_stream_transport_lock_backlog() */ * See gst_rtsp_stream_transport_lock_backlog() */
gboolean gboolean

View file

@ -2644,16 +2644,20 @@ check_transport_backlog (GstRTSPStream * stream, GstRTSPStreamTransport * trans)
gboolean is_rtp; gboolean is_rtp;
gboolean popped; gboolean popped;
popped = is_rtp = gst_rtsp_stream_transport_backlog_peek_is_rtp (trans);
gst_rtsp_stream_transport_backlog_pop (trans, &buffer, &buffer_list,
&is_rtp);
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); send_ret = push_data (stream, trans, buffer, buffer_list, is_rtp);
gst_clear_buffer_list (&buffer_list);
gst_clear_buffer (&buffer);
gst_clear_buffer_list (&buffer_list);
}
} }
gst_rtsp_stream_transport_unlock_backlog (trans); gst_rtsp_stream_transport_unlock_backlog (trans);