Invalid property's type for a controller at runtime: `G_VALUE_TYPE (value) == self->priv->type' failed

Rossana Guerra guerra.rossana at gmail.com
Sat Oct 29 17:15:59 PDT 2011


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.

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
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20111029/1e3dd780/attachment.html>


More information about the gstreamer-devel mailing list