summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.co.uk>2011-02-22 17:10:09 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.com>2011-06-24 17:39:22 -0400
commita91aeaa232ae539113ae53e82839c5b89377e9fd (patch)
tree2acdf0da52b8cd3b304aedf12114432f7c488093
parent864116bef0fcd580360801cb8e03ba77fce783cd (diff)
downloadtelepathy-farstream-a91aeaa232ae539113ae53e82839c5b89377e9fd.tar.gz
Set the local RTP header extensions
-rw-r--r--telepathy-farstream/stream.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/telepathy-farstream/stream.c b/telepathy-farstream/stream.c
index 75fad74..01d697b 100644
--- a/telepathy-farstream/stream.c
+++ b/telepathy-farstream/stream.c
@@ -1694,6 +1694,7 @@ set_remote_codecs (TpMediaStreamHandler *proxy G_GNUC_UNUSED,
g_ptr_array_index (self->priv->header_extensions, i);
FsRtpHeaderExtension *hdrext;
+ g_assert (extension->n_values >= 3);
g_assert (G_VALUE_HOLDS_UINT (
g_value_array_get_nth (extension, 0)));
g_assert (G_VALUE_HOLDS_UINT (
@@ -2750,6 +2751,56 @@ fs_codecs_to_feedback_messages (GList *fscodecs)
return feedback_messages;
}
+
+static TpMediaStreamDirection
+fsdirection_to_tpdirection (FsStreamDirection dir)
+{
+ switch (dir) {
+ case FS_DIRECTION_NONE:
+ return TP_MEDIA_STREAM_DIRECTION_NONE;
+ case FS_DIRECTION_SEND:
+ return TP_MEDIA_STREAM_DIRECTION_SEND;
+ case FS_DIRECTION_RECV:
+ return TP_MEDIA_STREAM_DIRECTION_RECEIVE;
+ case FS_DIRECTION_BOTH:
+ return TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL;
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+
+static GPtrArray *
+_tf_stream_get_header_extensions (TfStream *stream)
+{
+ GPtrArray *extensions = g_ptr_array_new ();
+ GList *hdrexts;
+ GList *item;
+
+ if (!g_object_class_find_property (
+ G_OBJECT_GET_CLASS (stream->priv->fs_session),
+ "rtp-header-extensions"))
+ return extensions;
+
+ g_object_get (stream->priv->fs_session,
+ "rtp-header-extensions", &hdrexts, NULL);
+
+ for (item = hdrexts; item; item = item->next)
+ {
+ FsRtpHeaderExtension *hdrext = item->data;
+
+ g_ptr_array_add (extensions,
+ tp_value_array_build (4,
+ G_TYPE_UINT, hdrext->id,
+ G_TYPE_UINT, fsdirection_to_tpdirection (hdrext->direction),
+ G_TYPE_STRING, hdrext->uri,
+ G_TYPE_STRING, "",
+ G_TYPE_INVALID));
+ }
+
+ return extensions;
+}
+
void
_tf_stream_try_sending_codecs (TfStream *stream)
{
@@ -2758,6 +2809,7 @@ _tf_stream_try_sending_codecs (TfStream *stream)
GList *item = NULL;
GPtrArray *tpcodecs = NULL;
GHashTable *feedback_messages = NULL;
+ GPtrArray *header_extensions = NULL;
DEBUG (stream, "called (send_local:%d send_supported:%d)",
stream->priv->send_local_codecs, stream->priv->send_supported_codecs);
@@ -2784,6 +2836,7 @@ _tf_stream_try_sending_codecs (TfStream *stream)
{
tpcodecs = fs_codecs_to_tp (stream, fscodecs);
feedback_messages = fs_codecs_to_feedback_messages (fscodecs);
+ header_extensions = _tf_stream_get_header_extensions (stream);
DEBUG (stream, "calling MediaStreamHandler::Ready");
tp_cli_media_stream_handler_call_supported_feedback_messages (
@@ -2791,6 +2844,11 @@ _tf_stream_try_sending_codecs (TfStream *stream)
-1, feedback_messages, async_method_callback_optional,
"Media.StreamHandler::SupportedFeedbackMessages for Ready",
NULL, (GObject *) stream);
+ tp_cli_media_stream_handler_call_supported_header_extensions (
+ stream->priv->stream_handler_proxy,
+ -1, header_extensions, async_method_callback_optional,
+ "Media.StreamHandler::SupportedHeaderExtensions for Ready",
+ NULL, (GObject *) stream);
tp_cli_media_stream_handler_call_ready (
stream->priv->stream_handler_proxy,
-1, tpcodecs, async_method_callback, "Media.StreamHandler::Ready",
@@ -2803,6 +2861,7 @@ _tf_stream_try_sending_codecs (TfStream *stream)
{
tpcodecs = fs_codecs_to_tp (stream, fscodecs);
feedback_messages = fs_codecs_to_feedback_messages (fscodecs);
+ header_extensions = _tf_stream_get_header_extensions (stream);
DEBUG (stream, "calling MediaStreamHandler::SupportedCodecs");
tp_cli_media_stream_handler_call_supported_feedback_messages (
@@ -2810,6 +2869,11 @@ _tf_stream_try_sending_codecs (TfStream *stream)
-1, feedback_messages, async_method_callback_optional,
"Media.StreamHandler::SupportedFeedbackMessages for SupportedCodecs",
NULL, (GObject *) stream);
+ tp_cli_media_stream_handler_call_supported_header_extensions (
+ stream->priv->stream_handler_proxy,
+ -1, header_extensions, async_method_callback_optional,
+ "Media.StreamHandler::SupportedHeaderExtensions for SupportedCodecs",
+ NULL, (GObject *) stream);
tp_cli_media_stream_handler_call_supported_codecs (
stream->priv->stream_handler_proxy,
-1, tpcodecs, async_method_callback,
@@ -2831,6 +2895,9 @@ _tf_stream_try_sending_codecs (TfStream *stream)
tpcodecs = fs_codecs_to_tp (stream, fscodecs);
if (!feedback_messages)
feedback_messages = fs_codecs_to_feedback_messages (fscodecs);
+ if (!header_extensions)
+ header_extensions = _tf_stream_get_header_extensions (stream);
+
DEBUG (stream, "calling MediaStreamHandler::CodecsUpdated");
tp_cli_media_stream_handler_call_supported_feedback_messages (
@@ -2838,6 +2905,11 @@ _tf_stream_try_sending_codecs (TfStream *stream)
-1, feedback_messages, async_method_callback_optional,
"Media.StreamHandler::SupportedFeedbackMessages for CodecsUpdated",
NULL, (GObject *) stream);
+ tp_cli_media_stream_handler_call_supported_header_extensions (
+ stream->priv->stream_handler_proxy,
+ -1, header_extensions, async_method_callback_optional,
+ "Media.StreamHandler::SupportedHeaderExtensions for CodecsUpdated",
+ NULL, (GObject *) stream);
tp_cli_media_stream_handler_call_codecs_updated (
stream->priv->stream_handler_proxy,
-1, tpcodecs, async_method_callback,
@@ -2849,6 +2921,8 @@ out:
g_boxed_free (TP_ARRAY_TYPE_MEDIA_STREAM_HANDLER_CODEC_LIST, tpcodecs);
if (feedback_messages)
g_boxed_free (TP_HASH_TYPE_RTCP_FEEDBACK_MESSAGE_MAP, feedback_messages);
+ if (header_extensions)
+ g_boxed_free (TP_ARRAY_TYPE_RTP_HEADER_EXTENSIONS_LIST, header_extensions);
fs_codec_list_destroy (stream->priv->last_sent_codecs);
stream->priv->last_sent_codecs = fscodecs;
}