<br><br><div class="gmail_quote">2012/1/6 Dejan Tolj <span dir="ltr">&lt;<a href="mailto:dejan1@gmail.com">dejan1@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
I am trying to simulate the following gstreamer pipeline using the C API:<br>
<br>
gst-launch -e videomixer name=mix ! ffmpegcolorspace ! xvimagesink \<br>
  videotestsrc pattern=1  ! video/x-raw-yuv,width=100,height=100 !<br>
videobox border-alpha=0 top=0 left=0 ! mix. \<br>
  videotestsrc pattern=0  ! video/x-raw-yuv,width=100,height=100 !<br>
videobox border-alpha=0 top=0 left=-100 ! mix.<br>
<br>
So far I have:<br>
<br>
#include &lt;gst/gst.h&gt;<br>
#include &lt;glib.h&gt;<br>
<br>
<br>
static gboolean<br>
bus_call (GstBus     *bus,<br>
         GstMessage *msg,<br>
         gpointer    data)<br>
{<br>
 GMainLoop *loop = (GMainLoop *) data;<br>
<br>
 switch (GST_MESSAGE_TYPE (msg)) {<br>
<br>
   case GST_MESSAGE_EOS:<br>
     g_print (&quot;End of stream\n&quot;);<br>
     g_main_loop_quit (loop);<br>
     break;<br>
<br>
   case GST_MESSAGE_ERROR: {<br>
     gchar  *debug;<br>
     GError *error;<br>
<br>
     gst_message_parse_error (msg, &amp;error, &amp;debug);<br>
     g_free (debug);<br>
<br>
     g_printerr (&quot;Error: %s\n&quot;, error-&gt;message);<br>
     g_error_free (error);<br>
<br>
     g_main_loop_quit (loop);<br>
     break;<br>
   }<br>
   default:<br>
     break;<br>
 }<br>
<br>
 return TRUE;<br>
}<br>
<br>
<br>
int<br>
main (int   argc,<br>
     char *argv[])<br>
{<br>
 GMainLoop *loop;<br>
<br>
 GstElement *pipeline;<br>
 GstElement *source1,*source2;<br>
 GstElement *scale,*filter;<br>
 GstElement *videobox1,*videobox2; //just one.<br>
 GstElement *mixer,*clrspace,*sink;<br>
 GstCaps *filtercaps;<br>
 GstBus *bus;<br>
<br>
 /* Initialisation */<br>
 gst_init (&amp;argc, &amp;argv);<br>
<br>
 loop = g_main_loop_new (NULL, FALSE);<br>
<br>
<br>
 /* Check input arguments */<br>
 /*if (argc != 2) {<br>
   g_printerr (&quot;Usage: %s &lt;Ogg/Vorbis filename&gt;\n&quot;, argv[0]);<br>
   return -1;<br>
 }*/<br>
<br>
 //gst-launch videotestsrc pattern=snow ! ximagesink<br>
<br>
 /* Create gstreamer elements */<br>
 pipeline = gst_pipeline_new (&quot;player&quot;);<br>
 source1   = gst_element_factory_make (&quot;videotestsrc&quot;,       &quot;source1&quot;);<br>
 source2   = gst_element_factory_make (&quot;videotestsrc&quot;,       &quot;source2&quot;);<br>
//  source2   = gst_element_factory_make (&quot;uridecodebin&quot;,       &quot;file-source2&quot;);<br>
 scale   = gst_element_factory_make (&quot;videoscale&quot;,       &quot;scale&quot;);<br>
 filter = gst_element_factory_make(&quot;capsfilter&quot;,&quot;filter&quot;);<br>
 videobox1 = gst_element_factory_make (&quot;videobox&quot;,       &quot;videobox1&quot;);<br>
 videobox2 = gst_element_factory_make (&quot;videobox&quot;,       &quot;videobox2&quot;);<br>
 mixer = gst_element_factory_make (&quot;videomixer&quot;,       &quot;mixer&quot;);<br>
 clrspace  = gst_element_factory_make (&quot;ffmpegcolorspace&quot;,       &quot;clrspace&quot;);<br>
<br>
//  demuxer  = gst_element_factory_make (&quot;oggdemux&quot;,      &quot;ogg-demuxer&quot;);<br>
//  decoder  = gst_element_factory_make (&quot;vorbisdec&quot;,     &quot;vorbis-decoder&quot;);<br>
//  conv     = gst_element_factory_make (&quot;audioconvert&quot;,  &quot;converter&quot;);<br>
 sink     = gst_element_factory_make (&quot;xvimagesink&quot;, &quot;sink&quot;);<br>
<br>
 /*if (!pipeline || !source || !demuxer || !decoder || !conv || !sink) {<br>
   g_printerr (&quot;One element could not be created. Exiting.\n&quot;);<br>
   return -1;<br>
 }*/<br>
 if (!pipeline || !source1 || !source2 || !sink) {<br>
   g_printerr (&quot;One element could not be created. Exiting.\n&quot;);<br>
   return -1;<br>
 }<br>
<br>
 filtercaps = gst_caps_new_simple (&quot;video/x-raw-yuv&quot;,<br>
         &quot;width&quot;, G_TYPE_INT, 200,<br>
         &quot;height&quot;, G_TYPE_INT, 100,<br>
         NULL);<br>
 g_object_set (G_OBJECT (filter), &quot;caps&quot;, filtercaps, NULL);<br>
 //gst_caps_unref (filtercaps);<br>
<br>
 g_object_set(videobox1,&quot;border-alpha&quot;,0,&quot;top&quot;,0,&quot;left&quot;,0,NULL);<br>
 g_object_set(videobox2,&quot;border-alpha&quot;,0,&quot;top&quot;,0,&quot;left&quot;,-200,NULL);<br>
<br>
<br>
 /* Set up the pipeline */<br>
<br>
 /* we set the input filename to the source element */<br>
   g_object_set (G_OBJECT (source1), &quot;pattern&quot;, 0, NULL);<br>
   g_object_set (G_OBJECT (source2), &quot;pattern&quot;, 1, NULL);<br>
<br>
 /* we add a message handler */<br>
 bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));<br>
 gst_bus_add_watch (bus, bus_call, loop);<br>
 gst_object_unref (bus);<br>
