return g_task_propagate_pointer (G_TASK (res), error);
}
-struct turn_server_data
-{
- GstUri *uri;
- guint nice_stream_id;
-};
-
-static void
-turn_server_data_free (struct turn_server_data *data)
-{
- gst_uri_unref (data->uri);
-
- g_free (data);
-}
-
static void
-on_turn_server_resolved (GstWebRTCICE * ice, GAsyncResult * res,
- struct turn_server_data *user_data)
+_add_turn_server (GstWebRTCNice * ice, struct NiceStreamItem *item,
+ GstUri * turn_server)
{
- GList *addresses;
- GError *error = NULL;
- GstUri *turn_server = user_data->uri;
- gboolean ret;
+ GstWebRTCNice *nice = GST_WEBRTC_NICE (ice);
+ const gchar *host;
+ NiceRelayType relays[4] = { 0, };
gchar *user, *pass;
const gchar *userinfo, *transport, *scheme;
- NiceRelayType relays[4] = { 0, };
int i, relay_n = 0;
- gchar *ip = NULL;
- GstWebRTCNice *nice = GST_WEBRTC_NICE (ice);
- if (!(addresses = resolve_host_finish (nice, res, &error))) {
- GST_WARNING_OBJECT (ice, "failed to resolve turn address: %s",
- error->message);
- g_clear_error (&error);
+ host = gst_uri_get_host (turn_server);
+ if (!host) {
+ GST_ERROR_OBJECT (ice, "Turn server has no host");
return;
}
- /* XXX: only the first IP is used */
- ip = g_inet_address_to_string (addresses->data);
-
- /* Set the resolved IP as the host since that's what libnice wants */
- gst_uri_set_host (turn_server, ip);
-
scheme = gst_uri_get_scheme (turn_server);
transport = gst_uri_get_query_value (turn_server, "transport");
userinfo = gst_uri_get_userinfo (turn_server);
g_assert (relay_n < G_N_ELEMENTS (relays));
for (i = 0; i < relay_n; i++) {
- ret = nice_agent_set_relay_info (nice->priv->nice_agent,
- user_data->nice_stream_id, NICE_COMPONENT_TYPE_RTP,
- gst_uri_get_host (turn_server), gst_uri_get_port (turn_server),
- user, pass, relays[i]);
- if (!ret) {
- gchar *uri = gst_uri_to_string (turn_server);
- GST_ERROR_OBJECT (ice, "Failed to set TURN server '%s'", uri);
- g_free (uri);
- break;
+ if (!nice_agent_set_relay_info (nice->priv->nice_agent,
+ item->nice_stream_id, NICE_COMPONENT_TYPE_RTP,
+ gst_uri_get_host (turn_server), gst_uri_get_port (turn_server),
+ user, pass, relays[i])) {
+ gchar *uri_str = gst_uri_to_string (turn_server);
+ GST_ERROR_OBJECT (ice, "Could not set TURN server %s on libnice",
+ uri_str);
+ g_free (uri_str);
}
}
+
g_free (user);
g_free (pass);
- g_free (ip);
-}
-
-static void
-_add_turn_server (GstWebRTCNice * ice, struct NiceStreamItem *item,
- GstUri * turn_server)
-{
- struct turn_server_data *data;
- const gchar *host;
-
- host = gst_uri_get_host (turn_server);
- if (!host) {
- GST_ERROR_OBJECT (ice, "Turn server has no host");
- return;
- }
-
- data = g_new0 (struct turn_server_data, 1);
- data->nice_stream_id = item->nice_stream_id;
- data->uri = gst_uri_copy (turn_server);
-
- resolve_host_async (ice, host, (GAsyncReadyCallback) on_turn_server_resolved,
- data, (GDestroyNotify) turn_server_data_free);
}
typedef struct
}
static void
-on_stun_server_resolved (GstWebRTCNice * ice, GAsyncResult * res,
- gpointer user_data)
-{
- GList *addresses;
- GError *error = NULL;
- guint port = GPOINTER_TO_UINT (user_data);
- char *ip;
-
- if (!(addresses = resolve_host_finish (ice, res, &error))) {
- GST_WARNING_OBJECT (ice, "Failed to resolve stun server: %s",
- error->message);
- g_clear_error (&error);
- return;
- }
-
- /* XXX: only the first IP is used */
- ip = g_inet_address_to_string (addresses->data);
-
- g_object_set (ice->priv->nice_agent, "stun-server", ip,
- "stun-server-port", port, NULL);
-
- g_free (ip);
-}
-
-static void
_add_stun_server (GstWebRTCNice * ice, GstUri * stun_server)
{
const gchar *msg = "must be of the form stun://<host>:<port>";
gst_uri_set_port (stun_server, port);
}
- resolve_host_async (ice, host, (GAsyncReadyCallback) on_stun_server_resolved,
- GUINT_TO_POINTER (port), NULL);
+ g_object_set (ice->priv->nice_agent, "stun-server", host,
+ "stun-server-port", port, NULL);
out:
g_free (s);