diff options
author | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2011-02-22 17:10:09 -0500 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2011-05-11 12:56:44 -0400 |
commit | 397c2aafb85294b0d2d215ab68e779eeac853bc8 (patch) | |
tree | df399ba82e180f7f8bc3e81fb6cb0a092fd08eb0 | |
parent | 669f899993067f14cbfc95e72a87b3e771d7cb99 (diff) |
Set the local RTP header extensions
-rw-r--r-- | telepathy-farsight/stream.c | 74 |
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; } |