Hello everyone, I am translating the following code to C/C++: <a href="http://notes.brooks.nu/2011/01/python-gstreamer-controller/">http://notes.brooks.nu/2011/01/python-gstreamer-controller/</a><br>It&#39;s a controller for controlling the alpha channel during crossfade, I adapted it for transitions, using, smpte instead.<br>
<br>The fact is it returns NULL and the programs stop running. The code is below, I appreciate any suggestion.<br>I am a bit clueless is an adaptation of a code I did before and it works.<br><br>Thanks and regards.<br><br>
Rossana<br><br>//// the code<br><br>#include &lt;gst.h&gt;<br>#include &lt;controller/gstcontroller.h&gt;<br><br>#include &lt;iostream&gt;<br><br><br>using namespace std;<br><br>// Manejador de errores<br>static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)<br>
{<br>::::::::::::::::::::::::................<br>}<br><br>static void on_pad_added (GstElement *element, GstPad *pad, gpointer  data)<br>{<br>  GstPad *sinkpad = NULL;<br>  GstElement * elemento = (GstElement *) data;<br>
<br><br>  /* Ahora linkeo el pad de comp con sink pad */<br>  g_print (&quot;Dynamic pad created, linking queue\n&quot;);<br>  sinkpad = gst_element_get_static_pad (elemento, &quot;sink&quot;);<br><br><br>  gst_pad_link (pad, sinkpad);<br>
  gst_object_unref(sinkpad);<br><br>}<br><br><br>int main(int argc, char *argv[])<br>{<br><br>  GMainLoop *loop = NULL;<br><br>  GstElement *src1, *src2,*dec1,*dec2,*alfa1,*color,*smpte,*queue,*sink;<br>  GstBus *bus;<br>
<br>  gdouble duracion = 500;<br>  gint transicion = 1;<br><br>  cout &lt;&lt; &quot;Inicio...&quot; &lt;&lt; endl;<br><br>    /* init GStreamer */<br>  gst_init (&amp;argc, &amp;argv);<br>  gst_controller_init (&amp;argc, &amp;argv);<br>
<br>  loop = g_main_loop_new (NULL, FALSE);  <br><br>  /* make sure we have input */<br>  if (argc != 3) {<br>    g_print (&quot;Usage: %s &lt;filename1&gt; &lt;filename2&gt;\n&quot;, argv[0]);<br>    return -1;<br>  }<br>
  <br>  src1 = gst_element_factory_make(&quot;filesrc&quot;, &quot;src1&quot;);<br>  g_object_set(G_OBJECT(src1),&quot;location&quot;,argv[1], NULL);<br><br>  src2 = gst_element_factory_make(&quot;filesrc&quot;, &quot;src2&quot;);<br>
  g_object_set(G_OBJECT(src1),&quot;location&quot;,argv[2], NULL);<br><br>  GstElement *pipeline = gst_pipeline_new (&quot;video-player&quot;);<br><br>  dec1 = gst_element_factory_make(&quot;decodebin2&quot;,&quot;dec1&quot;);<br>
<br>  dec2 = gst_element_factory_make(&quot;decodebin2&quot;,&quot;dec2&quot;);<br><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>  alfa1   = gst_element_factory_make (&quot;alpha&quot;,&quot;alfa1&quot;);<br>  smpte  = gst_element_factory_make (&quot;smptealpha&quot;,&quot;smpte&quot;);<br>  color  = gst_element_factory_make (&quot;ffmpegcolorspace&quot;, &quot;color&quot;);<br>
  GstElement * mixer  = gst_element_factory_make(&quot;videomixer&quot;, &quot;mixer&quot;);<br><br>  if ((!alfa1) || (!smpte) || (!color) || (!mixer))<br>  {<br>      g_printerr (&quot;Alguno de los elementos del Bin no pudo ser creado. Saliendo\n&quot;);<br>
     return 0;<br>  }<br><br>  queue = gst_element_factory_make(&quot;queue&quot;, &quot;queue&quot;);<br>  sink  = gst_element_factory_make(&quot;autovideosink&quot;, &quot;sink&quot;);<br><br>  cout &lt;&lt; &quot;Creando 1...&quot; &lt;&lt; endl;<br>
<br>  // Agrego Controlador<br><br>  GstController * ctrl = NULL;<br>  if (!(ctrl = gst_controller_new (G_OBJECT(smpte), &quot;alpha&quot;,NULL)))  /// Here&#39;s the error, always return NULL<br>  {<br>        cout &lt;&lt; &quot;ctrl value...&quot; &lt;&lt; ctrl &lt;&lt; endl;         <br>
        GST_WARNING (&quot;No puede controlar el elemento fuente\n&quot;);<br>        return 1;<br>  }<br><br>  // Todo valor GValue debe inicializarse en 0<br>  GValue val_double = { 0, };<br>  g_value_init (&amp;val_double, G_TYPE_DOUBLE);<br>
<br><br>  // Creo la fuente al controlador y la asocio al controlador<br>  // Seteo modo de interpolacion<br><br>  GstInterpolationControlSource * csource = gst_interpolation_control_source_new();<br>  gst_controller_set_control_source (ctrl, &quot;alpha&quot;, GST_CONTROL_SOURCE (csource));<br>
<br>  gst_interpolation_control_source_set_interpolation_mode(csource,GST_INTERPOLATE_LINEAR);<br><br>  // Seteo primer valor<br>  g_value_set_double(&amp;val_double, 0.0);<br>  gst_interpolation_control_source_set(csource,(0 * GST_MSECOND),&amp;val_double);<br>
<br>  // Seteo segundo valor<br>  g_value_set_double (&amp;val_double, duracion);<br>  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&amp;val_double);<br><br>  g_object_unref (csource);<br><br>  gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1, smpte, mixer, queue, color, sink, NULL);<br>
  g_signal_connect (G_OBJECT (dec1), &quot;pad-added&quot;, G_CALLBACK (on_pad_added),alfa1);<br>  g_signal_connect (G_OBJECT (dec2), &quot;pad-added&quot;, G_CALLBACK (on_pad_added),smpte);<br><br>  gst_element_link (src1,dec1);<br>
  gst_element_link (src2,dec2);<br>  gst_element_link (alfa1,mixer);<br>  gst_element_link (smpte,mixer);<br>  gst_element_link (mixer,queue);<br>  gst_element_link (queue,sink);<br>  g_object_set(smpte,&quot;type&quot;, transicion, NULL);<br>
<br>  /* now run */<br>  gst_element_set_state (pipeline, GST_STATE_PLAYING);<br>  cout &lt;&lt; &quot;Playing...&quot; &lt;&lt; endl;<br>  g_main_loop_run (loop);<br><br>    /* also clean up */<br>  gst_element_set_state (pipeline, GST_STATE_NULL);<br>
  gst_object_unref (GST_OBJECT (pipeline));<br><br>  return 0;<br>}<br><br><br><br>