# # old_revision [c5b3879b829a5067b2189e4393ca3b80f6fd96c3] # # patch "COPYRIGHT" # from [ac32c81db327a1c5a9d1e57c06ed3ca5337b374f] # to [8fdcebf3bcde1d3e484b4fbebc144e37719a4b65] # # patch "configure.ac" # from [b5155d791d3bfc938939d529453e5b327c518dea] # to [2a9cd757a9f1a8ab095ffe87be3c2d71cb193632] # # patch "libpurple/Makefile.am" # from [98a11dd7e6b174ca919fa4734c900904af94e91b] # to [3d58790ace97b844146ebf7492a0ed705c209788] # # patch "libpurple/media/backend-fs2.c" # from [14baabde9d85c5db0c5b002a41707439a1afd834] # to [40cd232d21c4a803fd38727fb2bdf7420433418f] # # patch "libpurple/media.c" # from [b6d7130f18c1bd96f12516b0eb35344457c5b447] # to [1934c80d30a14fa9f719fc5f71caea49fb54d69d] # # patch "libpurple/mediamanager.c" # from [1e55c322fe59eb10d19628c4c44757ea404ba23b] # to [0a57c7b39ee3f9a34bbb11a5722ecc7e3c70dbdd] # ============================================================ --- COPYRIGHT ac32c81db327a1c5a9d1e57c06ed3ca5337b374f +++ COPYRIGHT 8fdcebf3bcde1d3e484b4fbebc144e37719a4b65 @@ -128,6 +128,7 @@ Jeramey Crawford Adam Cowell Palmer Cox Jeramey Crawford +Olivier Crete Michael Culbertson Steven Danna Simon Danner ============================================================ --- configure.ac b5155d791d3bfc938939d529453e5b327c518dea +++ configure.ac 2a9cd757a9f1a8ab095ffe87be3c2d71cb193632 @@ -786,20 +786,26 @@ dnl #################################### fi dnl ####################################################################### -dnl # Check for Farsight +dnl # Check for Farstream dnl ####################################################################### -AC_ARG_ENABLE(farsight, - [AC_HELP_STRING([--disable-farsight], [compile without farsight support])], - enable_farsight="$enableval", enable_farsight="yes") -if test "x$enable_farsight" != "xno"; then - PKG_CHECK_MODULES(FARSIGHT, [farsight2-0.10 >= 0.0.9], [ - AC_DEFINE(USE_FARSIGHT, 1, [Use Farsight for voice and video]) - AC_SUBST(FARSIGHT_CFLAGS) - AC_SUBST(FARSIGHT_LIBS) - ], [ - enable_farsight="no" - ]) -fi +AC_ARG_ENABLE(farstream, + [AC_HELP_STRING([--disable-farstream], [compile without farstream support])], + enable_farstream="$enableval", enable_farstream="yes") +if test "x$enable_farstream" != "xno"; then + PKG_CHECK_MODULES(FARSTREAM, [farstream-0.1], [ + AC_SUBST(FARSTREAM_CFLAGS) + AC_SUBST(FARSTREAM_LIBS) + ], [ + # Try farsight. + PKG_CHECK_MODULES(FARSTREAM, [farsight2-0.10 >= 0.0.9], [ + AC_DEFINE(HAVE_FARSIGHT, 1, [Use Farsight instead of Farstream]) + AC_SUBST(FARSTREAM_CFLAGS) + AC_SUBST(FARSTREAM_LIBS) + ], [ + enable_farstream="no" + ]) + ]) + fi dnl ####################################################################### dnl # Check for Voice and Video support @@ -808,20 +814,20 @@ if test "x$enable_vv" != "xno"; then [AC_HELP_STRING([--disable-vv], [compile without voice and video support])], enable_vv="$enableval", enable_vv="yes") if test "x$enable_vv" != "xno"; then - if test "x$enable_gstreamer" != "xno" -a "x$enable_gstinterfaces" != "xno" -a "x$enable_farsight" != "xno"; then + if test "x$enable_gstreamer" != "xno" -a "x$enable_gstinterfaces" != "xno" -a "x$enable_farstream" != "xno"; then AC_DEFINE(USE_VV, 1, [Use voice and video]) else enable_vv="no" if test "x$force_deps" = "xyes"; then AC_MSG_ERROR([ Dependencies for voice/video were not met. -Install the necessary gstreamer and farsight packages first. +Install the necessary gstreamer and farstream packages first. Or use --disable-vv if you do not need voice/video support. ]) fi fi fi -AM_CONDITIONAL(USE_VV, test "x$enable_gstreamer" != "xno" -a "x$enable_gstinterfaces" != "xno" -a "x$enable_farsight" != "xno") +AM_CONDITIONAL(USE_VV, test "x$enable_gstreamer" != "xno" -a "x$enable_gstinterfaces" != "xno" -a "x$enable_farstream" != "xno") dnl ####################################################################### dnl # Check for Internationalized Domain Name support ============================================================ --- libpurple/Makefile.am 98a11dd7e6b174ca919fa4734c900904af94e91b +++ libpurple/Makefile.am 3d58790ace97b844146ebf7492a0ed705c209788 @@ -306,7 +306,7 @@ libpurple_la_LIBADD = \ $(LIBXML_LIBS) \ $(NETWORKMANAGER_LIBS) \ $(INTLLIBS) \ - $(FARSIGHT_LIBS) \ + $(FARSTREAM_LIBS) \ $(GSTREAMER_LIBS) \ $(GSTINTERFACES_LIBS) \ $(IDN_LIBS) \ @@ -322,7 +322,7 @@ AM_CPPFLAGS = \ $(DEBUG_CFLAGS) \ $(DBUS_CFLAGS) \ $(LIBXML_CFLAGS) \ - $(FARSIGHT_CFLAGS) \ + $(FARSTREAM_CFLAGS) \ $(GSTREAMER_CFLAGS) \ $(GSTINTERFACES_CFLAGS) \ $(IDN_CFLAGS) \ ============================================================ --- libpurple/media/backend-fs2.c 14baabde9d85c5db0c5b002a41707439a1afd834 +++ libpurple/media/backend-fs2.c 40cd232d21c4a803fd38727fb2bdf7420433418f @@ -1,5 +1,5 @@ /** - * @file backend-fs2.c Farsight 2 backend for media API + * @file backend-fs2.c Farstream backend for media API * @ingroup core */ @@ -34,8 +34,14 @@ #include "network.h" #include "media-gst.h" +#ifdef HAVE_FARSIGHT #include #include +#else +#include +#include +#include +#endif /** @copydoc _PurpleMediaBackendFs2Class */ typedef struct _PurpleMediaBackendFs2Class PurpleMediaBackendFs2Class; @@ -112,6 +118,10 @@ struct _PurpleMediaBackendFs2Stream gchar *participant; FsStream *stream; +#ifndef HAVE_FARSIGHT + gboolean supports_add; +#endif + GstElement *src; GstElement *tee; GstElement *volume; @@ -147,6 +157,10 @@ struct _PurpleMediaBackendFs2Private FsConference *conference; gchar *conference_type; +#ifndef HAVE_FARSIGHT + FsElementAddedNotifier *notifier; +#endif + GHashTable *sessions; GHashTable *participants; @@ -212,6 +226,13 @@ purple_media_backend_fs2_dispose(GObject purple_debug_info("backend-fs2", "purple_media_backend_fs2_dispose\n"); +#ifndef HAVE_FARSIGHT + if (priv->notifier) { + g_object_unref(priv->notifier); + priv->notifier = NULL; + } +#endif + if (priv->confbin) { GstElement *pipeline; @@ -846,7 +867,11 @@ gst_handle_message_element(GstBus *bus, priv->conference != FS_CONFERENCE(src)) return; +#ifdef HAVE_FARSIGHT if (gst_structure_has_name(msg->structure, "farsight-error")) { +#else + if (gst_structure_has_name(msg->structure, "farstream-error")) { +#endif FsError error_no; gst_structure_get_enum(msg->structure, "error-no", FS_TYPE_ERROR, (gint*)&error_no); @@ -859,6 +884,7 @@ gst_handle_message_element(GstBus *bus, " packages.")); purple_media_end(priv->media, NULL, NULL); break; +#ifdef HAVE_FARSIGHT case FS_ERROR_NO_CODECS_LEFT: purple_media_error(priv->media, _("No codecs" " left. Your codec" @@ -868,28 +894,42 @@ gst_handle_message_element(GstBus *bus, purple_media_end(priv->media, NULL, NULL); break; case FS_ERROR_UNKNOWN_CNAME: - /* - * Unknown CName is only a problem for the - * multicast transmitter which isn't used. - * It is also deprecated. - */ + /* + * Unknown CName is only a problem for the + * multicast transmitter which isn't used. + * It is also deprecated. + */ break; +#endif default: purple_debug_error("backend-fs2", +#ifdef HAVE_FARSIGHT "farsight-error: %i: %s\n", +#else + "farstream-error: %i: %s\n", +#endif error_no, - gst_structure_get_string( + gst_structure_get_string( msg->structure, "error-msg")); break; } if (FS_ERROR_IS_FATAL(error_no)) { +#ifdef HAVE_FARSIGHT purple_media_error(priv->media, _("A non-recoverable " "Farsight2 error has occurred.")); +#else + purple_media_error(priv->media, _("A non-recoverable " + "Farstream error has occurred.")); +#endif purple_media_end(priv->media, NULL, NULL); } } else if (gst_structure_has_name(msg->structure, +#ifdef HAVE_FARSIGHT "farsight-new-local-candidate")) { +#else + "farstream-new-local-candidate")) { +#endif const GValue *value; FsStream *stream; FsCandidate *local_candidate; @@ -924,7 +964,11 @@ gst_handle_message_element(GstBus *bus, session->id, name, candidate); g_object_unref(candidate); } else if (gst_structure_has_name(msg->structure, +#ifdef HAVE_FARSIGHT "farsight-local-candidates-prepared")) { +#else + "farstream-local-candidates-prepared")) { +#endif const GValue *value; FsStream *stream; FsParticipant *participant; @@ -942,7 +986,11 @@ gst_handle_message_element(GstBus *bus, g_signal_emit_by_name(self, "candidates-prepared", session->id, name); } else if (gst_structure_has_name(msg->structure, +#ifdef HAVE_FARSIGHT "farsight-new-active-candidate-pair")) { +#else + "farstream-new-active-candidate-pair")) { +#endif const GValue *value; FsStream *stream; FsCandidate *local_candidate; @@ -976,7 +1024,11 @@ gst_handle_message_element(GstBus *bus, g_object_unref(lcandidate); g_object_unref(rcandidate); } else if (gst_structure_has_name(msg->structure, +#ifdef HAVE_FARSIGHT "farsight-recv-codecs-changed")) { +#else + "farstream-recv-codecs-changed")) { +#endif const GValue *value; GList *codecs; FsCodec *codec; @@ -986,10 +1038,18 @@ gst_handle_message_element(GstBus *bus, codec = codecs->data; purple_debug_info("backend-fs2", +#ifdef HAVE_FARSIGHT "farsight-recv-codecs-changed: %s\n", +#else + "farstream-recv-codecs-changed: %s\n", +#endif codec->encoding_name); } else if (gst_structure_has_name(msg->structure, +#ifdef HAVE_FARSIGHT "farsight-component-state-changed")) { +#else + "farstream-component-state-changed")) { +#endif const GValue *value; FsStreamState fsstate; guint component; @@ -1025,11 +1085,19 @@ gst_handle_message_element(GstBus *bus, } purple_debug_info("backend-fs2", +#ifdef HAVE_FARSIGHT "farsight-component-state-changed: " +#else + "farstream-component-state-changed: " +#endif "component: %u state: %s\n", component, state); } else if (gst_structure_has_name(msg->structure, +#ifdef HAVE_FARSIGHT "farsight-send-codec-changed")) { +#else + "farstream-send-codec-changed")) { +#endif const GValue *value; FsCodec *codec; gchar *codec_str; @@ -1039,12 +1107,20 @@ gst_handle_message_element(GstBus *bus, codec_str = fs_codec_to_string(codec); purple_debug_info("backend-fs2", +#ifdef HAVE_FARSIGHT "farsight-send-codec-changed: codec: %s\n", +#else + "farstream-send-codec-changed: codec: %s\n", +#endif codec_str); g_free(codec_str); } else if (gst_structure_has_name(msg->structure, +#ifdef HAVE_FARSIGHT "farsight-codecs-changed")) { +#else + "farstream-codecs-changed")) { +#endif const GValue *value; FsSession *fssession; GList *sessions; @@ -1220,8 +1296,17 @@ stream_info_cb(PurpleMedia *media, Purpl purple_media_is_initiator(media, sid, name)) return; +#ifdef HAVE_FARSIGHT fs_stream_set_remote_candidates(stream->stream, stream->remote_candidates, &err); +#else + if (stream->supports_add) + fs_stream_add_remote_candidates(stream->stream, + stream->remote_candidates, &err); + else + fs_stream_force_remote_candidates(stream->stream, + stream->remote_candidates, &err); +#endif if (err == NULL) return; @@ -1301,6 +1386,9 @@ init_conference(PurpleMediaBackendFs2 *s GstElement *pipeline; GstBus *bus; gchar *name; +#ifndef HAVE_FARSIGHT + GKeyFile *default_props; +#endif priv->conference = FS_CONFERENCE( gst_element_factory_make(priv->conference_type, NULL)); @@ -1343,6 +1431,16 @@ init_conference(PurpleMediaBackendFs2 *s return FALSE; } +#ifndef HAVE_FARSIGHT + default_props = fs_utils_get_default_element_properties(GST_ELEMENT(priv->conference)); + if (default_props != NULL) { + priv->notifier = fs_element_added_notifier_new(); + fs_element_added_notifier_add(priv->notifier, + GST_BIN(priv->confbin)); + fs_element_added_notifier_set_properties_from_keyfile(priv->notifier, default_props); + } +#endif + g_signal_connect(G_OBJECT(bus), "message", G_CALLBACK(gst_bus_cb), self); gst_object_unref(bus); @@ -1559,7 +1657,11 @@ create_session(PurpleMediaBackendFs2 *se * receiving the src-pad-added signal. * Only works for non-multicast FsRtpSessions. */ +#ifdef HAVE_FARSIGHT if (is_nice || !strcmp(transmitter, "rawudp")) +#else + if (!!strcmp(transmitter, "multicast")) +#endif g_object_set(G_OBJECT(session->session), "no-rtcp-timeout", 0, NULL); @@ -1612,7 +1714,11 @@ create_participant(PurpleMediaBackendFs2 GError *err = NULL; participant = fs_conference_new_participant( +#ifdef HAVE_FARSIGHT priv->conference, name, &err); +#else + priv->conference, &err); +#endif if (err) { purple_debug_error("backend-fs2", @@ -1622,6 +1728,13 @@ create_participant(PurpleMediaBackendFs2 return FALSE; } +#ifndef HAVE_FARSIGHT + if (g_object_class_find_property(G_OBJECT_GET_CLASS(participant), + "cname")) { + g_object_set(participant, "cname", name, NULL); + } +#endif + if (!priv->participants) { purple_debug_info("backend-fs2", "Creating hash table for participants\n"); @@ -1739,7 +1852,7 @@ append_relay_info(GValueArray *relay_inf "port", G_TYPE_UINT, port, "username", G_TYPE_STRING, username, "password", G_TYPE_STRING, password, - "relay-type", G_TYPE_STRING, type, + "relay-type", G_TYPE_STRING, type, NULL); if (turn_setup) { @@ -1767,7 +1880,7 @@ create_stream(PurpleMediaBackendFs2 *sel const gchar *stun_ip = purple_network_get_stun_ip(); const gchar *turn_ip = purple_network_get_turn_ip(); guint _num_params = num_params; - GParameter *_params = g_new0(GParameter, num_params + 3); + GParameter *_params; FsStreamDirection type_direction = session_type_to_fs_stream_direction(type); PurpleMediaBackendFs2Session *session; @@ -1779,6 +1892,41 @@ create_stream(PurpleMediaBackendFs2 *sel gboolean got_turn_from_prpl = FALSE; int i; + session = get_session(self, sess_id); + + if (session == NULL) { + purple_debug_error("backend-fs2", + "Couldn't find session to create stream.\n"); + return FALSE; + } + + participant = get_participant(self, who); + + if (participant == NULL) { + purple_debug_error("backend-fs2", "Couldn't find " + "participant to create stream.\n"); + return FALSE; + } + +#ifndef HAVE_FARSIGHT + fsstream = fs_session_new_stream(session->session, participant, + initiator == TRUE ? type_direction : + (type_direction & FS_DIRECTION_RECV), &err); + + if (fsstream == NULL) { + if (err) { + purple_debug_error("backend-fs2", + "Error creating stream: %s\n", + err && err->message ? + err->message : "NULL"); + g_error_free(err); + } else + purple_debug_error("backend-fs2", + "Error creating stream\n"); + return FALSE; + } +#endif + for (i = 0 ; i < num_params ; i++) { if (purple_strequal(params[i].name, "relay-info")) { got_turn_from_prpl = TRUE; @@ -1786,6 +1934,7 @@ create_stream(PurpleMediaBackendFs2 *sel } } + _params = g_new0(GParameter, num_params + 3); memcpy(_params, params, sizeof(GParameter) * num_params); /* set the controlling mode parameter */ @@ -1840,22 +1989,7 @@ create_stream(PurpleMediaBackendFs2 *sel _num_params++; } - session = get_session(self, sess_id); - - if (session == NULL) { - purple_debug_error("backend-fs2", - "Couldn't find session to create stream.\n"); - return FALSE; - } - - participant = get_participant(self, who); - - if (participant == NULL) { - purple_debug_error("backend-fs2", "Couldn't find " - "participant to create stream.\n"); - return FALSE; - } - +#ifdef HAVE_FARSIGHT fsstream = fs_session_new_stream(session->session, participant, initiator == TRUE ? type_direction : (type_direction & FS_DIRECTION_RECV), transmitter, @@ -1874,11 +2008,26 @@ create_stream(PurpleMediaBackendFs2 *sel "Error creating stream\n"); return FALSE; } +#else + if (!fs_stream_set_transmitter(fsstream, transmitter, + _params, _num_params, &err)) { + purple_debug_error("backend-fs2", + "Could not set transmitter %s: %s.\n", + transmitter, err->message); + g_clear_error(&err); + g_free(_params); + return FALSE; + } + g_free(_params); +#endif stream = g_new0(PurpleMediaBackendFs2Stream, 1); stream->participant = g_strdup(who); stream->session = session; stream->stream = fsstream; +#ifndef HAVE_FARSTREAM + stream->supports_add = !strcmp(transmitter, "nice"); +#endif priv->streams = g_list_append(priv->streams, stream); @@ -1991,8 +2140,17 @@ purple_media_backend_fs2_add_remote_cand if (purple_media_is_initiator(priv->media, sess_id, participant) || purple_media_accepted( priv->media, sess_id, participant)) { +#ifdef HAVE_FARSIGHT fs_stream_set_remote_candidates(stream->stream, stream->remote_candidates, &err); +#else + if (stream->supports_add) + fs_stream_add_remote_candidates(stream->stream, + stream->remote_candidates, &err); + else + fs_stream_force_remote_candidates(stream->stream, + stream->remote_candidates, &err); +#endif if (err) { purple_debug_error("backend-fs2", "Error adding remote" @@ -2021,25 +2179,50 @@ purple_media_backend_fs2_codecs_ready(Pu return FALSE; if (session->type & (PURPLE_MEDIA_SEND_AUDIO | - PURPLE_MEDIA_SEND_VIDEO)) + PURPLE_MEDIA_SEND_VIDEO)) { +#ifdef HAVE_FARSIGHT g_object_get(session->session, - "codecs-ready", &ret, NULL); - else + "codecs-ready", &ret, NULL); +#else + GList *codecs = NULL; + + g_object_get(session->session, + "codecs", &codecs, NULL); + if (codecs) { + fs_codec_list_destroy (codecs); + ret = TRUE; + } +#endif + } else ret = TRUE; } else { GList *values = g_hash_table_get_values(priv->sessions); for (; values; values = g_list_delete_link(values, values)) { PurpleMediaBackendFs2Session *session = values->data; + if (session->type & (PURPLE_MEDIA_SEND_AUDIO | - PURPLE_MEDIA_SEND_VIDEO)) + PURPLE_MEDIA_SEND_VIDEO)) { +#ifdef HAVE_FARSIGHT g_object_get(session->session, "codecs-ready", &ret, NULL); - else + if (ret == FALSE) + break; +#else + GList *codecs = NULL; + + g_object_get(session->session, + "codecs", &codecs, NULL); + if (codecs) { + fs_codec_list_destroy (codecs); + ret = TRUE; + } else { + ret = FALSE; + break; + } +#endif + } else ret = TRUE; - - if (ret == FALSE) - break; } if (values != NULL) ============================================================ --- libpurple/media.c b6d7130f18c1bd96f12516b0eb35344457c5b447 +++ libpurple/media.c 1934c80d30a14fa9f719fc5f71caea49fb54d69d @@ -1067,7 +1067,6 @@ purple_media_add_stream(PurpleMedia *med { #ifdef USE_VV PurpleMediaSession *session; - PurpleMediaStream *stream = NULL; g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE); @@ -1103,7 +1102,7 @@ purple_media_add_stream(PurpleMedia *med } if (purple_media_get_stream(media, sess_id, who) == NULL) { - stream = purple_media_insert_stream(session, who, initiator); + purple_media_insert_stream(session, who, initiator); g_signal_emit(media, purple_media_signals[STATE_CHANGED], 0, PURPLE_MEDIA_STATE_NEW, ============================================================ --- libpurple/mediamanager.c 1e55c322fe59eb10d19628c4c44757ea404ba23b +++ libpurple/mediamanager.c 0a57c7b39ee3f9a34bbb11a5722ecc7e3c70dbdd @@ -39,7 +39,11 @@ #ifdef USE_VV #include +#ifdef HAVE_FARSIGHT #include +#else +#include +#endif #include /** @copydoc _PurpleMediaManagerPrivate */