Mercurial > pidgin
comparison libpurple/media.c @ 26115:9b0761b77218
Handle the session tee in the session rather than the src bin.
author | Mike Ruprecht <maiku@soc.pidgin.im> |
---|---|
date | Sat, 21 Feb 2009 05:01:10 +0000 |
parents | 730e760ca39f |
children | 6cf36f68033c |
comparison
equal
deleted
inserted
replaced
26114:730e760ca39f | 26115:9b0761b77218 |
---|---|
50 struct _PurpleMediaSession | 50 struct _PurpleMediaSession |
51 { | 51 { |
52 gchar *id; | 52 gchar *id; |
53 PurpleMedia *media; | 53 PurpleMedia *media; |
54 GstElement *src; | 54 GstElement *src; |
55 GstElement *tee; | |
55 FsSession *session; | 56 FsSession *session; |
56 | 57 |
57 PurpleMediaSessionType type; | 58 PurpleMediaSessionType type; |
58 | 59 |
59 gboolean codecs_ready; | 60 gboolean codecs_ready; |
1104 gst_object_unref(session->src); | 1105 gst_object_unref(session->src); |
1105 session->src = src; | 1106 session->src = src; |
1106 gst_bin_add(GST_BIN(session->media->priv->confbin), | 1107 gst_bin_add(GST_BIN(session->media->priv->confbin), |
1107 session->src); | 1108 session->src); |
1108 | 1109 |
1110 session->tee = gst_element_factory_make("tee", NULL); | |
1111 gst_bin_add(GST_BIN(session->media->priv->confbin), session->tee); | |
1112 gst_element_link(session->src, session->tee); | |
1113 gst_element_set_state(session->tee, GST_STATE_PLAYING); | |
1114 | |
1109 g_object_get(session->session, "sink-pad", &sinkpad, NULL); | 1115 g_object_get(session->session, "sink-pad", &sinkpad, NULL); |
1110 srcpad = gst_element_get_static_pad(src, "ghostsrc"); | 1116 srcpad = gst_element_get_request_pad(session->tee, "src%d"); |
1111 purple_debug_info("media", "connecting pad: %s\n", | 1117 purple_debug_info("media", "connecting pad: %s\n", |
1112 gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK | 1118 gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK |
1113 ? "success" : "failure"); | 1119 ? "success" : "failure"); |
1114 } | 1120 } |
1115 | 1121 |
1543 } | 1549 } |
1544 | 1550 |
1545 void | 1551 void |
1546 purple_media_video_init_src(GstElement **sendbin) | 1552 purple_media_video_init_src(GstElement **sendbin) |
1547 { | 1553 { |
1548 GstElement *src, *tee, *queue; | 1554 GstElement *src; |
1549 GstPad *pad; | 1555 GstPad *pad; |
1550 GstPad *ghost; | 1556 GstPad *ghost; |
1551 const gchar *video_plugin = purple_prefs_get_string( | 1557 const gchar *video_plugin = purple_prefs_get_string( |
1552 "/purple/media/video/plugin"); | 1558 "/purple/media/video/plugin"); |
1553 const gchar *video_device = purple_prefs_get_string( | 1559 const gchar *video_device = purple_prefs_get_string( |
1557 | 1563 |
1558 *sendbin = gst_bin_new("purplesendvideobin"); | 1564 *sendbin = gst_bin_new("purplesendvideobin"); |
1559 src = gst_element_factory_make(video_plugin, "purplevideosource"); | 1565 src = gst_element_factory_make(video_plugin, "purplevideosource"); |
1560 gst_bin_add(GST_BIN(*sendbin), src); | 1566 gst_bin_add(GST_BIN(*sendbin), src); |
1561 | 1567 |
1562 tee = gst_element_factory_make("tee", "purplevideosrctee"); | |
1563 gst_bin_add(GST_BIN(*sendbin), tee); | |
1564 gst_element_link(src, tee); | |
1565 | |
1566 queue = gst_element_factory_make("queue", NULL); | |
1567 gst_bin_add(GST_BIN(*sendbin), queue); | |
1568 gst_element_link(tee, queue); | |
1569 | |
1570 if (!strcmp(video_plugin, "videotestsrc")) { | 1568 if (!strcmp(video_plugin, "videotestsrc")) { |
1571 /* unless is-live is set to true it doesn't throttle videotestsrc */ | 1569 /* unless is-live is set to true it doesn't throttle videotestsrc */ |
1572 g_object_set (G_OBJECT(src), "is-live", TRUE, NULL); | 1570 g_object_set (G_OBJECT(src), "is-live", TRUE, NULL); |
1573 } | 1571 } |
1574 | 1572 |
1575 pad = gst_element_get_static_pad(queue, "src"); | 1573 pad = gst_element_get_static_pad(src, "src"); |
1576 ghost = gst_ghost_pad_new("ghostsrc", pad); | 1574 ghost = gst_ghost_pad_new("ghostsrc", pad); |
1577 gst_object_unref(pad); | 1575 gst_object_unref(pad); |
1578 gst_element_add_pad(*sendbin, ghost); | 1576 gst_element_add_pad(*sendbin, ghost); |
1579 | 1577 |
1580 if (video_device != NULL && strcmp(video_device, "")) | 1578 if (video_device != NULL && strcmp(video_device, "")) |
2356 session->window_id = window_id; | 2354 session->window_id = window_id; |
2357 | 2355 |
2358 if (session->sink == NULL) { | 2356 if (session->sink == NULL) { |
2359 PurpleMediaXOverlayData *data; | 2357 PurpleMediaXOverlayData *data; |
2360 GstBus *bus; | 2358 GstBus *bus; |
2361 GstElement *tee, *bin, *queue, *sink; | 2359 GstElement *bin, *queue, *sink; |
2362 GstPad *request_pad, *sinkpad, *ghostpad; | 2360 GstPad *request_pad, *sinkpad, *ghostpad; |
2363 gchar *name; | 2361 gchar *name; |
2364 | 2362 |
2365 /* Create sink */ | 2363 /* Create sink */ |
2366 tee = gst_bin_get_by_name(GST_BIN(session->src), | |
2367 "purplevideosrctee"); | |
2368 bin = gst_bin_new(NULL); | 2364 bin = gst_bin_new(NULL); |
2369 gst_bin_add(GST_BIN(GST_ELEMENT_PARENT(tee)), bin); | 2365 gst_bin_add(GST_BIN(GST_ELEMENT_PARENT( |
2366 session->tee)), bin); | |
2370 | 2367 |
2371 queue = gst_element_factory_make("queue", NULL); | 2368 queue = gst_element_factory_make("queue", NULL); |
2372 name = g_strdup_printf( | 2369 name = g_strdup_printf( |
2373 "session-sink_%s", session_id); | 2370 "session-sink_%s", session_id); |
2374 sink = gst_element_factory_make( | 2371 sink = gst_element_factory_make( |
2396 gst_object_unref(bus); | 2393 gst_object_unref(bus); |
2397 | 2394 |
2398 gst_element_set_state(bin, GST_STATE_PLAYING); | 2395 gst_element_set_state(bin, GST_STATE_PLAYING); |
2399 | 2396 |
2400 request_pad = gst_element_get_request_pad( | 2397 request_pad = gst_element_get_request_pad( |
2401 tee, "src%d"); | 2398 session->tee, "src%d"); |
2402 gst_pad_link(request_pad, ghostpad); | 2399 gst_pad_link(request_pad, ghostpad); |
2403 gst_object_unref(request_pad); | 2400 gst_object_unref(request_pad); |
2404 | 2401 |
2405 session->sink = bin; | 2402 session->sink = bin; |
2406 return TRUE; | 2403 return TRUE; |