static GstElement * create_audio_sink(PurpleMedia *media, const gchar *session_id, const gchar *participant) { const gchar *plugin = purple_prefs_get_string( "/plugins/core/vvconfig/audio/sink/plugin"); const gchar *device = purple_prefs_get_string( "/plugins/core/vvconfig/audio/sink/device"); GstElement *ret; if (plugin[0] == '\0') return purple_media_element_info_call_create(old_audio_sink, media, session_id, participant); ret = gst_element_factory_make(plugin, NULL); if (device[0] != '\0') g_object_set(G_OBJECT(ret), "device", device, NULL); return ret; }
static GstElement * create_video_src(PurpleMedia *media, const gchar *session_id, const gchar *participant) { const gchar *plugin = purple_prefs_get_string( "/plugins/core/vvconfig/video/src/plugin"); const gchar *device = purple_prefs_get_string( "/plugins/core/vvconfig/video/src/device"); GstElement *ret; if (plugin[0] == '\0') return purple_media_element_info_call_create(old_video_src, media, session_id, participant); ret = gst_element_factory_make(plugin, "vvconfig-videosrc"); if (device[0] != '\0') g_object_set(G_OBJECT(ret), "device", device, NULL); if (!strcmp(plugin, "videotestsrc")) g_object_set(G_OBJECT(ret), "is-live", 1, NULL); return ret; }
GstElement * purple_media_manager_get_element(PurpleMediaManager *manager, PurpleMediaSessionType type, PurpleMedia *media, const gchar *session_id, const gchar *participant) { #ifdef USE_VV GstElement *ret = NULL; PurpleMediaElementInfo *info = NULL; PurpleMediaElementType element_type; if (type & PURPLE_MEDIA_SEND_AUDIO) info = manager->priv->audio_src; else if (type & PURPLE_MEDIA_RECV_AUDIO) info = manager->priv->audio_sink; else if (type & PURPLE_MEDIA_SEND_VIDEO) info = manager->priv->video_src; else if (type & PURPLE_MEDIA_RECV_VIDEO) info = manager->priv->video_sink; if (info == NULL) return NULL; element_type = purple_media_element_info_get_element_type(info); if (element_type & PURPLE_MEDIA_ELEMENT_UNIQUE && element_type & PURPLE_MEDIA_ELEMENT_SRC) { GstElement *tee; GstPad *pad; GstPad *ghost; gchar *id = purple_media_element_info_get_id(info); ret = gst_bin_get_by_name(GST_BIN( purple_media_manager_get_pipeline( manager)), id); if (ret == NULL) { GstElement *bin, *fakesink; ret = purple_media_element_info_call_create(info, media, session_id, participant); bin = gst_bin_new(id); tee = gst_element_factory_make("tee", "tee"); gst_bin_add_many(GST_BIN(bin), ret, tee, NULL); if (type & PURPLE_MEDIA_SEND_VIDEO) { GstElement *videoscale; GstElement *capsfilter; videoscale = gst_element_factory_make("videoscale", NULL); capsfilter = gst_element_factory_make("capsfilter", "prpl_video_caps"); g_object_set(G_OBJECT(capsfilter), "caps", purple_media_manager_get_video_caps(manager), NULL); gst_bin_add_many(GST_BIN(bin), videoscale, capsfilter, NULL); gst_element_link_many(ret, videoscale, capsfilter, tee, NULL); } else gst_element_link(ret, tee); /* * This shouldn't be necessary, but it stops it from * giving a not-linked error upon destruction */ fakesink = gst_element_factory_make("fakesink", NULL); g_object_set(fakesink, "sync", FALSE, NULL); gst_bin_add(GST_BIN(bin), fakesink); gst_element_link(tee, fakesink); ret = bin; gst_object_ref(ret); gst_bin_add(GST_BIN(purple_media_manager_get_pipeline( manager)), ret); } g_free(id); tee = gst_bin_get_by_name(GST_BIN(ret), "tee"); pad = gst_element_get_request_pad(tee, "src%d"); gst_object_unref(tee); ghost = gst_ghost_pad_new(NULL, pad); gst_object_unref(pad); g_signal_connect(GST_PAD(ghost), "unlinked", G_CALLBACK(request_pad_unlinked_cb), NULL); gst_pad_set_active(ghost, TRUE); gst_element_add_pad(ret, ghost); } else { ret = purple_media_element_info_call_create(info, media, session_id, participant); } if (ret == NULL) purple_debug_error("media", "Error creating source or sink\n"); return ret; #else return NULL; #endif }