Mercurial > pidgin
comparison libpurple/protocols/jabber/jingle/rtp.c @ 28530:5f77d173f8da
Handle Jingle's description-info method.
This makes Pidgin<->Empathy work more reliably, especially for video.
author | maiku@pidgin.im |
---|---|
date | Wed, 11 Nov 2009 02:05:01 +0000 |
parents | 8bc115afec99 |
children | 52eef06b1829 e4884dbf0c02 |
comparison
equal
deleted
inserted
replaced
28521:546dcce6f780 | 28530:5f77d173f8da |
---|---|
821 g_free(remote_jid); | 821 g_free(remote_jid); |
822 g_free(name); | 822 g_free(name); |
823 g_object_unref(session); | 823 g_object_unref(session); |
824 break; | 824 break; |
825 } | 825 } |
826 case JINGLE_DESCRIPTION_INFO: { | |
827 JingleSession *session = | |
828 jingle_content_get_session(content); | |
829 xmlnode *description = xmlnode_get_child( | |
830 xmlcontent, "description"); | |
831 GList *codecs, *iter, *iter2, *remote_codecs = | |
832 jingle_rtp_parse_codecs(description); | |
833 gchar *name = jingle_content_get_name(content); | |
834 gchar *remote_jid = | |
835 jingle_session_get_remote_jid(session); | |
836 PurpleMedia *media; | |
837 | |
838 media = jingle_rtp_get_media(session); | |
839 | |
840 /* | |
841 * This may have problems if description-info is | |
842 * received without the optional parameters for a | |
843 * codec with configuration info (such as THEORA | |
844 * or H264). The local configuration info may be | |
845 * set for the remote codec. | |
846 * | |
847 * As of 2.6.3 there's no API to support getting | |
848 * the remote codecs specifically, just the | |
849 * intersection. Another option may be to cache | |
850 * the remote codecs received in initiate/accept. | |
851 */ | |
852 codecs = purple_media_get_codecs(media, name); | |
853 | |
854 for (iter = codecs; iter; iter = g_list_next(iter)) { | |
855 guint id; | |
856 | |
857 id = purple_media_codec_get_id(iter->data); | |
858 iter2 = remote_codecs; | |
859 | |
860 for (; iter2; iter2 = g_list_next(iter2)) { | |
861 if (purple_media_codec_get_id( | |
862 iter2->data) != id) | |
863 continue; | |
864 | |
865 g_object_unref(iter->data); | |
866 iter->data = iter2->data; | |
867 remote_codecs = g_list_delete_link( | |
868 remote_codecs, iter2); | |
869 break; | |
870 } | |
871 } | |
872 | |
873 codecs = g_list_concat(codecs, remote_codecs); | |
874 g_list_free (remote_codecs); | |
875 | |
876 purple_media_set_remote_codecs(media, | |
877 name, remote_jid, codecs); | |
878 | |
879 purple_media_codec_list_free (codecs); | |
880 g_free(remote_jid); | |
881 g_free(name); | |
882 g_object_unref(session); | |
883 break; | |
884 } | |
826 default: | 885 default: |
827 break; | 886 break; |
828 } | 887 } |
829 } | 888 } |
830 | 889 |