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