mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
rtsp-stream: fix checking of TCP backpressure
The internal index of our appsinks, while it can be used to determine whether a message is RTP or RTCP, is not necessarily the same as the interleaved channel. Let the stream-transport determine the channel to check backpressure for, the same way it determines the channel according to whether it is sending RTP or RTCP.
This commit is contained in:
parent
73b4929803
commit
e0a4355d6b
3 changed files with 13 additions and 7 deletions
|
@ -48,7 +48,7 @@ void gst_rtsp_stream_transport_set_back_pressure_callback (G
|
||||||
GDestroyNotify notify);
|
GDestroyNotify notify);
|
||||||
|
|
||||||
gboolean gst_rtsp_stream_transport_check_back_pressure (GstRTSPStreamTransport *trans,
|
gboolean gst_rtsp_stream_transport_check_back_pressure (GstRTSPStreamTransport *trans,
|
||||||
guint8 channel);
|
gboolean is_rtp);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -296,13 +296,19 @@ gst_rtsp_stream_transport_set_back_pressure_callback (GstRTSPStreamTransport *
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
gst_rtsp_stream_transport_check_back_pressure (GstRTSPStreamTransport * trans,
|
gst_rtsp_stream_transport_check_back_pressure (GstRTSPStreamTransport * trans,
|
||||||
guint8 channel)
|
gboolean is_rtp)
|
||||||
{
|
{
|
||||||
GstRTSPStreamTransportPrivate *priv;
|
GstRTSPStreamTransportPrivate *priv;
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
|
guint8 channel;
|
||||||
|
|
||||||
priv = trans->priv;
|
priv = trans->priv;
|
||||||
|
|
||||||
|
if (is_rtp)
|
||||||
|
channel = priv->transport->interleaved.min;
|
||||||
|
else
|
||||||
|
channel = priv->transport->interleaved.max;
|
||||||
|
|
||||||
if (priv->back_pressure_func)
|
if (priv->back_pressure_func)
|
||||||
ret = priv->back_pressure_func (channel, priv->back_pressure_func_data);
|
ret = priv->back_pressure_func (channel, priv->back_pressure_func_data);
|
||||||
|
|
||||||
|
|
|
@ -2468,7 +2468,7 @@ clear_tr_cache (GstRTSPStreamPrivate * priv)
|
||||||
|
|
||||||
/* With lock taken */
|
/* With lock taken */
|
||||||
static gboolean
|
static gboolean
|
||||||
any_transport_ready (GstRTSPStream * stream, guint8 channel)
|
any_transport_ready (GstRTSPStream * stream, gboolean is_rtp)
|
||||||
{
|
{
|
||||||
gboolean ret = TRUE;
|
gboolean ret = TRUE;
|
||||||
GstRTSPStreamPrivate *priv = stream->priv;
|
GstRTSPStreamPrivate *priv = stream->priv;
|
||||||
|
@ -2482,7 +2482,7 @@ any_transport_ready (GstRTSPStream * stream, guint8 channel)
|
||||||
|
|
||||||
for (index = 0; index < transports->len; index++) {
|
for (index = 0; index < transports->len; index++) {
|
||||||
GstRTSPStreamTransport *tr = g_ptr_array_index (transports, index);
|
GstRTSPStreamTransport *tr = g_ptr_array_index (transports, index);
|
||||||
if (!gst_rtsp_stream_transport_check_back_pressure (tr, channel)) {
|
if (!gst_rtsp_stream_transport_check_back_pressure (tr, is_rtp)) {
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2565,7 +2565,9 @@ send_tcp_message (GstRTSPStream * stream, gint idx)
|
||||||
|
|
||||||
ensure_cached_transports (stream);
|
ensure_cached_transports (stream);
|
||||||
|
|
||||||
if (!any_transport_ready (stream, idx))
|
is_rtp = (idx == 0);
|
||||||
|
|
||||||
|
if (!any_transport_ready (stream, is_rtp))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
priv->have_buffer[idx] = FALSE;
|
priv->have_buffer[idx] = FALSE;
|
||||||
|
@ -2591,8 +2593,6 @@ send_tcp_message (GstRTSPStream * stream, gint idx)
|
||||||
if (buffer_list)
|
if (buffer_list)
|
||||||
n_messages += 1;
|
n_messages += 1;
|
||||||
|
|
||||||
is_rtp = (idx == 0);
|
|
||||||
|
|
||||||
transports = priv->tr_cache;
|
transports = priv->tr_cache;
|
||||||
g_ptr_array_ref (transports);
|
g_ptr_array_ref (transports);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue