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