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.co.uk>2011-05-11 12:56:44 -0400
commit397c2aafb85294b0d2d215ab68e779eeac853bc8 (patch)
treedf399ba82e180f7f8bc3e81fb6cb0a092fd08eb0
parent669f899993067f14cbfc95e72a87b3e771d7cb99 (diff)
Set the local RTP header extensions
-rw-r--r--telepathy-farsight/stream.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/telepathy-farsight/stream.c b/telepathy-farsight/stream.c
index 96af6b3..bd6644a 100644
--- a/telepathy-farsight/stream.c
+++ b/telepathy-farsight/stream.c
@@ -1710,6 +1710,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 (
@@ -2763,6 +2764,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)
{
@@ -2771,6 +2822,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);
@@ -2797,6 +2849,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 (
@@ -2804,6 +2857,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",
@@ -2816,6 +2874,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 (
@@ -2823,6 +2882,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,
@@ -2844,6 +2908,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 (
@@ -2851,6 +2918,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,
@@ -2862,6 +2934,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;
}