}
}
+static gboolean
+gst_multiudpsink_configure_client (GstMultiUDPSink * sink,
+ GstUDPClient * client)
+{
+ GST_DEBUG_OBJECT (sink, "configuring client %p", client);
+
+ if (gst_udp_is_multicast (&client->theiraddr)) {
+ GST_DEBUG_OBJECT (sink, "we have a multicast client %p", client);
+ if (sink->auto_multicast) {
+ GST_DEBUG_OBJECT (sink, "autojoining group");
+ if (gst_udp_join_group (*(client->sock), &client->theiraddr, NULL)
+ != 0)
+ goto join_group_failed;
+ }
+ GST_DEBUG_OBJECT (sink, "setting loop to %d", sink->loop);
+ if (gst_udp_set_loop (sink->sock, sink->loop) != 0)
+ goto loop_failed;
+ GST_DEBUG_OBJECT (sink, "setting ttl to %d", sink->ttl_mc);
+ if (gst_udp_set_ttl (sink->sock, sink->ttl_mc, TRUE) != 0)
+ goto ttl_failed;
+ } else {
+ GST_DEBUG_OBJECT (sink, "setting unicast ttl to %d", sink->ttl);
+ if (gst_udp_set_ttl (sink->sock, sink->ttl, FALSE) != 0)
+ goto ttl_failed;
+ }
+ return TRUE;
+
+ /* ERRORS */
+join_group_failed:
+ {
+ gchar *errormessage = socket_last_error_message ();
+ int errorcode = socket_last_error_code ();
+ CLOSE_IF_REQUESTED (sink);
+ GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
+ ("Could not join multicast group (%d): %s", errorcode, errormessage));
+ g_free (errormessage);
+ return FALSE;
+ }
+ttl_failed:
+ {
+ gchar *errormessage = socket_last_error_message ();
+ int errorcode = socket_last_error_code ();
+ CLOSE_IF_REQUESTED (sink);
+ GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
+ ("Could not set TTL socket option (%d): %s", errorcode, errormessage));
+ g_free (errormessage);
+ return FALSE;
+ }
+loop_failed:
+ {
+ gchar *errormessage = socket_last_error_message ();
+ int errorcode = socket_last_error_code ();
+ CLOSE_IF_REQUESTED (sink);
+ GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
+ ("Could not set loopback socket option (%d): %s",
+ errorcode, errormessage));
+ g_free (errormessage);
+ return FALSE;
+ }
+}
+
/* create a socket for sending to remote machine */
static gboolean
gst_multiudpsink_init_send (GstMultiUDPSink * sink)
GstUDPClient *client;
if (sink->sockfd == -1) {
+ GST_DEBUG_OBJECT (sink, "creating sockets");
/* create sender socket try IP6, fall back to IP4 */
if ((sink->sock = socket (AF_INET6, SOCK_DGRAM, 0)) == -1)
if ((sink->sock = socket (AF_INET, SOCK_DGRAM, 0)) == -1)
goto no_socket;
+ GST_DEBUG_OBJECT (sink, "have socket");
sink->externalfd = FALSE;
} else {
+ GST_DEBUG_OBJECT (sink, "using configured socket");
/* we use the configured socket */
sink->sock = sink->sockfd;
sink->externalfd = TRUE;
set also ttl and multicast loopback delivery appropriately */
for (clients = sink->clients; clients; clients = g_list_next (clients)) {
client = (GstUDPClient *) clients->data;
- if (gst_udp_is_multicast (&client->theiraddr)) {
- if (sink->auto_multicast) {
- if (gst_udp_join_group (*(client->sock), &client->theiraddr, NULL)
- != 0)
- goto join_group_failed;
- }
- if (gst_udp_set_loop (sink->sock, sink->loop) != 0)
- goto loop_failed;
- if (gst_udp_set_ttl (sink->sock, sink->ttl_mc, TRUE) != 0)
- goto ttl_failed;
- } else {
- if (gst_udp_set_ttl (sink->sock, sink->ttl, FALSE) != 0)
- goto ttl_failed;
- }
+
+ if (!gst_multiudpsink_configure_client (sink, client))
+ return FALSE;
}
return TRUE;
g_free (errormessage);
return FALSE;
}
-join_group_failed:
- {
- gchar *errormessage = socket_last_error_message ();
- int errorcode = socket_last_error_code ();
- CLOSE_IF_REQUESTED (sink);
- GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
- ("Could not join multicast group (%d): %s", errorcode, errormessage));
- g_free (errormessage);
- return FALSE;
- }
-ttl_failed:
- {
- gchar *errormessage = socket_last_error_message ();
- int errorcode = socket_last_error_code ();
- CLOSE_IF_REQUESTED (sink);
- GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
- ("Could not set TTL socket option (%d): %s", errorcode, errormessage));
- g_free (errormessage);
- return FALSE;
- }
-loop_failed:
- {
- gchar *errormessage = socket_last_error_message ();
- int errorcode = socket_last_error_code ();
- CLOSE_IF_REQUESTED (sink);
- GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
- ("Could not set loopback socket option (%d): %s",
- errorcode, errormessage));
- g_free (errormessage);
- return FALSE;
- }
}
static void
client->connect_time = GST_TIMEVAL_TO_TIME (now);
if (*client->sock > 0) {
- /* check if its a multicast address */
- if (gst_udp_is_multicast (&client->theiraddr)) {
- GST_DEBUG_OBJECT (sink, "multicast address detected");
- if (sink->auto_multicast) {
- GST_DEBUG_OBJECT (sink, "joining multicast group");
- gst_udp_join_group (*(client->sock), &client->theiraddr, NULL);
- }
- } else {
- GST_DEBUG_OBJECT (sink, "normal address detected");
- }
+ gst_multiudpsink_configure_client (sink, client);
}
if (lock)