diff options
author | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2011-02-22 15:19:49 -0500 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2011-05-11 12:56:26 -0400 |
commit | 3e05f604d28e0bc9215fc7469e2b4e955b0d7732 (patch) | |
tree | c3296d1d1bd557814611bef6687415131b3d85d8 | |
parent | 61343fe9611a6c997b7786ad7e934561da9343d0 (diff) |
Set local Feedback Messages
-rw-r--r-- | telepathy-farsight/stream.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/telepathy-farsight/stream.c b/telepathy-farsight/stream.c index bf584fb..7543868 100644 --- a/telepathy-farsight/stream.c +++ b/telepathy-farsight/stream.c @@ -2613,6 +2613,69 @@ _tf_stream_new (gpointer channel, return self; } +static GHashTable * +fs_codecs_to_feedback_messages (GList *fscodecs) +{ + GList *item; + GHashTable *feedback_messages = g_hash_table_new_full (g_direct_hash, + g_direct_equal, NULL, (GDestroyNotify) g_value_array_free); + + for (item = fscodecs; item; item = item->next) + { + FsCodec *fs_codec = item->data; + + if (fs_codec->ABI.ABI.minimum_reporting_interval != G_MAXUINT || + fs_codec->ABI.ABI.feedback_params) + { + GValueArray *codec = g_value_array_new (2); + GPtrArray *messages = g_ptr_array_new (); + GValue *val; + GList *item2; + + for (item2 = fs_codec->ABI.ABI.feedback_params; + item2; + item2 = item2->next) + { + FsFeedbackParameter *p = item2->data; + GValueArray *message = g_value_array_new (3); + GValue *val2; + + g_value_array_insert (message, 0, NULL); + val2 = g_value_array_get_nth (message, 0); + g_value_init (val2, G_TYPE_STRING); + g_value_set_string (val2, p->type); + + g_value_array_insert (message, 1, NULL); + val2 = g_value_array_get_nth (message, 1); + g_value_init (val2, G_TYPE_STRING); + g_value_set_string (val2, p->subtype); + + g_value_array_insert (message, 2, NULL); + val2 = g_value_array_get_nth (message, 2); + g_value_init (val2, G_TYPE_STRING); + g_value_set_string (val2, p->extra_params); + + g_ptr_array_add (messages, message); + } + + g_value_array_insert (codec, 0, NULL); + val = g_value_array_get_nth (codec, 0); + g_value_init (val, G_TYPE_UINT); + g_value_set_uint (val, fs_codec->ABI.ABI.minimum_reporting_interval); + + g_value_array_insert (codec, 1, NULL); + val = g_value_array_get_nth (codec, 1); + g_value_init (val, TP_ARRAY_TYPE_RTCP_FEEDBACK_MESSAGE_LIST); + g_value_take_boxed (val, messages); + + g_hash_table_insert (feedback_messages, + GUINT_TO_POINTER (fs_codec->id), codec); + } + } + + return feedback_messages; +} + void _tf_stream_try_sending_codecs (TfStream *stream) { @@ -2620,6 +2683,7 @@ _tf_stream_try_sending_codecs (TfStream *stream) GList *fscodecs = NULL; GList *item = NULL; GPtrArray *tpcodecs = NULL; + GHashTable *feedback_messages = NULL; DEBUG (stream, "called (send_local:%d send_supported:%d)", stream->priv->send_local_codecs, stream->priv->send_supported_codecs); @@ -2645,8 +2709,14 @@ _tf_stream_try_sending_codecs (TfStream *stream) if (stream->priv->send_local_codecs) { tpcodecs = fs_codecs_to_tp (stream, fscodecs); + feedback_messages = fs_codecs_to_feedback_messages (fscodecs); DEBUG (stream, "calling MediaStreamHandler::Ready"); + tp_cli_media_stream_handler_call_supported_feedback_messages ( + stream->priv->stream_handler_proxy, + -1, feedback_messages, async_method_callback_optional, + "Media.StreamHandler::SupportedFeedbackMessages 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", @@ -2658,8 +2728,14 @@ _tf_stream_try_sending_codecs (TfStream *stream) if (stream->priv->send_supported_codecs) { tpcodecs = fs_codecs_to_tp (stream, fscodecs); + feedback_messages = fs_codecs_to_feedback_messages (fscodecs); DEBUG (stream, "calling MediaStreamHandler::SupportedCodecs"); + tp_cli_media_stream_handler_call_supported_feedback_messages ( + stream->priv->stream_handler_proxy, + -1, feedback_messages, async_method_callback_optional, + "Media.StreamHandler::SupportedFeedbackMessages for SupportedCodecs", + NULL, (GObject *) stream); tp_cli_media_stream_handler_call_supported_codecs ( stream->priv->stream_handler_proxy, -1, tpcodecs, async_method_callback, @@ -2679,8 +2755,15 @@ _tf_stream_try_sending_codecs (TfStream *stream) { if (!tpcodecs) tpcodecs = fs_codecs_to_tp (stream, fscodecs); + if (!feedback_messages) + feedback_messages = fs_codecs_to_feedback_messages (fscodecs); DEBUG (stream, "calling MediaStreamHandler::CodecsUpdated"); + tp_cli_media_stream_handler_call_supported_feedback_messages ( + stream->priv->stream_handler_proxy, + -1, feedback_messages, async_method_callback_optional, + "Media.StreamHandler::SupportedFeedbackMessages for CodecsUpdated", + NULL, (GObject *) stream); tp_cli_media_stream_handler_call_codecs_updated ( stream->priv->stream_handler_proxy, -1, tpcodecs, async_method_callback, @@ -2690,6 +2773,8 @@ _tf_stream_try_sending_codecs (TfStream *stream) out: if (tpcodecs) 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); fs_codec_list_destroy (stream->priv->last_sent_codecs); stream->priv->last_sent_codecs = fscodecs; } |