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,6 +2644,9 @@ check_transport_backlog (GstRTSPStream * stream, GstRTSPStreamTransport * trans)
gboolean is_rtp; gboolean is_rtp;
gboolean popped; gboolean popped;
is_rtp = gst_rtsp_stream_transport_backlog_peek_is_rtp (trans);
if (!gst_rtsp_stream_transport_check_back_pressure (trans, is_rtp)) {
popped = popped =
gst_rtsp_stream_transport_backlog_pop (trans, &buffer, &buffer_list, gst_rtsp_stream_transport_backlog_pop (trans, &buffer, &buffer_list,
&is_rtp); &is_rtp);
@ -2655,6 +2658,7 @@ check_transport_backlog (GstRTSPStream * stream, GstRTSPStreamTransport * trans)
gst_clear_buffer (&buffer); gst_clear_buffer (&buffer);
gst_clear_buffer_list (&buffer_list); gst_clear_buffer_list (&buffer_list);
} }
}
gst_rtsp_stream_transport_unlock_backlog (trans); gst_rtsp_stream_transport_unlock_backlog (trans);