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'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 <gst.h><br>#include <controller/gstcontroller.h><br><br>#include <iostream><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 ("Dynamic pad created, linking queue\n");<br> sinkpad = gst_element_get_static_pad (elemento, "sink");<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 << "Inicio..." << endl;<br><br> /* init GStreamer */<br> gst_init (&argc, &argv);<br> gst_controller_init (&argc, &argv);<br>
<br> loop = g_main_loop_new (NULL, FALSE); <br><br> /* make sure we have input */<br> if (argc != 3) {<br> g_print ("Usage: %s <filename1> <filename2>\n", argv[0]);<br> return -1;<br> }<br>
<br> src1 = gst_element_factory_make("filesrc", "src1");<br> g_object_set(G_OBJECT(src1),"location",argv[1], NULL);<br><br> src2 = gst_element_factory_make("filesrc", "src2");<br>
g_object_set(G_OBJECT(src1),"location",argv[2], NULL);<br><br> GstElement *pipeline = gst_pipeline_new ("video-player");<br><br> dec1 = gst_element_factory_make("decodebin2","dec1");<br>
<br> dec2 = gst_element_factory_make("decodebin2","dec2");<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 ("alpha","alfa1");<br> smpte = gst_element_factory_make ("smptealpha","smpte");<br> color = gst_element_factory_make ("ffmpegcolorspace", "color");<br>
GstElement * mixer = gst_element_factory_make("videomixer", "mixer");<br><br> if ((!alfa1) || (!smpte) || (!color) || (!mixer))<br> {<br> g_printerr ("Alguno de los elementos del Bin no pudo ser creado. Saliendo\n");<br>
return 0;<br> }<br><br> queue = gst_element_factory_make("queue", "queue");<br> sink = gst_element_factory_make("autovideosink", "sink");<br><br> cout << "Creando 1..." << endl;<br>
<br> // Agrego Controlador<br><br> GstController * ctrl = NULL;<br> if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "alpha",NULL))) /// Here's the error, always return NULL<br> {<br> cout << "ctrl value..." << ctrl << endl; <br>
GST_WARNING ("No puede controlar el elemento fuente\n");<br> return 1;<br> }<br><br> // Todo valor GValue debe inicializarse en 0<br> GValue val_double = { 0, };<br> g_value_init (&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, "alpha", 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(&val_double, 0.0);<br> gst_interpolation_control_source_set(csource,(0 * GST_MSECOND),&val_double);<br>
<br> // Seteo segundo valor<br> g_value_set_double (&val_double, duracion);<br> gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&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), "pad-added", G_CALLBACK (on_pad_added),alfa1);<br> g_signal_connect (G_OBJECT (dec2), "pad-added", 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,"type", transicion, NULL);<br>
<br> /* now run */<br> gst_element_set_state (pipeline, GST_STATE_PLAYING);<br> cout << "Playing..." << 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>