summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Alexander Steffens (heftig) <jan.steffens@gmail.com>2016-11-23 14:35:04 +0100
committerSebastian Dröge <sebastian@centricular.com>2016-12-05 11:03:16 +0200
commit633bb312f739271139b04debb72ada68c3548df5 (patch)
treea5d15a4f6039126d93aabb6431faa1a73e706ea8
parentf329d44bb7efdb388bc954036d50c8bdf0974811 (diff)
downloadgstreamer-plugins-base-633bb312f739271139b04debb72ada68c3548df5.tar.gz
multihandlesink: Update bufpos in a separate pass
If a client gets dropped and the iteration gets restarted, bufpos is incremented again for all clients that preceded the dropped one, causing havoc. Adjust the bufpos for all clients first before trying to drop any. https://bugzilla.gnome.org/show_bug.cgi?id=774908
-rw-r--r--gst/tcp/gstmultihandlesink.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/gst/tcp/gstmultihandlesink.c b/gst/tcp/gstmultihandlesink.c
index 901326159..876cc32d3 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;