static void nway_test (int in_count, extra_init extrainit) { int i, j; count = in_count; loop = g_main_loop_new (NULL, FALSE); dats = g_new0 (struct SimpleTestConference *, count); for (i = 0; i < count; i++) { gchar *tmp = g_strdup_printf ("tester%d@hostname", i); dats[i] = setup_simple_conference (i, "fsrtpconference", tmp); g_free (tmp); rtpconference_connect_signals (dats[i]); g_idle_add (_start_pipeline, dats[i]); setup_fakesrc (dats[i]); if (i != 0) g_signal_connect (dats[i]->session, "notify::codecs", G_CALLBACK (_negotiated_codecs_notify), dats[i]); } for (i = 0; i < count; i++) for (j = 0; j < count; j++) if (i != j) { struct SimpleTestStream *st = NULL; st = simple_conference_add_stream (dats[i], dats[j]); st->handoff_handler = G_CALLBACK (_handoff_handler); g_signal_connect (st->stream, "src-pad-added", G_CALLBACK (_src_pad_added), st); } for (i = 1; i < count; i++) { struct SimpleTestStream *st = find_pointback_stream (dats[i], dats[0]); set_initial_codecs (dats[0], st); } if (extrainit) extrainit (); g_main_loop_run (loop); for (i = 0; i < count; i++) gst_element_set_state (dats[i]->pipeline, GST_STATE_NULL); for (i = 0; i < count; i++) cleanup_simple_conference (dats[i]); g_free (dats); g_main_loop_unref (loop); }
static void _new_local_candidate (FsStream *stream, FsCandidate *candidate) { struct SimpleTestStream *st = g_object_get_data (G_OBJECT (stream), "SimpleTestStream"); gboolean ret; GError *error = NULL; struct SimpleTestStream *other_st = find_pointback_stream (st->target, st->dat); GList *candidates = NULL; g_debug ("%d:%d: Setting remote candidate for component %d", other_st->dat->id, other_st->target->id, candidate->component_id); candidates = g_list_prepend (NULL, candidate); ret = fs_stream_set_remote_candidates (other_st->stream, candidates, &error); g_list_free (candidates); if (error) ts_fail ("Error while adding candidate: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); ts_fail_unless (ret == TRUE, "No detailed error from add_remote_candidate"); }
static void _negotiated_codecs_notify (GObject *object, GParamSpec *paramspec, gpointer user_data) { struct SimpleTestConference *dat = user_data; FsSession *session = FS_SESSION (object); GList *codecs = NULL; GError *error = NULL; GList *item = NULL; g_debug ("%d: New negotiated codecs", dat->id); ts_fail_if (session != dat->session, "Got signal from the wrong object"); g_object_get (dat->session, "codecs", &codecs, NULL); ts_fail_if (codecs == NULL, "Could not get the negotiated codecs"); /* We have to find the stream from the target that points back to us */ for (item = g_list_first (dat->streams); item; item = g_list_next (item)) { struct SimpleTestStream *st = item->data; struct SimpleTestStream *st2 = find_pointback_stream (st->target, dat); GList *rcodecs2; g_debug ("Setting negotiated remote codecs on %d:%d from %d",st2->dat->id, st2->target->id, dat->id); if (!fs_stream_set_remote_codecs (st2->stream, codecs, &error)) { if (error) ts_fail ("Could not set the remote codecs on stream %d:%d (%d): %s", st2->dat->id, st2->target->id, error->code, error->message); else ts_fail ("Could not set the remote codecs on stream %d:%d" " and we DID not get a GError!!", st2->dat->id, st2->target->id); } g_object_get (st2->stream, "remote-codecs", &rcodecs2, NULL); ts_fail_unless (_compare_codec_lists (rcodecs2, codecs), "Can not get remote codecs correctly"); fs_codec_list_destroy (rcodecs2); if (select_last_codec) ts_fail_unless ( fs_session_set_send_codec (st2->dat->session, g_list_last (codecs)->data, &error), "Error setting the send codec to the last codec: %s", error ? error->message : "No GError"); g_clear_error (&error); break; } fs_codec_list_destroy (codecs); }
static void _new_local_candidate (FsStream *stream, FsCandidate *candidate) { struct SimpleTestStream *st = g_object_get_data (G_OBJECT (stream), "SimpleTestStream"); gboolean ret; GError *error = NULL; struct SimpleTestStream *other_st; GList *candidates = NULL; TEST_LOCK (); if (st->target == NULL) { TEST_UNLOCK (); return; } other_st = find_pointback_stream (st->target, st->dat); if (other_st->stream == NULL || (candidate->component_id == FS_COMPONENT_RTCP && no_rtcp)) { TEST_UNLOCK (); return; } st->got_candidates = TRUE; GST_DEBUG ("%d:%d: Setting remote candidate for component %d", other_st->dat->id, other_st->target->id, candidate->component_id); if (other_st->stream == NULL) { TEST_UNLOCK (); return; } candidates = g_list_prepend (NULL, candidate); ret = fs_stream_add_remote_candidates (other_st->stream, candidates, &error); if (ret == FALSE && error && error->domain == FS_ERROR && error->code == FS_ERROR_NOT_IMPLEMENTED) { g_clear_error (&error); ret = fs_stream_force_remote_candidates (other_st->stream, candidates, &error); } g_list_free (candidates); if (error) ts_fail ("Error while adding candidate: (%s:%d) %s", g_quark_to_string (error->domain), error->code, error->message); ts_fail_unless (ret == TRUE, "No detailed error from add_remote_candidate"); TEST_UNLOCK (); }
static void nway_test (int in_count, extra_conf_init extra_conf_init, extra_stream_init extra_stream_init, const gchar *transmitter, guint st_param_count, GParameter *st_params) { int i, j; GParameter *params = NULL; if (!strcmp ("rawudp", transmitter)) { params = g_new0 (GParameter, st_param_count+2); memcpy (params, st_params, st_param_count * sizeof (GParameter)); params[st_param_count].name = "upnp-discovery"; g_value_init (¶ms[st_param_count].value, G_TYPE_BOOLEAN); g_value_set_boolean (¶ms[st_param_count].value, FALSE); params[st_param_count+1].name = "upnp-mapping"; g_value_init (¶ms[st_param_count+1].value, G_TYPE_BOOLEAN); g_value_set_boolean (¶ms[st_param_count+1].value, FALSE); st_param_count += 2; st_params = params; } count = in_count; loop = g_main_loop_new (NULL, FALSE); dats = g_new0 (struct SimpleTestConference *, count); for (i = 0; i < count; i++) { gchar *tmp = g_strdup_printf ("tester%d@hostname", i); dats[i] = setup_simple_conference (i, "fsrtpconference", tmp); g_free (tmp); g_object_set (G_OBJECT (dats[i]->session), "no-rtcp-timeout", -1, NULL); if (extra_conf_init) extra_conf_init (dats[i], i); rtpconference_connect_signals (dats[i]); g_idle_add (_start_pipeline, dats[i]); setup_fakesrc (dats[i]); if (i != 0) g_signal_connect (dats[i]->session, "notify::codecs", G_CALLBACK (_negotiated_codecs_notify), dats[i]); } TEST_LOCK (); for (i = 0; i < count; i++) for (j = 0; j < count; j++) if (i != j) { struct SimpleTestStream *st = NULL; st = simple_conference_add_stream (dats[i], dats[j], transmitter, st_param_count, st_params); st->handoff_handler = G_CALLBACK (_handoff_handler); g_signal_connect (st->stream, "src-pad-added", G_CALLBACK (_src_pad_added), st); if (extra_stream_init) extra_stream_init (st, i, j); } for (i = 1; i < count; i++) { struct SimpleTestStream *st = find_pointback_stream (dats[i], dats[0]); set_initial_codecs (dats[0], st); } TEST_UNLOCK (); g_main_loop_run (loop); for (i = 0; i < count; i++) gst_element_set_state (dats[i]->pipeline, GST_STATE_NULL); for (i = 0; i < count; i++) cleanup_simple_conference (dats[i]); g_free (dats); g_main_loop_unref (loop); g_free (params); }