diff options
author | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2011-02-22 16:05:45 -0500 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2011-05-11 12:56:43 -0400 |
commit | 669f899993067f14cbfc95e72a87b3e771d7cb99 (patch) | |
tree | 896993a9a8491420360b22d44405c84c3c6ea57d | |
parent | 3e05f604d28e0bc9215fc7469e2b4e955b0d7732 (diff) |
Set remote RTP Header extensions
-rw-r--r-- | telepathy-farsight/stream.c | 87 |
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) { |