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-11-29 19:13:00 +0200
commit8b9ebd8f8844fb720243b099bf743100dff5acea (patch)
tree3a56ce93ffc78d783f87a02bc225cb1881c39993
parent6c5381eda69129a64f10161d337ebd73bc08dc63 (diff)
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 f060f0eaf..3ea7f371a 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;