37
37
#include <farstream/fs-conference.h>
38
38
#include <farstream/fs-element-added-notifier.h>
39
#include <farstream/fs-utils.h>
40
41
/** @copydoc _PurpleMediaBackendFs2Class */
41
42
typedef struct _PurpleMediaBackendFs2Class PurpleMediaBackendFs2Class;
846
856
priv->conference != FS_CONFERENCE(src))
849
if (gst_structure_has_name(msg->structure, "farsight-error")) {
859
if (gst_structure_has_name(msg->structure, "farstream-error")) {
850
860
FsError error_no;
851
861
gst_structure_get_enum(msg->structure, "error-no",
852
862
FS_TYPE_ERROR, (gint*)&error_no);
860
870
purple_media_end(priv->media, NULL, NULL);
862
case FS_ERROR_NO_CODECS_LEFT:
863
purple_media_error(priv->media, _("No codecs"
866
" fs-codecs.conf are too"
868
purple_media_end(priv->media, NULL, NULL);
871
873
purple_debug_error("backend-fs2",
872
"farsight-error: %i: %s\n",
874
"farstream-error: %i: %s\n",
874
876
gst_structure_get_string(
875
877
msg->structure, "error-msg"));
879
881
if (FS_ERROR_IS_FATAL(error_no)) {
880
882
purple_media_error(priv->media, _("A non-recoverable "
881
"Farsight2 error has occurred."));
883
"Farstream error has occurred."));
882
884
purple_media_end(priv->media, NULL, NULL);
884
886
} else if (gst_structure_has_name(msg->structure,
885
"farsight-new-local-candidate")) {
887
"farstream-new-local-candidate")) {
886
888
const GValue *value;
887
889
FsStream *stream;
888
890
FsCandidate *local_candidate;
917
919
session->id, name, candidate);
918
920
g_object_unref(candidate);
919
921
} else if (gst_structure_has_name(msg->structure,
920
"farsight-local-candidates-prepared")) {
922
"farstream-local-candidates-prepared")) {
921
923
const GValue *value;
922
924
FsStream *stream;
923
925
FsParticipant *participant;
935
937
g_signal_emit_by_name(self, "candidates-prepared",
936
938
session->id, name);
937
939
} else if (gst_structure_has_name(msg->structure,
938
"farsight-new-active-candidate-pair")) {
940
"farstream-new-active-candidate-pair")) {
939
941
const GValue *value;
940
942
FsStream *stream;
941
943
FsCandidate *local_candidate;
969
971
g_object_unref(lcandidate);
970
972
g_object_unref(rcandidate);
971
973
} else if (gst_structure_has_name(msg->structure,
972
"farsight-recv-codecs-changed")) {
974
"farstream-recv-codecs-changed")) {
973
975
const GValue *value;
979
981
codec = codecs->data;
981
983
purple_debug_info("backend-fs2",
982
"farsight-recv-codecs-changed: %s\n",
984
"farstream-recv-codecs-changed: %s\n",
983
985
codec->encoding_name);
984
986
} else if (gst_structure_has_name(msg->structure,
985
"farsight-component-state-changed")) {
987
"farstream-component-state-changed")) {
986
988
const GValue *value;
987
989
FsStreamState fsstate;
1020
1022
purple_debug_info("backend-fs2",
1021
"farsight-component-state-changed: "
1023
"farstream-component-state-changed: "
1022
1024
"component: %u state: %s\n",
1023
1025
component, state);
1024
1026
} else if (gst_structure_has_name(msg->structure,
1025
"farsight-send-codec-changed")) {
1027
"farstream-send-codec-changed")) {
1026
1028
const GValue *value;
1027
1029
FsCodec *codec;
1028
1030
gchar *codec_str;
1032
1034
codec_str = fs_codec_to_string(codec);
1034
1036
purple_debug_info("backend-fs2",
1035
"farsight-send-codec-changed: codec: %s\n",
1037
"farstream-send-codec-changed: codec: %s\n",
1038
1040
g_free(codec_str);
1039
1041
} else if (gst_structure_has_name(msg->structure,
1040
"farsight-codecs-changed")) {
1042
"farstream-codecs-changed")) {
1041
1043
const GValue *value;
1042
1044
FsSession *fssession;
1043
1045
GList *sessions;
1213
1215
purple_media_is_initiator(media, sid, name))
1216
fs_stream_add_remote_candidates(stream->stream,
1217
stream->remote_candidates, &err);
1218
if (stream->supports_add)
1219
fs_stream_add_remote_candidates(stream->stream,
1220
stream->remote_candidates, &err);
1222
fs_stream_force_remote_candidates(stream->stream,
1223
stream->remote_candidates, &err);
1219
1225
if (err == NULL)
1346
default_props = fs_utils_get_default_element_properties(GST_ELEMENT(priv->conference));
1347
if (default_props != NULL) {
1348
priv->notifier = fs_element_added_notifier_new();
1349
fs_element_added_notifier_add(priv->notifier,
1350
GST_BIN(priv->confbin));
1351
fs_element_added_notifier_set_properties_from_keyfile(priv->notifier, default_props);
1339
1354
g_signal_connect(G_OBJECT(bus), "message",
1340
1355
G_CALLBACK(gst_bus_cb), self);
1341
1356
gst_object_unref(bus);
1552
1567
* receiving the src-pad-added signal.
1553
1568
* Only works for non-multicast FsRtpSessions.
1555
if (is_nice || !strcmp(transmitter, "rawudp"))
1570
if (!!strcmp(transmitter, "multicast"))
1556
1571
g_object_set(G_OBJECT(session->session),
1557
1572
"no-rtcp-timeout", 0, NULL);
1633
if (g_object_class_find_property(G_OBJECT_GET_CLASS(participant),
1635
g_object_set(participant, "cname", name, NULL);
1618
1639
if (!priv->participants) {
1619
1640
purple_debug_info("backend-fs2",
1620
1641
"Creating hash table for participants\n");
1804
session = get_session(self, sess_id);
1806
if (session == NULL) {
1807
purple_debug_error("backend-fs2",
1808
"Couldn't find session to create stream.\n");
1812
participant = get_participant(self, who);
1814
if (participant == NULL) {
1815
purple_debug_error("backend-fs2", "Couldn't find "
1816
"participant to create stream.\n");
1820
fsstream = fs_session_new_stream(session->session, participant,
1821
initiator == TRUE ? type_direction :
1822
(type_direction & FS_DIRECTION_RECV), &err);
1824
if (fsstream == NULL) {
1826
purple_debug_error("backend-fs2",
1827
"Error creating stream: %s\n",
1828
err && err->message ?
1829
err->message : "NULL");
1832
purple_debug_error("backend-fs2",
1833
"Error creating stream\n");
1782
1837
memcpy(_params, params, sizeof(GParameter) * num_params);
1784
1839
/* set the controlling mode parameter */
1836
session = get_session(self, sess_id);
1838
if (session == NULL) {
1839
purple_debug_error("backend-fs2",
1840
"Couldn't find session to create stream.\n");
1844
participant = get_participant(self, who);
1846
if (participant == NULL) {
1847
purple_debug_error("backend-fs2", "Couldn't find "
1848
"participant to create stream.\n");
1852
fsstream = fs_session_new_stream(session->session, participant,
1853
initiator == TRUE ? type_direction :
1854
(type_direction & FS_DIRECTION_RECV), &err);
1892
if(!fs_stream_set_transmitter(fsstream, transmitter,
1893
_params, _num_params, &err)) {
1894
purple_debug_error("backend-fs2", "Could not set transmitter %s: %s.\n", transmitter, err->message);
1895
g_clear_error(&err);
1855
1899
g_free(_params);
1857
if (fsstream == NULL) {
1859
purple_debug_error("backend-fs2",
1860
"Error creating stream: %s\n",
1861
err && err->message ?
1862
err->message : "NULL");
1865
purple_debug_error("backend-fs2",
1866
"Error creating stream\n");
1870
1902
stream = g_new0(PurpleMediaBackendFs2Stream, 1);
1871
1903
stream->participant = g_strdup(who);
1872
1904
stream->session = session;
1873
1905
stream->stream = fsstream;
1906
stream->supports_add = !strcmp(transmitter, "nice");
1875
1908
priv->streams = g_list_append(priv->streams, stream);
1983
2016
if (purple_media_is_initiator(priv->media, sess_id, participant) ||
1984
2017
purple_media_accepted(
1985
2018
priv->media, sess_id, participant)) {
1986
fs_stream_add_remote_candidates(stream->stream,
2019
if (stream->supports_add)
2020
fs_stream_add_remote_candidates(stream->stream,
2021
stream->remote_candidates, &err);
2023
fs_stream_force_remote_candidates(stream->stream,
1987
2024
stream->remote_candidates, &err);
2015
2053
if (session->type & (PURPLE_MEDIA_SEND_AUDIO |
2016
2054
PURPLE_MEDIA_SEND_VIDEO))
2017
2055
g_object_get(session->session,
2018
"codecs-ready", &ret, NULL);
2056
"codecs", &codecs, NULL);
2060
fs_codec_list_destroy (codecs);
2022
2064
GList *values = g_hash_table_get_values(priv->sessions);
2024
2066
for (; values; values = g_list_delete_link(values, values)) {
2025
2067
PurpleMediaBackendFs2Session *session = values->data;
2068
GList *codecs = NULL;
2026
2070
if (session->type & (PURPLE_MEDIA_SEND_AUDIO |
2027
2071
PURPLE_MEDIA_SEND_VIDEO))
2028
2072
g_object_get(session->session,
2029
"codecs-ready", &ret, NULL);
2073
"codecs", &codecs, NULL);
2078
fs_codec_list_destroy (codecs);
2033
2081
if (ret == FALSE)