<br>
 /* we add all elements into the pipeline */<br>
 gst_bin_add_many (GST_BIN (pipeline),<br>
                   source1,filter,videobox1,mixer,clrspace, sink,<br>
source2,videobox2, NULL);<br>
<br>
 /* we link the elements together */<br>
   //gst_element_link_many (source1, scale, filter, videobox1, mixer,<br>
clrspace, sink);<br>
   //gst_element_link_many (source2, scale, filter, videobox2, mixer,<br>
clrspace, sink);<br>
   gst_element_link_many (source1, filter, videobox1, mixer, clrspace, sink);<br>
   gst_element_link_many (source2, filter, videobox2, mixer, clrspace, sink);<br>
<br>
<br>
 /* Set the pipeline to &quot;playing&quot; state*/<br>
 gst_element_set_state (pipeline, GST_STATE_PLAYING);<br>
<br>
 /* Iterate */<br>
 g_print (&quot;Running...\n&quot;);<br>
 g_main_loop_run (loop);<br>
<br>
 /* Out of the main loop, clean up nicely */<br>
 g_print (&quot;Returned, stopping playback\n&quot;);<br>
 gst_element_set_state (pipeline, GST_STATE_NULL);<br>
<br>
 g_print (&quot;Deleting pipeline\n&quot;);<br>
 gst_object_unref (GST_OBJECT (pipeline));<br>
<br>
 return 0;<br>
}<br>
<br>
<br>
I have also set debugging on: export GST_DEBUG=3<br>
<br>
When I run my program I get the following error:<br>
<br>
Running...<br>
0:00:00.178663884  4797  0x8937020 WARN                 basesrc<br>
gstbasesrc.c:2582:gst_base_src_loop:&lt;source2&gt; error: Internal data<br>
flow error.<br>
0:00:00.178766444  4797  0x8937020 WARN                 basesrc<br>
gstbasesrc.c:2582:gst_base_src_loop:&lt;source2&gt; error: streaming task<br>
paused, reason not-linked (-1)<br>
Error: Internal data flow error.<br>
Returned, stopping playback<br>
0:00:00.202571746  4797  0x893ae00 WARN           basetransform<br>
gstbasetransform.c:1627:gst_base_transform_prepare_output_buffer:&lt;clrspace&gt;<br>
pad-alloc failed: wrong-state<br>
0:00:00.202645907  4797  0x893ae00 WARN           basetransform<br>
gstbasetransform.c:2335:gst_base_transform_handle_buffer:&lt;clrspace&gt;<br>
could not get buffer from pool: wrong-state<br>
Deleting pipeline<br>
<br>
<br>
Why is it complaining about source2 not-linked?<br>
_______________________________________________<br>
gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br>
</blockquote></div><br>// linking source2 with filter doesn&#39;t work, because filter is already linked with source1<br>  gst_element_link_many (source2, filter, videobox2, mixer, clrspace, sink, NULL);<br><br>