diff --git a/gst/tcp/gstmultihandlesink.c b/gst/tcp/gstmultihandlesink.c index f060f0eaf2..3ea7f371a9 100644 --- a/gst/tcp/gstmultihandlesink.c +++ b/gst/tcp/gstmultihandlesink.c @@ -1704,26 +1704,14 @@ gst_multi_handle_sink_queue_buffer (GstMultiHandleSink * mhsink, soft_max_buffers); /* then loop over the clients and update the positions */ - max_buffer_usage = 0; - -restart: cookie = mhsink->clients_cookie; - for (clients = mhsink->clients; clients; clients = next) { + for (clients = mhsink->clients; clients; clients = clients->next) { GstMultiHandleClient *mhclient = clients->data; - g_get_current_time (&nowtv); - now = GST_TIMEVAL_TO_TIME (nowtv); - - if (cookie != mhsink->clients_cookie) { - GST_DEBUG_OBJECT (sink, "Clients cookie outdated, restarting"); - goto restart; - } - - next = g_list_next (clients); - mhclient->bufpos++; GST_LOG_OBJECT (sink, "%s client %p at position %d", mhclient->debug, mhclient, mhclient->bufpos); + /* check soft max if needed, recover client */ if (soft_max_buffers > 0 && mhclient->bufpos >= soft_max_buffers) { gint newpos; @@ -1740,6 +1728,25 @@ restart: "%s client %p not recovering position", mhclient->debug, mhclient); } } + } + + max_buffer_usage = 0; + g_get_current_time (&nowtv); + now = GST_TIMEVAL_TO_TIME (nowtv); + + /* now check for new or slow clients */ +restart: + cookie = mhsink->clients_cookie; + for (clients = mhsink->clients; clients; clients = next) { + GstMultiHandleClient *mhclient = clients->data; + + if (cookie != mhsink->clients_cookie) { + GST_DEBUG_OBJECT (sink, "Clients cookie outdated, restarting"); + goto restart; + } + + next = g_list_next (clients); + /* check hard max and timeout, remove client */ if ((max_buffers > 0 && mhclient->bufpos >= max_buffers) || (mhsink->timeout > 0 @@ -1761,6 +1768,7 @@ restart: mhsinkclass->hash_adding (mhsink, mhclient); hash_changed = TRUE; } + /* keep track of maximum buffer usage */ if (mhclient->bufpos > max_buffer_usage) { max_buffer_usage = mhclient->bufpos;