[gst-devel] problem with the getting the output of goom

Vincent Torri Vincent.Torri at iecn.u-nancy.fr
Fri Feb 10 11:39:02 CET 2006


Hello,

i would like to display the output of the goom element. In the pipeline, I
have the following elements :

+---------------------------------------------------------------+
|   +------+   +-------------+                                  |
|   | tee  |   |             |          pipeline                |
|   |      +---+  audio sink |                                  |
|   |      |   |             |                                  |
|   |      |   +-------------+                                  |
|   |      |                                                    |
|   |      |   +----------------------------------------------+ |
|   |      |   | vis bin                                      | |
|   |      |   |   +------+   +------+   +-------+   +------+ | |
|   |      |   |   |      |   |      |   |       |   |      | | |
|   |      +---+---+ conv +---+ goom +---+ queue +---+ fake | | |
|   |      |   |   |      |   |      |   |       |   | sink | | |
|   |      |   |   +------+   +------+   +-------+   +------+ | |
|   +------+   +----------------------------------------------+ |
+---------------------------------------------------------------+

I have a tee and an audio sink.

1) When there is a video stream, the vis bin is not added and the pipeline
plays the video and audio perfectly.

2) When there is no video, I add the vis bin, like above: I create a bin
that I add to the pipeline, I link it to the tee. I connect to the
fakesink a callback on the handoff signal. The audio plays well, but the
handoff callback is not called.

Here is the construction of the vis bin :

static GstElement *
_em_visualisation_sink_create (Emotion_Gstreamer_Video *ev,
Emotion_Video_Sink *vsink)
{
   GstElement         *visbin;
   GstElement         *conv;
   GstElement         *vis;
   GstElement         *queue;
   GstPad             *pad;

   visbin = gst_bin_new ("visbin");

   conv = gst_element_factory_make ("audioconvert", "aconv");
   vis = gst_element_factory_make ("goom", "vis");
   queue = gst_element_factory_make ("queue", NULL);
   vsink->sink = gst_element_factory_make ("fakesink", NULL);
   g_object_set (G_OBJECT (vsink->sink), "sync", TRUE, NULL);
   g_object_set (G_OBJECT (vsink->sink), "signal-handoffs", TRUE, NULL);
   g_signal_connect (G_OBJECT (vsink->sink),
                     "handoff",
                     G_CALLBACK (cb_handoff), ev);

   gst_bin_add_many (GST_BIN (visbin), conv, vis, queue, vsink->sink,
NULL);
   gst_element_link_many (conv, vis, queue, vsink->sink, NULL);

   pad = gst_element_get_pad (conv, "sink");
   gst_element_add_pad (visbin, gst_ghost_pad_new ("sink", pad));
   gst_object_unref (pad);

  return visbin;
}

Here is how I add that bin:

{
  GstElement         *vissink;
  GstElement         *tee;
  GstPad             *vispad;
  GstPad             *teepad;

  vissink = _em_visualisation_sink_create (ev);
  gst_bin_add (GST_BIN (ev->pipeline), vissink);
  tee = gst_bin_get_by_name (GST_BIN (ev->pipeline), "tee1");

  vispad = gst_element_get_pad (vissink, "sink");
  teepad = gst_element_get_request_pad (tee, "src%d");
  gst_pad_link (teepad, vispad);
  gst_object_unref (teepad);
  gst_object_unref (vispad);

  gst_element_set_state (vissink, GST_STATE_PAUSED);
}

It's not a problem with the audio as the audio stream plays fine. The
callback is just not called.

I've also tried to not use the vis bin, and add and link directly the
elements (and set them in the PAUSED state). Same problem.

Maybe it's a stupid thing like an element not linked or not added, but I
have verified that a lot of times.

Maybe it's a bit deeper and I don't see the problem.

Does someone see a problem with that code ?

thank you

Vincent Torri




More information about the gstreamer-devel mailing list