comparison libpurple/media.c @ 24962: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
24961:403453f8b643 24962: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)