summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.co.uk>2011-02-22 16:05:45 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.co.uk>2011-05-11 12:56:43 -0400
commit669f899993067f14cbfc95e72a87b3e771d7cb99 (patch)
tree896993a9a8491420360b22d44405c84c3c6ea57d
parent3e05f604d28e0bc9215fc7469e2b4e955b0d7732 (diff)
Set remote RTP Header extensions
-rw-r--r--telepathy-farsight/stream.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/telepathy-farsight/stream.c b/telepathy-farsight/stream.c
index 7543868..96af6b3 100644
--- a/telepathy-farsight/stream.c
+++ b/telepathy-farsight/stream.c
@@ -42,6 +42,7 @@
#include <telepathy-glib/util.h>
#include <gst/farsight/fs-conference-iface.h>
+#include <gst/farsight/fs-rtp.h>
#include "stream.h"
#include "stream-priv.h"
@@ -106,6 +107,7 @@ struct _TfStreamPrivate
guint tos;
GHashTable *feedback_messages;
+ GPtrArray *header_extensions;
GStaticMutex mutex;
guint idle_connected_id; /* Protected by mutex */
@@ -206,6 +208,9 @@ static void stream_close (TpMediaStreamHandler *proxy,
static void set_remote_feedback_messages (TpMediaStreamHandler *proxy,
GHashTable *messages, gpointer user_data, GObject *object);
+static void set_remote_header_extensions (TpMediaStreamHandler *proxy,
+ const GPtrArray *header_extensions, gpointer user_data, GObject *object);
+
static void invalidated_cb (TpMediaStreamHandler *proxy,
guint domain, gint code, gchar *message, gpointer user_data);
@@ -466,6 +471,11 @@ tf_stream_dispose (GObject *object)
priv->feedback_messages);
priv->feedback_messages = NULL;
+ if (priv->header_extensions)
+ g_boxed_free (TP_ARRAY_TYPE_RTP_HEADER_EXTENSIONS_LIST,
+ priv->header_extensions);
+ priv->header_extensions = NULL;
+
while ((data = g_queue_pop_head (&priv->events_to_send)))
g_slice_free (struct DtmfEvent, data);
@@ -781,6 +791,9 @@ get_all_properties_cb (TpProxy *proxy,
tp_cli_media_stream_handler_connect_to_set_remote_feedback_messages
(stream->priv->stream_handler_proxy, set_remote_feedback_messages, NULL,
NULL, (GObject*) stream, NULL);
+ tp_cli_media_stream_handler_connect_to_set_remote_header_extensions
+ (stream->priv->stream_handler_proxy, set_remote_header_extensions, NULL,
+ NULL, (GObject*) stream, NULL);
memset (params, 0, sizeof(GParameter) * MAX_STREAM_TRANS_PARAMS);
@@ -1562,6 +1575,23 @@ fill_fs_params (gpointer key, gpointer value, gpointer user_data)
fs_codec_add_optional_parameter (codec, key, value);
}
+static FsStreamDirection
+tpdirection_to_fsdirection (TpMediaStreamDirection dir)
+{
+ switch (dir) {
+ case TP_MEDIA_STREAM_DIRECTION_NONE:
+ return FS_DIRECTION_NONE;
+ case TP_MEDIA_STREAM_DIRECTION_SEND:
+ return FS_DIRECTION_SEND;
+ case TP_MEDIA_STREAM_DIRECTION_RECEIVE:
+ return FS_DIRECTION_RECV;
+ case TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL:
+ return FS_DIRECTION_BOTH;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
static void
set_remote_codecs (TpMediaStreamHandler *proxy G_GNUC_UNUSED,
const GPtrArray *codecs,
@@ -1665,6 +1695,47 @@ set_remote_codecs (TpMediaStreamHandler *proxy G_GNUC_UNUSED,
self->priv->feedback_messages = NULL;
}
+
+ if (self->priv->header_extensions)
+ {
+ if (g_object_class_find_property (
+ G_OBJECT_GET_CLASS (self->priv->fs_stream),
+ "rtp-header-extensions"))
+ {
+ GList *hdrexts = NULL;
+
+ for (i = 0; i < self->priv->header_extensions->len; i++)
+ {
+ GValueArray *extension =
+ g_ptr_array_index (self->priv->header_extensions, i);
+ FsRtpHeaderExtension *hdrext;
+
+ g_assert (G_VALUE_HOLDS_UINT (
+ g_value_array_get_nth (extension, 0)));
+ g_assert (G_VALUE_HOLDS_UINT (
+ g_value_array_get_nth (extension, 1)));
+ g_assert (G_VALUE_HOLDS_STRING (
+ g_value_array_get_nth (extension, 2)));
+
+ hdrext = fs_rtp_header_extension_new (
+ g_value_get_uint (g_value_array_get_nth (extension, 0)),
+ tpdirection_to_fsdirection (
+ g_value_get_uint (g_value_array_get_nth (extension, 1))),
+ g_value_get_string (g_value_array_get_nth (extension, 2)));
+
+ hdrexts = g_list_append (hdrexts, hdrext);
+ }
+
+ g_object_set (self->priv->fs_stream, "rtp-header-extensions",
+ hdrexts, NULL);
+
+ fs_rtp_header_extension_list_destroy (hdrexts);
+ }
+ g_boxed_free (TP_ARRAY_TYPE_RTP_HEADER_EXTENSIONS_LIST,
+ self->priv->header_extensions);
+ self->priv->header_extensions = NULL;
+ }
+
if (!fs_stream_set_remote_codecs (self->priv->fs_stream, fs_remote_codecs,
&error)) {
/*
@@ -2132,6 +2203,22 @@ set_remote_feedback_messages (TpMediaStreamHandler *proxy,
static void
+set_remote_header_extensions (TpMediaStreamHandler *proxy,
+ const GPtrArray *header_extensions, gpointer user_data, GObject *object)
+{
+ TfStream *self = TF_STREAM (object);
+
+ if (self->priv->header_extensions)
+ g_boxed_free (TP_ARRAY_TYPE_RTP_HEADER_EXTENSIONS_LIST,
+ self->priv->header_extensions);
+
+ self->priv->header_extensions =
+ g_boxed_copy (TP_ARRAY_TYPE_RTP_HEADER_EXTENSIONS_LIST,
+ header_extensions);
+}
+
+
+static void
cb_fs_recv_codecs_changed (TfStream *self,
GList *codecs)
{