Invalid property's type for a controller at runtime: `G_VALUE_TYPE (value) == self->priv->type' failed
Rossana Guerra
guerra.rossana at gmail.com
Mon Oct 31 10:05:29 PDT 2011
thanks for response, it helps me a lot. In fact I need audio as well, I'll
work around it, at least with one file.
Regards,
Rossana
2011/10/31 Stefan Sauer <ensonic at hora-obscura.de>
> **
> On 10/30/2011 02:15 AM, Rossana Guerra wrote:
>
> Hi Stefan, I saw and run the code. I noticed the differences, mostly in
> the "on-pad-added" function.
> You create a fakesink where the "flow" doesn't come from video, then you
> create a bin from the parent element and got the static pad from it for
> linking. I didn't get the meaning of this technique.
>
>
> There where two distinct bugs. The first was to use src1 twice for the
> pad-aaded callback if I recall right. The 2nd is that in the pad-addded
> callback you get pads for audio and video. You want to terminate the
> audio-pads with a fakesink and only connect the video-pads to videomixer.
> If you want the adio too, you'll need to use a similar setup like
> videomixer, but using adder.
>
> You will still need to ensure that both video-outputs are in a compatible
> format for videomxer. I did not had time to analyze further. Use the
> GST_DEBUG_BIN_TO_DOT_FILE to understand whats in the resulting pipeline and
> where it goes wrong.
>
> Stefan
>
>
> I have an "internal data flow error" message. Here's the output when I run
> with debug option as you pointed out.
>
> Debug information:
>
> rossana at Studio:~/CodeBlocks/ctrl/bin/Debug$ GST_DEBUG="*:2" ./ctrl
> "/home/rossana/video1.avi" "/home/rossana/video2.avi"
> Inicio...
> Creando...
> Creando pipeline...
> Creando 1...
> Playing...
> Dynamic pad created: video/x-raw-rgb
> ... linking video
> Dynamic pad created: audio/x-raw-int
> ... dropping audio
> 0:00:00.064628890 4083 0x157f070
> WARN basetransform
> gstbasetransform.c:1211:gst_base_transform_setcaps:<alfa1> transform could
> not transform video/x-raw-yuv, width=(int)720,
> height=(int)528, framerate=(fraction)25/1, format=(fourcc)I420,
> interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1 in anything we
> support
> Dynamic pad created: video/x-raw-rgb
> ... linking video
> Dynamic pad created: audio/x-raw-int
> ... dropping audio
> 0:00:00.076359290 4083 0x1545b80
> WARN ffmpeg gstffmpegdec.c:2241:gst_ffmpegdec_frame:<ffdec_mpeg40>
> ffdec_mpeg4: decoding error (len: -1, have_data: 0)
>
>
> I am trying to play 2 .avi files, I have no problem to visualize them with
> Banshee or any other player, so I think I got the right codecs in my
> computer.
> Both videos have the same properties values:
>
> *Video:
>
> Dimension 720x528
> Codec DivX MPEG-4 Version 5
> 25 fps
> bit rate: N/A
>
> * Sound:
> Codec MPEG1 Audio, layer
> Channels Stereo
> Frec 44100Hz
> bit rate 127 kpbs
>
> I'll keep trying, and thanks for your suggestions. Nice weekend.
>
> Rossana
>
>
>
> 2011/10/28 Rossana Guerra <guerra.rossana at gmail.com>
>
>> Hi Stefan, I didn't receive the email, I even looked into the spam
>> folder, just in case....
>>
>> 2011/10/28 Stefan Sauer <ensonic at hora-obscura.de>
>>
>>> On 10/28/2011 12:40 AM, Rossana Guerra wrote:
>>>
>>> Sorry Stefan, where is the code to compare with?
>>>
>>> I forwarded the mail to your personal address. Out mailing list tried
>>> to be super smart and stipped attached *sourcecode*.
>>>
>>>
>>> ..I downloaded the doc (pdf) and the order remains the same.
>>>
>>> I pushed the fix to the API docs to git. That does not regenerate the
>>> pdf. To be sure which pdf exactly are you talking about?
>>>
>>
>>
>> The pdf asociated with the html file, the one that has this chapter:
>>
>> http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/section-dparams-parameters.html
>> http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf
>>
>> thanks
>>
>>
>>
>>> Stefan
>>>
>>>
>>> Regards and thanks
>>>
>>>
>>> 2011/10/27 Stefan Sauer <ensonic at hora-obscura.de>
>>>
>>>> Hi,
>>>> On 10/27/2011 01:37 AM, Rossana Guerra wrote:
>>>>
>>>> Well the error type disappeared, it was due where the place the
>>>> gst_controller_set_control_source (ctrl, "position", GST_CONTROL_SOURCE
>>>> (csource)) sentence was.
>>>> The first time I did it according the documentation, at the end of the
>>>> value sets of the control source. It seems it isn't the right place, I
>>>> changed the sentences right after creating the controller, it seems it
>>>> works. Hope it helps someone else.
>>>>
>>>> I fix the wrong order of calls in the docs.
>>>>
>>>> In this way:
>>>>
>>>>
>>>> I made a few more fixes - compare your source and mine in a diff viewer
>>>> (e.g. meld). You still need to do more stuff to ensure both sources can be
>>>> mixed (run it as GST_DEBUG="*:2" ./ctrl <file1> <file2> to see the
>>>> warnings).
>>>>
>>>> Stefan
>>>>
>>>>
>>>> GstInterpolationControlSource * csource =
>>>> gst_interpolation_control_source_new();
>>>>
>>>>
>>>> gst_interpolation_control_source_set_interpolation_mode(csource,GST_INTERPOLATE_LINEAR);
>>>> gst_controller_set_control_source (ctrl, "position", GST_CONTROL_SOURCE
>>>> (csource));
>>>>
>>>> (Now the runtime is another! but one less at least)
>>>>
>>>> Specially thanks to Stefan!
>>>>
>>>>
>>>> Here is the complete code:
>>>>
>>>> #include <gst.h>
>>>> #include <controller/gstcontroller.h>
>>>>
>>>> #include <iostream>
>>>> #include <string.h>
>>>>
>>>> using namespace std;
>>>>
>>>> // Manejador de errores
>>>> static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
>>>> {
>>>> GMainLoop *loop = (GMainLoop *) data;
>>>>
>>>> switch (GST_MESSAGE_TYPE (msg))
>>>> {
>>>> case GST_MESSAGE_EOS:
>>>> g_print ("Final de stream\n");
>>>> g_main_loop_quit (loop);
>>>> break;
>>>> case GST_MESSAGE_ERROR:
>>>> {
>>>> gchar *debug;
>>>> GError *error;
>>>> gst_message_parse_error (msg, &error, &debug);
>>>> g_free (debug);
>>>> g_printerr ("Error: %s\n", error->message);
>>>> g_error_free (error);
>>>> g_main_loop_quit (loop);
>>>> break;
>>>> }
>>>> default:
>>>> break;
>>>> }
>>>> return TRUE;
>>>> }
>>>>
>>>> static void on_pad_added (GstElement *element, GstPad *pad, gpointer
>>>> data)
>>>> {
>>>> GstPad *sinkpad = NULL;
>>>> GstElement * elemento = (GstElement *) data;
>>>>
>>>>
>>>> /* Ahora linkeo el pad de comp con sink pad */
>>>> g_print ("Dynamic pad created, linking queue\n");
>>>> sinkpad = gst_element_get_static_pad (elemento, "sink");
>>>>
>>>>
>>>> gst_pad_link (pad, sinkpad);
>>>> gst_object_unref(sinkpad);
>>>>
>>>> }
>>>>
>>>> int main(int argc, char *argv[])
>>>> {
>>>>
>>>> GMainLoop *loop = NULL;
>>>>
>>>> GstElement *src1, *src2,*dec1,*dec2,*alfa1,*color,*smpte,*queue,*sink;
>>>> GstBus *bus;
>>>>
>>>> gdouble duracion = 500.0;
>>>> gint transicion = 1;
>>>>
>>>> cout << "Inicio..." << endl;
>>>>
>>>> /* init GStreamer */
>>>> gst_init (&argc, &argv);
>>>> bool iniciado = gst_controller_init (&argc, &argv);
>>>>
>>>> loop = g_main_loop_new (NULL, FALSE);
>>>> //gint transicion = 1;
>>>>
>>>> /* make sure we have input */
>>>> if (argc != 3) {
>>>> g_print ("Usage: %s <filename1> <filename2>\n", argv[0]);
>>>> return -1;
>>>> }
>>>>
>>>> cout << "Creando..." << endl;
>>>> src1 = gst_element_factory_make("filesrc", "src1");
>>>> g_object_set(G_OBJECT(src1),"location",argv[1], NULL);
>>>>
>>>> src2 = gst_element_factory_make("filesrc", "src2");
>>>> g_object_set(G_OBJECT(src1),"location",argv[2], NULL);
>>>>
>>>> GstElement *pipeline = gst_pipeline_new ("video-player");
>>>>
>>>> dec1 = gst_element_factory_make("decodebin2","dec1");
>>>>
>>>> dec2 = gst_element_factory_make("decodebin2","dec2");
>>>>
>>>> cout << "Creando pipeline..." << endl;
>>>>
>>>> bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
>>>> gst_bus_add_watch (bus, bus_call, loop);
>>>> gst_object_unref (bus);
>>>>
>>>> alfa1 = gst_element_factory_make ("alpha","alfa1");
>>>> smpte = gst_element_factory_make ("smptealpha","smpte");
>>>> g_object_set(smpte,"type", transicion, NULL);
>>>> color = gst_element_factory_make ("ffmpegcolorspace", "color");
>>>> GstElement * mixer = gst_element_factory_make("videomixer", "mixer");
>>>>
>>>> if ((!alfa1) || (!smpte) || (!color) || (!mixer))
>>>> {
>>>> g_printerr ("Alguno de los elementos del Bin no pudo ser creado.
>>>> Saliendo\n");
>>>> return 0;
>>>> }
>>>>
>>>>
>>>> cout << "Creando 1..." << endl;
>>>>
>>>> // Agrego Controlador
>>>>
>>>> GstController * ctrl = gst_object_control_properties(G_OBJECT(smpte),
>>>> "position",NULL);
>>>>
>>>> if (ctrl == NULL)
>>>> {
>>>> GST_WARNING ("No puede controlar el elemento fuente\n");
>>>> return 1;
>>>> }
>>>>
>>>> // Todo valor GValue debe inicializarse en 0
>>>> GValue val_double = { 0, };
>>>> g_value_init (&val_double, G_TYPE_DOUBLE);
>>>>
>>>> // Creo la fuente al controlador y la asocio al controlador
>>>> // Seteo modo de interpolacion
>>>>
>>>> GstInterpolationControlSource * csource =
>>>> gst_interpolation_control_source_new();
>>>>
>>>>
>>>> gst_interpolation_control_source_set_interpolation_mode(csource,GST_INTERPOLATE_LINEAR);
>>>> gst_controller_set_control_source (ctrl, "position",
>>>> GST_CONTROL_SOURCE (csource));
>>>>
>>>> // Seteo primer valor
>>>> g_value_set_double(&val_double, 0.0);
>>>> gst_interpolation_control_source_set(csource,(0 *
>>>> GST_MSECOND),&val_double);
>>>>
>>>> // Seteo segundo valor
>>>> g_value_set_double(&val_double, 1.0);
>>>>
>>>> gst_interpolation_control_source_set(csource,(duracion*GST_MSECOND),&val_double);
>>>>
>>>> //gst_controller_set_control_source (ctrl, "position",
>>>> GST_CONTROL_SOURCE (csource));
>>>>
>>>> g_object_unref (csource);
>>>> g_value_unset (&val_double);
>>>>
>>>> g_signal_connect (G_OBJECT (dec1), "pad-added", G_CALLBACK
>>>> (on_pad_added),alfa1);
>>>> g_signal_connect (G_OBJECT (dec2), "pad-added", G_CALLBACK
>>>> (on_pad_added),smpte);
>>>>
>>>> queue = gst_element_factory_make("queue", "queue");
>>>> sink = gst_element_factory_make("autovideosink", "sink");
>>>>
>>>> gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1,
>>>> smpte, mixer, queue, color, sink, NULL);
>>>>
>>>> gst_element_link (src1,dec1);
>>>> gst_element_link (src2,dec2);
>>>> gst_element_link (alfa1,mixer);
>>>> gst_element_link (smpte,mixer);
>>>> gst_element_link (mixer,queue);
>>>> gst_element_link (queue,sink);
>>>>
>>>>
>>>> /* now run */
>>>> gst_element_set_state (pipeline, GST_STATE_PLAYING);
>>>> cout << "Playing..." << endl;
>>>> g_main_loop_run (loop);
>>>>
>>>> /* also clean up */
>>>> gst_element_set_state (pipeline, GST_STATE_NULL);
>>>> gst_object_unref (GST_OBJECT (pipeline));
>>>>
>>>> return 0;
>>>> }
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> 2011/10/26 Rossana Guerra <guerra.rossana at gmail.com>
>>>>
>>>>> Sorry, I had some copy/paste errors. Here's the code, the runtime
>>>>> error is:
>>>>>
>>>>> CRITICAL **: gst_interpolation_control_source_set: assertion
>>>>> `G_VALUE_TYPE (value) == self->priv->type' failed.
>>>>>
>>>>> I changed the duracion value variable unit to second (replacing 500
>>>>> with 5), and I tryed with GST_SECOND insted, but it didn't work.
>>>>> So I wrote it back to GST_MSECOND.
>>>>>
>>>>> The code ΅without" typing errors:
>>>>>
>>>>>
>>>>> #include <gst.h>
>>>>> #include <controller/gstcontroller.h>
>>>>>
>>>>> #include <iostream>
>>>>> #include <string.h>
>>>>>
>>>>>
>>>>> using namespace std;
>>>>>
>>>>> // Manejador de errores
>>>>>
>>>>> static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
>>>>> {
>>>>> GMainLoop *loop = (GMainLoop *) data;
>>>>>
>>>>> switch (GST_MESSAGE_TYPE (msg))
>>>>> {
>>>>> case GST_MESSAGE_EOS:
>>>>> g_print ("Final de stream\n");
>>>>> g_main_loop_quit (loop);
>>>>> break;
>>>>> case GST_MESSAGE_ERROR:
>>>>> {
>>>>> gchar *debug;
>>>>> GError *error;
>>>>> gst_message_parse_error (msg, &error, &debug);
>>>>> g_free (debug);
>>>>> g_printerr ("Error: %s\n", error->message);
>>>>> g_error_free (error);
>>>>> g_main_loop_quit (loop);
>>>>> break;
>>>>> }
>>>>> default:
>>>>> break;
>>>>> }
>>>>> return TRUE;
>>>>> }
>>>>>
>>>>> static void on_pad_added (GstElement *element, GstPad *pad, gpointer
>>>>> data)
>>>>> {
>>>>> GstPad *sinkpad = NULL;
>>>>> GstElement * elemento = (GstElement *) data;
>>>>>
>>>>>
>>>>> /* Ahora linkeo el pad de comp con sink pad */
>>>>> g_print ("Dynamic pad created, linking queue\n");
>>>>> sinkpad = gst_element_get_static_pad (elemento, "sink");
>>>>>
>>>>>
>>>>> gst_pad_link (pad, sinkpad);
>>>>> gst_object_unref(sinkpad);
>>>>>
>>>>> }
>>>>>
>>>>>
>>>>> int main(int argc, char *argv[])
>>>>> {
>>>>>
>>>>> GMainLoop *loop = NULL;
>>>>>
>>>>> GstElement *src1,
>>>>> *src2,*dec1,*dec2,*alfa1,*color,*smpte,*queue,*sink;
>>>>> GstBus *bus;
>>>>>
>>>>> guint duracion = 500;
>>>>> gint transicion = 1;
>>>>>
>>>>> cout << "Inicio..." << endl;
>>>>>
>>>>>
>>>>> /* init GStreamer */
>>>>> gst_init (&argc, &argv);
>>>>> bool iniciado = gst_controller_init (&argc, &argv);
>>>>>
>>>>> loop = g_main_loop_new (NULL, FALSE);
>>>>>
>>>>> if (argc != 3) {
>>>>> g_print ("Usage: %s <filename1> <filename2>\n", argv[0]);
>>>>> return -1;
>>>>> }
>>>>>
>>>>> cout << "Creando..." << endl;
>>>>>
>>>>> src1 = gst_element_factory_make("filesrc", "src1");
>>>>> g_object_set(G_OBJECT(src1),"location",argv[1], NULL);
>>>>>
>>>>> src2 = gst_element_factory_make("filesrc", "src2");
>>>>> g_object_set(G_OBJECT(src1),"location",argv[2], NULL);
>>>>>
>>>>> GstElement *pipeline = gst_pipeline_new ("video-player");
>>>>>
>>>>> dec1 = gst_element_factory_make("decodebin2","dec1");
>>>>>
>>>>> dec2 = gst_element_factory_make("decodebin2","dec2");
>>>>>
>>>>> cout << "Creando pipeline..." << endl;
>>>>>
>>>>> bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
>>>>> gst_bus_add_watch (bus, bus_call, loop);
>>>>> gst_object_unref (bus);
>>>>>
>>>>> alfa1 = gst_element_factory_make ("alpha","alfa1");
>>>>> smpte = gst_element_factory_make ("smptealpha","smpte");
>>>>> g_object_set(smpte,"type", transicion, NULL);
>>>>> color = gst_element_factory_make ("ffmpegcolorspace", "color");
>>>>> GstElement * mixer = gst_element_factory_make("videomixer",
>>>>> "mixer");
>>>>>
>>>>> if ((!alfa1) || (!smpte) || (!color) || (!mixer))
>>>>> {
>>>>> g_printerr ("Alguno de los elementos del Bin no pudo ser creado.
>>>>> Saliendo\n");
>>>>> return 0;
>>>>> }
>>>>>
>>>>>
>>>>> // Agrego Controlador
>>>>>
>>>>>
>>>>> GstController * ctrl =
>>>>> gst_object_control_properties(G_OBJECT(smpte), "position",NULL);
>>>>>
>>>>> if (ctrl == NULL)
>>>>> {
>>>>> GST_WARNING ("No puede controlar el elemento fuente\n");
>>>>> return 1;
>>>>> }
>>>>>
>>>>> // Todo valor GValue debe inicializarse en 0
>>>>> GValue val_int = { 0, };
>>>>> g_value_init (&val_int, G_TYPE_INT);
>>>>>
>>>>>
>>>>> // Set interpolation mode
>>>>>
>>>>> GstInterpolationControlSource * csource =
>>>>> gst_interpolation_control_source_new();
>>>>>
>>>>>
>>>>> gst_interpolation_control_source_set_interpolation_mode(csource,GST_INTERPOLATE_LINEAR);
>>>>>
>>>>> // Seteo primer valor
>>>>> g_value_set_int(&val_int, 0);
>>>>> gst_interpolation_control_source_set(csource,(0 *
>>>>> GST_MSECOND),&val_int);
>>>>>
>>>>> // Seteo segundo valor
>>>>> g_value_set_int (&val_int, 1);
>>>>>
>>>>> gst_interpolation_control_source_set(csource,(duracion*GST_MSECOND),&val_int);
>>>>>
>>>>>
>>>>>
>>>>> gst_controller_set_control_source (ctrl, "position",
>>>>> GST_CONTROL_SOURCE (csource));
>>>>>
>>>>> g_object_unref (csource);
>>>>> g_value_unset (&val_int);
>>>>>
>>>>>
>>>>> g_signal_connect (G_OBJECT (dec1), "pad-added", G_CALLBACK
>>>>> (on_pad_added),alfa1);
>>>>> g_signal_connect (G_OBJECT (dec2), "pad-added", G_CALLBACK
>>>>> (on_pad_added),smpte);
>>>>>
>>>>> queue = gst_element_factory_make("queue", "queue");
>>>>> sink = gst_element_factory_make("autovideosink", "sink");
>>>>>
>>>>> gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1,
>>>>> smpte, mixer, queue, color, sink, NULL);
>>>>>
>>>>> gst_element_link (src1,dec1);
>>>>> gst_element_link (src2,dec2);
>>>>> gst_element_link (alfa1,mixer);
>>>>> gst_element_link (smpte,mixer);
>>>>> gst_element_link (mixer,queue);
>>>>> gst_element_link (queue,sink);
>>>>>
>>>>>
>>>>> /* now run */
>>>>> gst_element_set_state (pipeline, GST_STATE_PLAYING);
>>>>> cout << "Playing..." << endl;
>>>>> g_main_loop_run (loop);
>>>>>
>>>>> /* also clean up */
>>>>> gst_element_set_state (pipeline, GST_STATE_NULL);
>>>>> gst_object_unref (GST_OBJECT (pipeline));
>>>>>
>>>>> return 0;
>>>>> }
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> 2011/10/26 Rossana Guerra <guerra.rossana at gmail.com>
>>>>>
>>>>>> Where it says guint duration = 500.0 it should say guint duration =
>>>>>> 500. Nonetheless, the error persists.
>>>>>>
>>>>>>
>>>>>> 2011/10/26 Rossana Guerra <guerra.rossana at gmail.com>
>>>>>>
>>>>>>> HI Stefan, thanks for your help, I changed the variable type from
>>>>>>> gdouble to guint, same error.
>>>>>>>
>>>>>>> Here's the whole code example:
>>>>>>>
>>>>>>>
>>>>>>> #include <gst.h>
>>>>>>> #include <controller/gstcontroller.h>
>>>>>>> #include <iostream>
>>>>>>>
>>>>>>>
>>>>>>> using namespace std;
>>>>>>>
>>>>>>> // Error handler
>>>>>>> static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer
>>>>>>> data)
>>>>>>> {
>>>>>>> GMainLoop *loop = (GMainLoop *) data;
>>>>>>>
>>>>>>> switch (GST_MESSAGE_TYPE (msg))
>>>>>>> {
>>>>>>> case GST_MESSAGE_EOS:
>>>>>>> g_print ("Final de stream\n");
>>>>>>> g_main_loop_quit (loop);
>>>>>>> break;
>>>>>>> case GST_MESSAGE_ERROR:
>>>>>>> {
>>>>>>> gchar *debug;
>>>>>>> GError *error;
>>>>>>> gst_message_parse_error (msg, &error, &debug);
>>>>>>> g_free (debug);
>>>>>>> g_printerr ("Error: %s\n", error->message);
>>>>>>> g_error_free (error);
>>>>>>> g_main_loop_quit (loop);
>>>>>>> break;
>>>>>>> }
>>>>>>> default:
>>>>>>> break;
>>>>>>> }
>>>>>>> return TRUE;
>>>>>>> }
>>>>>>>
>>>>>>> static void on_pad_added (GstElement *element, GstPad *pad,
>>>>>>> gpointer data)
>>>>>>> {
>>>>>>> GstPad *sinkpad = NULL;
>>>>>>> GstElement * elemento = (GstElement *) data;
>>>>>>>
>>>>>>>
>>>>>>> /* Ahora linkeo el pad de comp con sink pad */
>>>>>>> g_print ("Dynamic pad created, linking queue\n");
>>>>>>> sinkpad = gst_element_get_static_pad (elemento, "sink");
>>>>>>>
>>>>>>>
>>>>>>> gst_pad_link (pad, sinkpad);
>>>>>>> gst_object_unref(sinkpad);
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> int main(int argc, char *argv[])
>>>>>>> {
>>>>>>>
>>>>>>> GMainLoop *loop = NULL;
>>>>>>>
>>>>>>> GstElement *src1,
>>>>>>> *src2,*dec1,*dec2,*alfa1,*color,*smpte,*queue,*sink;
>>>>>>> GstBus *bus;
>>>>>>>
>>>>>>> guint duracion = 500.0;
>>>>>>> guint transicion = 1;
>>>>>>>
>>>>>>>
>>>>>>> /* init GStreamer */
>>>>>>> gst_init (&argc, &argv);
>>>>>>> bool iniciado = gst_controller_init (&argc, &argv);
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> loop = g_main_loop_new (NULL, FALSE);
>>>>>>>
>>>>>>> /* make sure we have input */
>>>>>>> if (argc != 3) {
>>>>>>> g_print ("Usage: %s <filename1> <filename2>\n", argv[0]);
>>>>>>> return -1;
>>>>>>> }
>>>>>>>
>>>>>>> src1 = gst_element_factory_make("filesrc", "src1");
>>>>>>> g_object_set(G_OBJECT(src1),"location",argv[1], NULL);
>>>>>>>
>>>>>>> src2 = gst_element_factory_make("filesrc", "src2");
>>>>>>> g_object_set(G_OBJECT(src1),"location",argv[2], NULL);
>>>>>>>
>>>>>>> GstElement *pipeline = gst_pipeline_new ("video-player");
>>>>>>>
>>>>>>> dec1 = gst_element_factory_make("decodebin2","dec1");
>>>>>>>
>>>>>>> dec2 = gst_element_factory_make("decodebin2","dec2");
>>>>>>>
>>>>>>> cout << "Creando pipeline..." << endl;
>>>>>>>
>>>>>>> bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
>>>>>>> gst_bus_add_watch (bus, bus_call, loop);
>>>>>>> gst_object_unref (bus);
>>>>>>>
>>>>>>> alfa1 = gst_element_factory_make ("alpha","alfa1");
>>>>>>> smpte = gst_element_factory_make ("smptealpha","smpte");
>>>>>>> g_object_set(smpte,"type", transicion, NULL);
>>>>>>> color = gst_element_factory_make ("ffmpegcolorspace", "color");
>>>>>>> GstElement * mixer = gst_element_factory_make("videomixer",
>>>>>>> "mixer");
>>>>>>>
>>>>>>> if ((!alfa1) || (!smpte) || (!color) || (!mixer))
>>>>>>> {
>>>>>>> g_printerr ("Alguno de los elementos del Bin no pudo ser
>>>>>>> creado. Saliendo\n");
>>>>>>> return 0;
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> // Controller creation
>>>>>>>
>>>>>>>
>>>>>>> GstController * ctrl =
>>>>>>> gst_object_control_properties(G_OBJECT(smpte), "position",NULL);
>>>>>>>
>>>>>>> if (ctrl == NULL)
>>>>>>> {
>>>>>>> GST_WARNING ("No puede controlar el elemento fuente\n");
>>>>>>> return 1;
>>>>>>> }
>>>>>>>
>>>>>>> // Todo valor GValue debe inicializarse en 0
>>>>>>> GValue val_double = { 0, };
>>>>>>> g_value_init (&val_double, G_TYPE_DOUBLE);
>>>>>>>
>>>>>>> // Set interpolation mode
>>>>>>>
>>>>>>>
>>>>>>> GstInterpolationControlSource * csource =
>>>>>>> gst_interpolation_control_source_new();
>>>>>>>
>>>>>>>
>>>>>>> gst_interpolation_control_source_set_interpolation_mode(csource,GST_INTERPOLATE_LINEAR);
>>>>>>>
>>>>>>> // Seteo primer valor
>>>>>>> g_value_set_double(&val_double, 0.0);
>>>>>>> gst_interpolation_control_source_set(csource,(0 *
>>>>>>> GST_MSECOND),&val_double);
>>>>>>>
>>>>>>> // Seteo segundo valor
>>>>>>> g_value_set_double (&val_double, 1.0);
>>>>>>>
>>>>>>> gst_interpolation_control_source_set(csource,(duracion*GST_MSECOND),&val_double);
>>>>>>>
>>>>>>> gst_controller_set_control_source (ctrl, "position",
>>>>>>> GST_CONTROL_SOURCE (csource));
>>>>>>>
>>>>>>> g_object_unref (csource);
>>>>>>> g_value_unset (&val_double);
>>>>>>>
>>>>>>> g_signal_connect (G_OBJECT (dec1), "pad-added", G_CALLBACK
>>>>>>> (on_pad_added),alfa1);
>>>>>>> g_signal_connect (G_OBJECT (dec2), "pad-added", G_CALLBACK
>>>>>>> (on_pad_added),smpte);
>>>>>>>
>>>>>>> queue = gst_element_factory_make("queue", "queue");
>>>>>>> sink = gst_element_factory_make("autovideosink", "sink");
>>>>>>>
>>>>>>> gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2,
>>>>>>> alfa1, smpte, mixer, queue, color, sink, NULL);
>>>>>>>
>>>>>>> gst_element_link (src1,dec1);
>>>>>>> gst_element_link (src2,dec2);
>>>>>>> gst_element_link (alfa1,mixer);
>>>>>>> gst_element_link (smpte,mixer);
>>>>>>> gst_element_link (mixer,queue);
>>>>>>> gst_element_link (queue,sink);
>>>>>>>
>>>>>>>
>>>>>>> /* now run */
>>>>>>> gst_element_set_state (pipeline, GST_STATE_PLAYING);
>>>>>>> cout << "Playing..." << endl;
>>>>>>> g_main_loop_run (loop);
>>>>>>>
>>>>>>> /* also clean up */
>>>>>>> gst_element_set_state (pipeline, GST_STATE_NULL);
>>>>>>> gst_object_unref (GST_OBJECT (pipeline));
>>>>>>>
>>>>>>> return 0;
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> 2011/10/26 Stefan Sauer <ensonic at hora-obscura.de>
>>>>>>>
>>>>>>>> On 10/26/2011 03:12 AM, Rossana Guerra wrote:
>>>>>>>>
>>>>>>>> Hi I trying to control the position property of a smptealpha element. It
>>>>>>>> controls the opacity of the alpha channel,
>>>>>>>>
>>>>>>>> no, position controls the transition of the fade. 0.0:input1,
>>>>>>>> 1.0:input2.
>>>>>>>>
>>>>>>>> it varies from 0.0 to 1.0.
>>>>>>>> The duration of this setting is 500ms.
>>>>>>>>
>>>>>>>> I am working around this problem, it happens at runtime, I can't figure out
>>>>>>>> what it's wrong.
>>>>>>>>
>>>>>>>>
>>>>>>>> What is not working? The code snippet looks more of less okay.
>>>>>>>> Maybe you can post a full standalone example.
>>>>>>>>
>>>>>>>> Stefan
>>>>>>>>
>>>>>>>> Thanks and regards,
>>>>>>>>
>>>>>>>> Rossana
>>>>>>>>
>>>>>>>>
>>>>>>>> Here's the code;
>>>>>>>> _____________
>>>>>>>>
>>>>>>>>
>>>>>>>> gst_interpolation_control_source_set: assertion `G_VALUE_TYPE (value) ==
>>>>>>>> self->priv->type' failed
>>>>>>>>
>>>>>>>> // Agrego Controlador
>>>>>>>>
>>>>>>>> gdouble duracion = 500;
>>>>>>>>
>>>>>>>> guint64 duracion = 500;
>>>>>>>>
>>>>>>>> GstController * ctrl = gst_object_control_properties(G_OBJECT(smpte),
>>>>>>>> "position",NULL);
>>>>>>>>
>>>>>>>> if (ctrl == NULL)
>>>>>>>> {
>>>>>>>> GST_WARNING ("No puede controlar el elemento fuente\n");
>>>>>>>> return 0;
>>>>>>>> }
>>>>>>>>
>>>>>>>>
>>>>>>>> // Todo valor GValue debe inicializarse en 0
>>>>>>>> GValue val_double = { 0, };
>>>>>>>> g_value_init (&val_double, G_TYPE_DOUBLE);
>>>>>>>>
>>>>>>>>
>>>>>>>> // Seteo modo de interpolacion
>>>>>>>>
>>>>>>>> GstInterpolationControlSource * csource =
>>>>>>>> gst_interpolation_control_source_new();
>>>>>>>>
>>>>>>>>
>>>>>>>> gst_interpolation_control_source_set_interpolation_mode(csource,GST_INTERPOLATE_LINEAR);
>>>>>>>>
>>>>>>>> // Seteo primer valor
>>>>>>>> g_value_set_double(&val_double, 0.0);
>>>>>>>> gst_interpolation_control_source_set(csource,(0 *
>>>>>>>> GST_MSECOND),&val_double);
>>>>>>>>
>>>>>>>> // Seteo segundo valor
>>>>>>>> g_value_set_double (&val_double, 1.0);
>>>>>>>>
>>>>>>>> gst_interpolation_control_source_set(csource,(duracion*GST_MSECOND),&val_double);
>>>>>>>>
>>>>>>>> gst_controller_set_control_source (ctrl, "position", GST_CONTROL_SOURCE
>>>>>>>> (csource));
>>>>>>>>
>>>>>>>> g_object_unref (csource);
>>>>>>>> g_value_unset (&val_double);
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> gstreamer-devel mailing listgstreamer-devel at lists.freedesktop.orghttp://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> gstreamer-devel mailing list
>>>>>>>> gstreamer-devel at lists.freedesktop.org
>>>>>>>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> gstreamer-devel mailing listgstreamer-devel at lists.freedesktop.orghttp://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> gstreamer-devel mailing list
>>>> gstreamer-devel at lists.freedesktop.org
>>>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>>>
>>>>
>>>
>>> _______________________________________________
>>> gstreamer-devel mailing listgstreamer-devel at lists.freedesktop.orghttp://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>>
>>>
>>>
>>> _______________________________________________
>>> gstreamer-devel mailing list
>>> gstreamer-devel at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>>
>>>
>>
>
> _______________________________________________
> gstreamer-devel mailing listgstreamer-devel at lists.freedesktop.orghttp://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20111031/350c2653/attachment-0001.htm>
More information about the gstreamer-devel
mailing list