From 7bdf7500a1b0bcfa8229cc513e45d4604a64bdb8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 23 Jun 2014 18:43:21 +0100 Subject: [PATCH] multiudpsink: keep client list sorted by socket family We make use of in the send_buffers() function if we need to use different sockets to send to IPv4 and IPv6 destinations. --- gst/udp/gstmultiudpsink.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/gst/udp/gstmultiudpsink.c b/gst/udp/gstmultiudpsink.c index d2fbca7..c456a99 100644 --- a/gst/udp/gstmultiudpsink.c +++ b/gst/udp/gstmultiudpsink.c @@ -808,7 +808,7 @@ gst_multiudpsink_render_buffers (GstMultiUDPSink * sink, GstBuffer ** buffers, guint num_msgs_v4 = num_buffers * num_addr_v4; guint num_msgs_v6 = num_buffers * num_addr_v6; - /* FIXME: assumes clients are sorted in our list! */ + /* our client list is sorted with IPv4 clients first and IPv6 ones last */ ret = gst_multiudpsink_send_messages (sink, sink->used_socket, msgs, num_msgs_v4); @@ -1627,6 +1627,23 @@ gst_multiudpsink_stop (GstBaseSink * bsink) return TRUE; } +static gint +gst_udp_client_compare_socket_family (GstUDPClient * a, GstUDPClient * b) +{ + GSocketFamily fa = g_socket_address_get_family (a->addr); + GSocketFamily fb = g_socket_address_get_family (b->addr); + + if (fa == fb) + return 0; + + /* a should go before b */ + if (fa == G_SOCKET_FAMILY_IPV4 && fb == G_SOCKET_FAMILY_IPV6) + return -1; + + /* b should go before a */ + return 1; +} + static void gst_multiudpsink_add_internal (GstMultiUDPSink * sink, const gchar * host, gint port, gboolean lock) @@ -1669,7 +1686,11 @@ gst_multiudpsink_add_internal (GstMultiUDPSink * sink, const gchar * host, gst_multiudpsink_configure_client (sink, client); GST_DEBUG_OBJECT (sink, "add client with host %s, port %d", host, port); - sink->clients = g_list_prepend (sink->clients, client); + + /* keep IPv4 clients at the beginning, and IPv6 at the end, we can make + * use of this in gst_multiudpsink_render_buffers() */ + sink->clients = g_list_insert_sorted (sink->clients, client, + (GCompareFunc) gst_udp_client_compare_socket_family); if (family == G_SOCKET_FAMILY_IPV4) ++sink->num_v4_unique; -- 2.7.4