gst/playback/gstplaybin.c: Added vis plugin support, need to configure the vis element to activate it.

Original commit message from CVS:
* gst/playback/gstplaybin.c: (gen_video_element),
(gen_vis_element), (remove_sinks), (setup_sinks):
Added vis plugin support, need to configure the vis
element to activate it.
This commit is contained in:
Wim Taymans 2004-10-12 16:41:23 +00:00
parent e3a0b57b75
commit 06addff261
2 changed files with 120 additions and 8 deletions

View file

@ -1,3 +1,10 @@
2004-10-12 Wim Taymans <wim@fluendo.com>
* gst/playback/gstplaybin.c: (gen_video_element),
(gen_vis_element), (remove_sinks), (setup_sinks):
Added vis plugin support, need to configure the vis
element to activate it.
2004-10-12 Ronald S. Bultje <rbultje@ronald.bitfreak.net> 2004-10-12 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
* ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get), * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get),

View file

@ -342,7 +342,7 @@ gen_video_element (GstPlayBin * play_bin)
gst_object_ref (GST_OBJECT (play_bin->video_sink)); gst_object_ref (GST_OBJECT (play_bin->video_sink));
sink = play_bin->video_sink; sink = play_bin->video_sink;
} else { } else {
sink = gst_element_factory_make ("ximagesink", "sink"); sink = gst_element_factory_make ("xvimagesink", "sink");
} }
g_hash_table_insert (play_bin->cache, "video_sink", sink); g_hash_table_insert (play_bin->cache, "video_sink", sink);
@ -424,10 +424,84 @@ done:
return element; return element;
} }
static GstElement *
gen_vis_element (GstPlayBin * play_bin)
{
GstElement *element;
GstElement *tee;
GstElement *asink;
GstElement *vsink;
GstElement *conv;
GstElement *vis;
GstElement *vqueue;
GstElement *vthread;
element = gst_bin_new ("visbin");
tee = gst_element_factory_make ("tee", "tee");
vqueue = gst_element_factory_make ("queue", "vqueue");
vthread = gst_element_factory_make ("thread", "vthread");
asink = gen_audio_element (play_bin);
vsink = gen_video_element (play_bin);
gst_bin_add (GST_BIN (element), asink);
gst_bin_add (GST_BIN (element), vqueue);
gst_bin_add (GST_BIN (vthread), vsink);
gst_bin_add (GST_BIN (element), vthread);
gst_bin_add (GST_BIN (element), tee);
conv = gst_element_factory_make ("audioconvert", "aconv");
if (play_bin->visualisation) {
gst_object_ref (GST_OBJECT (play_bin->visualisation));
vis = play_bin->visualisation;
} else {
vis = gst_element_factory_make ("goom", "vis");
}
gst_bin_add (GST_BIN (element), conv);
gst_bin_add (GST_BIN (element), vis);
gst_element_link_pads (conv, "src", vis, "sink");
gst_element_link_pads (vis, "src", vqueue, "sink");
gst_element_link_pads (vqueue, "src", vsink, "sink");
gst_pad_link (gst_element_get_request_pad (tee, "src%d"),
gst_element_get_pad (asink, "sink"));
gst_pad_link (gst_element_get_request_pad (tee, "src%d"),
gst_element_get_pad (conv, "sink"));
gst_element_add_ghost_pad (element,
gst_element_get_pad (tee, "sink"), "sink");
//gst_element_set_state (element, GST_STATE_READY);
return element;
}
static void static void
remove_sinks (GstPlayBin * play_bin) remove_sinks (GstPlayBin * play_bin)
{ {
GList *sinks; GList *sinks;
GstObject *parent;
GstElement *element;
element = g_hash_table_lookup (play_bin->cache, "abin");
if (element != NULL) {
parent = gst_element_get_parent (element);
if (parent != NULL) {
gst_bin_remove (GST_BIN (parent), element);
}
}
element = g_hash_table_lookup (play_bin->cache, "vbin");
if (element != NULL) {
parent = gst_element_get_parent (element);
if (parent != NULL) {
gst_bin_remove (GST_BIN (parent), element);
}
}
for (sinks = play_bin->sinks; sinks; sinks = g_list_next (sinks)) { for (sinks = play_bin->sinks; sinks; sinks = g_list_next (sinks)) {
GstElement *element = GST_ELEMENT (sinks->data); GstElement *element = GST_ELEMENT (sinks->data);
@ -451,12 +525,39 @@ setup_sinks (GstPlayBin * play_bin)
{ {
GList *streaminfo; GList *streaminfo;
GList *s; GList *s;
gboolean have_audio = FALSE; gint num_audio = 0;
gboolean have_video = FALSE; gint num_video = 0;
gboolean need_vis = FALSE;
/* get info about the stream */ /* get info about the stream */
g_object_get (G_OBJECT (play_bin), "stream-info", &streaminfo, NULL); g_object_get (G_OBJECT (play_bin), "stream-info", &streaminfo, NULL);
/* first examine the streams we have */
for (s = streaminfo; s; s = g_list_next (s)) {
GObject *obj = G_OBJECT (s->data);
gint type;
GstPad *srcpad;
g_object_get (obj, "type", &type, NULL);
g_object_get (obj, "pad", &srcpad, NULL);
if (gst_pad_is_linked (srcpad))
continue;
if (type == 1) {
num_audio++;
} else if (type == 2) {
num_video++;
}
}
/* no video, use vis */
if (num_video == 0 && num_audio > 0 && play_bin->visualisation) {
need_vis = TRUE;
}
num_audio = 0;
num_video = 0;
for (s = streaminfo; s; s = g_list_next (s)) { for (s = streaminfo; s; s = g_list_next (s)) {
GObject *obj = G_OBJECT (s->data); GObject *obj = G_OBJECT (s->data);
gint type; gint type;
@ -472,20 +573,24 @@ setup_sinks (GstPlayBin * play_bin)
continue; continue;
if (type == 1) { if (type == 1) {
if (have_audio) { if (num_audio > 0) {
g_warning ("two audio streams found, playing first one"); g_warning ("two audio streams found, playing first one");
mute = TRUE; mute = TRUE;
} else { } else {
sink = gen_audio_element (play_bin); if (need_vis) {
have_audio = TRUE; sink = gen_vis_element (play_bin);
} else {
sink = gen_audio_element (play_bin);
}
num_audio++;
} }
} else if (type == 2) { } else if (type == 2) {
if (have_video) { if (num_video > 0) {
g_warning ("two video streams found, playing first one"); g_warning ("two video streams found, playing first one");
mute = TRUE; mute = TRUE;
} else { } else {
sink = gen_video_element (play_bin); sink = gen_video_element (play_bin);
have_video = TRUE; num_video++;
} }
} else { } else {
g_warning ("unknown stream found"); g_warning ("unknown stream found");