Mercurial > pidgin.yaz
comparison libpurple/media.c @ 26038:aa50b1f05145
Added PurpleMediaStream to wrap FsStream.
author | Mike Ruprecht <maiku@soc.pidgin.im> |
---|---|
date | Sun, 16 Nov 2008 04:23:36 +0000 |
parents | a5f1804fcb4b |
children | 33fa549f2399 |
comparison
equal
deleted
inserted
replaced
26037:403453f8b643 | 26038:aa50b1f05145 |
---|---|
38 #ifdef USE_VV | 38 #ifdef USE_VV |
39 | 39 |
40 #include <gst/interfaces/propertyprobe.h> | 40 #include <gst/interfaces/propertyprobe.h> |
41 #include <gst/farsight/fs-conference-iface.h> | 41 #include <gst/farsight/fs-conference-iface.h> |
42 | 42 |
43 /** @copydoc _PurpleMediaSession */ | |
44 typedef struct _PurpleMediaSession PurpleMediaSession; | |
45 /** @copydoc _PurpleMediaStream */ | |
46 typedef struct _PurpleMediaStream PurpleMediaStream; | |
47 | |
43 struct _PurpleMediaSession | 48 struct _PurpleMediaSession |
44 { | 49 { |
45 gchar *id; | 50 gchar *id; |
46 PurpleMedia *media; | 51 PurpleMedia *media; |
47 GstElement *src; | 52 GstElement *src; |
48 GstElement *sink; | 53 GstElement *sink; |
49 FsSession *session; | 54 FsSession *session; |
50 /* FsStream table. Mapped by participant's name */ | 55 |
51 GHashTable *streams; | |
52 PurpleMediaSessionType type; | 56 PurpleMediaSessionType type; |
53 /* GList of FsCandidates table. Mapped by participant's name */ | 57 /* GList of FsCandidates table. Mapped by participant's name */ |
54 GHashTable *local_candidates; | 58 GHashTable *local_candidates; |
55 | 59 |
56 /* | 60 /* |
59 */ | 63 */ |
60 FsCandidate *local_candidate; | 64 FsCandidate *local_candidate; |
61 FsCandidate *remote_candidate; | 65 FsCandidate *remote_candidate; |
62 }; | 66 }; |
63 | 67 |
68 struct _PurpleMediaStream | |
69 { | |
70 PurpleMediaSession *session; | |
71 gchar *participant; | |
72 FsStream *stream; | |
73 | |
74 GList *local_candidates; | |
75 | |
76 gboolean candidates_prepared; | |
77 | |
78 FsCandidate *local_candidate; | |
79 FsCandidate *remote_candidate; | |
80 }; | |
81 | |
64 struct _PurpleMediaPrivate | 82 struct _PurpleMediaPrivate |
65 { | 83 { |
66 FsConference *conference; | 84 FsConference *conference; |
67 | 85 |
68 char *name; | 86 char *name; |
69 PurpleConnection *connection; | 87 PurpleConnection *connection; |
70 | 88 |
71 GHashTable *sessions; /* PurpleMediaSession table */ | 89 GHashTable *sessions; /* PurpleMediaSession table */ |
72 GHashTable *participants; /* FsParticipant table */ | 90 GHashTable *participants; /* FsParticipant table */ |
73 | 91 |
92 GList *streams; /* PurpleMediaStream table */ | |
93 | |
74 GstElement *pipeline; | 94 GstElement *pipeline; |
95 | |
75 }; | 96 }; |
76 | 97 |
77 #define PURPLE_MEDIA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEDIA, PurpleMediaPrivate)) | 98 #define PURPLE_MEDIA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEDIA, PurpleMediaPrivate)) |
78 | 99 |
79 static void purple_media_class_init (PurpleMediaClass *klass); | 100 static void purple_media_class_init (PurpleMediaClass *klass); |
231 media->priv = PURPLE_MEDIA_GET_PRIVATE(media); | 252 media->priv = PURPLE_MEDIA_GET_PRIVATE(media); |
232 memset(media->priv, 0, sizeof(media->priv)); | 253 memset(media->priv, 0, sizeof(media->priv)); |
233 } | 254 } |
234 | 255 |
235 static void | 256 static void |
257 purple_media_stream_free(PurpleMediaStream *stream) | |
258 { | |
259 g_free(stream->participant); | |
260 g_object_unref(stream->stream); | |
261 | |
262 if (stream->local_candidates) | |
263 fs_candidate_list_destroy(stream->local_candidates); | |
264 | |
265 if (stream->local_candidate) | |
266 fs_candidate_destroy(stream->local_candidate); | |
267 if (stream->remote_candidate) | |
268 fs_candidate_destroy(stream->remote_candidate); | |
269 | |
270 g_free(stream); | |
271 } | |
272 | |
273 static void | |
274 purple_media_session_free(PurpleMediaSession *session) | |
275 { | |
276 g_free(session->id); | |
277 | |
278 if (session->local_candidates) { | |
279 GList *candidates = g_hash_table_get_values(session->local_candidates); | |
280 for (; candidates; candidates = | |
281 g_list_delete_link(candidates, candidates)) | |
282 fs_candidate_list_destroy(candidates->data); | |
283 g_hash_table_destroy(session->local_candidates); | |
284 } | |
285 | |
286 if (session->local_candidate) | |
287 fs_candidate_destroy(session->local_candidate); | |
288 if (session->remote_candidate) | |
289 fs_candidate_destroy(session->remote_candidate); | |
290 | |
291 g_free(session); | |
292 } | |
293 | |
294 static void | |
236 purple_media_finalize (GObject *media) | 295 purple_media_finalize (GObject *media) |
237 { | 296 { |
238 PurpleMediaPrivate *priv = PURPLE_MEDIA_GET_PRIVATE(media); | 297 PurpleMediaPrivate *priv = PURPLE_MEDIA_GET_PRIVATE(media); |
239 purple_debug_info("media","purple_media_finalize\n"); | 298 purple_debug_info("media","purple_media_finalize\n"); |
240 | 299 |
244 g_free(priv->name); | 303 g_free(priv->name); |
245 | 304 |
246 if (priv->sessions) { | 305 if (priv->sessions) { |
247 GList *sessions = g_hash_table_get_values(priv->sessions); | 306 GList *sessions = g_hash_table_get_values(priv->sessions); |
248 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { | 307 for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { |
249 PurpleMediaSession *session = sessions->data; | 308 purple_media_session_free(sessions->data); |
250 g_free(session->id); | |
251 | |
252 if (session->streams) { | |
253 GList *streams = g_hash_table_get_values(session->streams); | |
254 for (; streams; streams = g_list_delete_link(streams, streams)) | |
255 g_object_unref(streams->data); | |
256 g_hash_table_destroy(session->streams); | |
257 } | |
258 | |
259 if (session->local_candidates) { | |
260 GList *candidates = g_hash_table_get_values(session->local_candidates); | |
261 for (; candidates; candidates = | |
262 g_list_delete_link(candidates, candidates)) | |
263 fs_candidate_list_destroy(candidates->data); | |
264 g_hash_table_destroy(session->local_candidates); | |
265 } | |
266 | |
267 if (session->local_candidate) | |
268 fs_candidate_destroy(session->local_candidate); | |
269 if (session->remote_candidate) | |
270 fs_candidate_destroy(session->remote_candidate); | |
271 | |
272 g_free(session); | |
273 } | 309 } |
274 g_hash_table_destroy(priv->sessions); | 310 g_hash_table_destroy(priv->sessions); |
275 } | 311 } |
312 | |
313 for (; priv->streams; priv->streams = g_list_delete_link(priv->streams, priv->streams)) | |
314 purple_media_stream_free(priv->streams->data); | |
276 | 315 |
277 if (priv->participants) { | 316 if (priv->participants) { |
278 GList *participants = g_hash_table_get_values(priv->participants); | 317 GList *participants = g_hash_table_get_values(priv->participants); |
279 for (; participants; participants = g_list_delete_link(participants, participants)) | 318 for (; participants; participants = g_list_delete_link(participants, participants)) |
280 g_object_unref(participants->data); | 319 g_object_unref(participants->data); |
421 } | 460 } |
422 | 461 |
423 static FsStream* | 462 static FsStream* |
424 purple_media_session_get_stream(PurpleMediaSession *session, const gchar *name) | 463 purple_media_session_get_stream(PurpleMediaSession *session, const gchar *name) |
425 { | 464 { |
426 return (FsStream*) (session->streams) ? | 465 GList *streams = session->media->priv->streams; |
427 g_hash_table_lookup(session->streams, name) : NULL; | 466 |
467 for (; streams; streams = g_list_next(streams)) { | |
468 PurpleMediaStream *stream = streams->data; | |
469 if (session == stream->session && | |
470 !strcmp(stream->participant, name)) | |
471 return stream->stream; | |
472 } | |
473 | |
474 return NULL; | |
428 } | 475 } |
429 | 476 |
430 static GList* | 477 static GList* |
431 purple_media_session_get_local_candidates(PurpleMediaSession *session, const gchar *name) | 478 purple_media_session_get_local_candidates(PurpleMediaSession *session, const gchar *name) |
432 { | 479 { |
481 } | 528 } |
482 | 529 |
483 static void | 530 static void |
484 purple_media_insert_stream(PurpleMediaSession *session, const gchar *name, FsStream *stream) | 531 purple_media_insert_stream(PurpleMediaSession *session, const gchar *name, FsStream *stream) |
485 { | 532 { |
486 if (!session->streams) { | 533 PurpleMediaStream *media_stream = g_new0(PurpleMediaStream, 1); |
487 purple_debug_info("media", "Creating hash table for streams\n"); | 534 media_stream->stream = stream; |
488 session->streams = g_hash_table_new_full(g_str_hash, | 535 media_stream->participant = g_strdup(name); |
489 g_str_equal, g_free, NULL); | 536 media_stream->session = session; |
490 } | 537 |
491 | 538 session->media->priv->streams = |
492 g_hash_table_insert(session->streams, g_strdup(name), stream); | 539 g_list_append(session->media->priv->streams, media_stream); |
493 } | 540 } |
494 | 541 |
495 static void | 542 static void |
496 purple_media_insert_local_candidate(PurpleMediaSession *session, const gchar *name, | 543 purple_media_insert_local_candidate(PurpleMediaSession *session, const gchar *name, |
497 FsCandidate *candidate) | 544 FsCandidate *candidate) |