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;