Mercurial > pidgin
comparison libpurple/media/media.c @ 29158:ae81f8baa148
Transfer some GStreamer message handling to the Farsight 2 media backend.
author | maiku@pidgin.im |
---|---|
date | Fri, 23 Oct 2009 19:59:12 +0000 |
parents | e85df0170905 |
children | efeb21092ed2 |
comparison
equal
deleted
inserted
replaced
29157:e85df0170905 | 29158:ae81f8baa148 |
---|---|
1063 !PURPLE_IS_MEDIA(media) || | 1063 !PURPLE_IS_MEDIA(media) || |
1064 media->priv->conference != | 1064 media->priv->conference != |
1065 FS_CONFERENCE(GST_MESSAGE_SRC(msg))) | 1065 FS_CONFERENCE(GST_MESSAGE_SRC(msg))) |
1066 break; | 1066 break; |
1067 | 1067 |
1068 if (gst_structure_has_name(msg->structure, "farsight-error")) { | 1068 if (gst_structure_has_name(msg->structure, |
1069 FsError error_no; | |
1070 gst_structure_get_enum(msg->structure, "error-no", | |
1071 FS_TYPE_ERROR, (gint*)&error_no); | |
1072 switch (error_no) { | |
1073 case FS_ERROR_NO_CODECS: | |
1074 purple_media_error(media, _("No codecs found. Install some GStreamer codecs found in GStreamer plugins packages.")); | |
1075 purple_media_end(media, NULL, NULL); | |
1076 break; | |
1077 case FS_ERROR_NO_CODECS_LEFT: | |
1078 purple_media_error(media, _("No codecs left. Your codec preferences in fs-codecs.conf are too strict.")); | |
1079 purple_media_end(media, NULL, NULL); | |
1080 break; | |
1081 case FS_ERROR_UNKNOWN_CNAME: | |
1082 /* | |
1083 * Unknown CName is only a problem for the | |
1084 * multicast transmitter which isn't used. | |
1085 * It is also deprecated. | |
1086 */ | |
1087 break; | |
1088 default: | |
1089 purple_debug_error("media", "farsight-error: %i: %s\n", error_no, | |
1090 gst_structure_get_string(msg->structure, "error-msg")); | |
1091 break; | |
1092 } | |
1093 | |
1094 if (FS_ERROR_IS_FATAL(error_no)) { | |
1095 purple_media_error(media, _("A non-recoverable Farsight2 error has occurred.")); | |
1096 purple_media_end(media, NULL, NULL); | |
1097 } | |
1098 } else if (gst_structure_has_name(msg->structure, | |
1099 "farsight-new-local-candidate")) { | 1069 "farsight-new-local-candidate")) { |
1100 FsStream *stream = g_value_get_object(gst_structure_get_value(msg->structure, "stream")); | 1070 FsStream *stream = g_value_get_object(gst_structure_get_value(msg->structure, "stream")); |
1101 FsCandidate *local_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "candidate")); | 1071 FsCandidate *local_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "candidate")); |
1102 PurpleMediaSession *session = purple_media_session_from_fs_stream(media, stream); | 1072 PurpleMediaSession *session = purple_media_session_from_fs_stream(media, stream); |
1103 purple_media_new_local_candidate_cb(stream, local_candidate, session); | 1073 purple_media_new_local_candidate_cb(stream, local_candidate, session); |
1112 FsCandidate *local_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "local-candidate")); | 1082 FsCandidate *local_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "local-candidate")); |
1113 FsCandidate *remote_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "remote-candidate")); | 1083 FsCandidate *remote_candidate = g_value_get_boxed(gst_structure_get_value(msg->structure, "remote-candidate")); |
1114 PurpleMediaSession *session = purple_media_session_from_fs_stream(media, stream); | 1084 PurpleMediaSession *session = purple_media_session_from_fs_stream(media, stream); |
1115 purple_media_candidate_pair_established_cb(stream, local_candidate, remote_candidate, session); | 1085 purple_media_candidate_pair_established_cb(stream, local_candidate, remote_candidate, session); |
1116 } else if (gst_structure_has_name(msg->structure, | 1086 } else if (gst_structure_has_name(msg->structure, |
1117 "farsight-recv-codecs-changed")) { | |
1118 GList *codecs = g_value_get_boxed(gst_structure_get_value(msg->structure, "codecs")); | |
1119 FsCodec *codec = codecs->data; | |
1120 purple_debug_info("media", "farsight-recv-codecs-changed: %s\n", codec->encoding_name); | |
1121 | |
1122 } else if (gst_structure_has_name(msg->structure, | |
1123 "farsight-component-state-changed")) { | |
1124 FsStreamState fsstate = g_value_get_enum(gst_structure_get_value(msg->structure, "state")); | |
1125 guint component = g_value_get_uint(gst_structure_get_value(msg->structure, "component")); | |
1126 const gchar *state; | |
1127 switch (fsstate) { | |
1128 case FS_STREAM_STATE_FAILED: | |
1129 state = "FAILED"; | |
1130 break; | |
1131 case FS_STREAM_STATE_DISCONNECTED: | |
1132 state = "DISCONNECTED"; | |
1133 break; | |
1134 case FS_STREAM_STATE_GATHERING: | |
1135 state = "GATHERING"; | |
1136 break; | |
1137 case FS_STREAM_STATE_CONNECTING: | |
1138 state = "CONNECTING"; | |
1139 break; | |
1140 case FS_STREAM_STATE_CONNECTED: | |
1141 state = "CONNECTED"; | |
1142 break; | |
1143 case FS_STREAM_STATE_READY: | |
1144 state = "READY"; | |
1145 break; | |
1146 default: | |
1147 state = "UNKNOWN"; | |
1148 break; | |
1149 } | |
1150 purple_debug_info("media", "farsight-component-state-changed: component: %u state: %s\n", component, state); | |
1151 } else if (gst_structure_has_name(msg->structure, | |
1152 "farsight-send-codec-changed")) { | |
1153 FsCodec *codec = g_value_get_boxed(gst_structure_get_value(msg->structure, "codec")); | |
1154 gchar *codec_str = fs_codec_to_string(codec); | |
1155 purple_debug_info("media", "farsight-send-codec-changed: codec: %s\n", codec_str); | |
1156 g_free(codec_str); | |
1157 } else if (gst_structure_has_name(msg->structure, | |
1158 "farsight-codecs-changed")) { | 1087 "farsight-codecs-changed")) { |
1159 GList *sessions = g_hash_table_get_values(PURPLE_MEDIA(media)->priv->sessions); | 1088 GList *sessions = g_hash_table_get_values(PURPLE_MEDIA(media)->priv->sessions); |
1160 FsSession *fssession = g_value_get_object(gst_structure_get_value(msg->structure, "session")); | 1089 FsSession *fssession = g_value_get_object(gst_structure_get_value(msg->structure, "session")); |
1161 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { | 1090 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { |
1162 PurpleMediaSession *session = sessions->data; | 1091 PurpleMediaSession *session = sessions->data; |
1168 break; | 1097 break; |
1169 } | 1098 } |
1170 } | 1099 } |
1171 } | 1100 } |
1172 break; | 1101 break; |
1173 } | |
1174 case GST_MESSAGE_ERROR: { | |
1175 GstElement *element = GST_ELEMENT(GST_MESSAGE_SRC(msg)); | |
1176 GstElement *lastElement = NULL; | |
1177 while (!GST_IS_PIPELINE(element)) { | |
1178 if (element == media->priv->confbin) { | |
1179 purple_media_error(media, _("Conference error")); | |
1180 purple_media_end(media, NULL, NULL); | |
1181 break; | |
1182 } | |
1183 lastElement = element; | |
1184 element = GST_ELEMENT_PARENT(element); | |
1185 } | |
1186 if (GST_IS_PIPELINE(element)) { | |
1187 GList *sessions = g_hash_table_get_values(media->priv->sessions); | |
1188 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { | |
1189 PurpleMediaSession *session = sessions->data; | |
1190 | |
1191 if (session->src == lastElement) { | |
1192 if (session->type & PURPLE_MEDIA_AUDIO) | |
1193 purple_media_error(media, _("Error with your microphone")); | |
1194 else | |
1195 purple_media_error(media, _("Error with your webcam")); | |
1196 purple_media_end(media, NULL, NULL); | |
1197 break; | |
1198 } | |
1199 } | |
1200 g_list_free(sessions); | |
1201 } | |
1202 } | 1102 } |
1203 default: | 1103 default: |
1204 break; | 1104 break; |
1205 } | 1105 } |
1206 | 1106 |