static void caps_changed (GstPad *pad, GParamSpec *spec, FsStream *stream) { GstCaps *caps; GstStructure *s; FsCodec *codec; GList *codecs; const gchar *config; GError *error = NULL; g_object_get (pad, "caps", &caps, NULL); if (!caps) return; s = gst_caps_get_structure (caps, 0); codec = fs_codec_new (96, "THEORA", FS_MEDIA_TYPE_VIDEO, 90000); config = gst_structure_get_string (s, "configuration"); if (config) fs_codec_add_optional_parameter (codec, "configuration", config); codecs = g_list_prepend (NULL, codec); fail_unless (fs_stream_set_remote_codecs (stream, codecs, &error), "Unable to set remote codec: %s", error ? error->message : "UNKNOWN"); fs_codec_list_destroy (codecs); }
static void set_initial_codecs ( struct SimpleTestConference *from, struct SimpleTestStream *to) { GList *codecs = NULL; GList *filtered_codecs = NULL; GList *item = NULL; GList *rcodecs2 = NULL; GError *error = NULL; g_object_get (from->session, "codecs", &codecs, NULL); ts_fail_if (codecs == NULL, "Could not get the codecs"); for (item = g_list_first (codecs); item; item = g_list_next (item)) { FsCodec *codec = item->data; if (codec->id == 0 || codec->id == 8) filtered_codecs = g_list_append (filtered_codecs, codec); } ts_fail_if (filtered_codecs == NULL, "PCMA and PCMU are not in the codecs" " you must install gst-plugins-good"); g_debug ("Setting initial remote codecs on %d:%d from %d", to->dat->id, to->target->id, from->id); if (!fs_stream_set_remote_codecs (to->stream, filtered_codecs, &error)) { if (error) ts_fail ("Could not set the remote codecs on stream %d:%d (%d): %s", to->dat->id, to->target->id, error->code, error->message); else ts_fail ("Could not set the remote codecs on stream %d" " and we DID not get a GError!!", to->target->id); } g_object_get (to->stream, "remote-codecs", &rcodecs2, NULL); ts_fail_unless (_compare_codec_lists (rcodecs2, filtered_codecs), "Can not get remote codecs correctly"); fs_codec_list_destroy (rcodecs2); if (select_last_codec) ts_fail_unless ( fs_session_set_send_codec (to->dat->session, g_list_last (filtered_codecs)->data, &error), "Error setting the send codec to the last codec: %s", error ? error->message : "No GError"); g_clear_error (&error); g_list_free (filtered_codecs); fs_codec_list_destroy (codecs); }
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 set_codecs (struct SimpleTestConference *dat, FsStream *stream) { GList *codecs = NULL; GList *filtered_codecs = NULL; GList *item = NULL; GError *error = NULL; FsCodec *dtmf_codec = NULL; g_object_get (dat->session, "codecs", &codecs, NULL); ts_fail_if (codecs == NULL, "Could not get the local codecs"); for (item = g_list_first (codecs); item; item = g_list_next (item)) { FsCodec *codec = item->data; if (codec->id == 0 || codec->id == 8) { filtered_codecs = g_list_append (filtered_codecs, codec); } else if (codec->clock_rate == 8000 && !g_ascii_strcasecmp (codec->encoding_name, "telephone-event")) { ts_fail_unless (dtmf_codec == NULL, "More than one copy of telephone-event"); dtmf_codec = codec; filtered_codecs = g_list_append (filtered_codecs, codec); } } ts_fail_if (filtered_codecs == NULL, "PCMA and PCMU are not in the codecs" " you must install gst-plugins-good"); ts_fail_unless (dtmf_codec != NULL); dtmf_codec->id = dtmf_id; if (!fs_stream_set_remote_codecs (stream, filtered_codecs, &error)) { if (error) ts_fail ("Could not set the remote codecs on stream (%d): %s", error->code, error->message); else ts_fail ("Could not set the remote codecs on stream" " and we did NOT get a GError!!"); } g_list_free (filtered_codecs); fs_codec_list_destroy (codecs); }
static TestSession* add_audio_session (GstElement *pipeline, FsConference *conf, guint id, FsParticipant *part, gchar *send_socket, gchar *recv_socket) { TestSession *ses = g_slice_new0 (TestSession); GError *error = NULL; GstPad *pad = NULL, *pad2 = NULL; GstElement *src = NULL; GList *cands = NULL; GParameter param = {0}; gboolean res; FsCandidate *cand; GList *codecs = NULL; ses->send_socket = send_socket; ses->recv_socket = recv_socket; ses->session = fs_conference_new_session (conf, FS_MEDIA_TYPE_AUDIO, &error); print_error (error); g_assert (ses->session); g_object_get (ses->session, "sink-pad", &pad, NULL); if (g_getenv ("AUDIOSRC")) src = gst_parse_bin_from_description (g_getenv ("AUDIOSRC"), TRUE, &error); else src = gst_parse_bin_from_description (DEFAULT_AUDIOSRC, TRUE, &error); print_error (error); g_assert (src); g_assert (gst_bin_add (GST_BIN (pipeline), src)); pad2 = gst_element_get_static_pad (src, "src"); g_assert (pad2); g_assert (GST_PAD_LINK_SUCCESSFUL (gst_pad_link (pad2, pad))); gst_object_unref (pad2); gst_object_unref (pad); ses->stream = fs_session_new_stream (ses->session, part, FS_DIRECTION_BOTH, &error); print_error (error); g_assert (ses->stream); cand = fs_candidate_new ("", FS_COMPONENT_RTP, FS_CANDIDATE_TYPE_HOST, FS_NETWORK_PROTOCOL_UDP, send_socket, 0); cands = g_list_prepend (NULL, cand); param.name = "preferred-local-candidates"; g_value_init (¶m.value, FS_TYPE_CANDIDATE_LIST); g_value_take_boxed (¶m.value, cands); res = fs_stream_set_transmitter (ses->stream, "shm", ¶m, 1, &error); print_error (error); g_value_unset (¶m.value); g_signal_connect (ses->stream, "src-pad-added", G_CALLBACK (src_pad_added_cb), pipeline); codecs = g_list_prepend (NULL, fs_codec_new (FS_CODEC_ID_ANY, "PCMA", FS_MEDIA_TYPE_AUDIO, 0)); codecs = g_list_prepend (codecs, fs_codec_new (FS_CODEC_ID_ANY, "PCMU", FS_MEDIA_TYPE_AUDIO, 0)); res = fs_session_set_codec_preferences (ses->session, codecs, &error); print_error (error); fs_codec_list_destroy (codecs); g_object_get (ses->session, "codecs-without-config", &codecs, NULL); res = fs_stream_set_remote_codecs (ses->stream, codecs, &error); print_error (error); g_assert (res); return ses; }