Invalid property's type for a controller at runtime: `G_VALUE_TYPE (value) == self->priv->type' failed
Stefan Sauer
ensonic at hora-obscura.de
Mon Oct 31 03:22:29 PDT 2011
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
> <mailto: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
> <mailto: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
>> <mailto: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
>>> <mailto: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
>>> <mailto: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
>>> <mailto: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
>>> <mailto: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 list
>>>> gstreamer-devel at lists.freedesktop.org <mailto:gstreamer-devel at lists.freedesktop.org>
>>>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>>
>>>
>>> _______________________________________________
>>> gstreamer-devel mailing list
>>> gstreamer-devel at lists.freedesktop.org
>>> <mailto:gstreamer-devel at lists.freedesktop.org>
>>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>>
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> gstreamer-devel mailing list
>>> gstreamer-devel at lists.freedesktop.org <mailto:gstreamer-devel at lists.freedesktop.org>
>>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>
>>
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.freedesktop.org
>> <mailto:gstreamer-devel at lists.freedesktop.org>
>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>
>>
>>
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.freedesktop.org <mailto:gstreamer-devel at lists.freedesktop.org>
>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> <mailto:gstreamer-devel at lists.freedesktop.org>
> http://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/ab0c046c/attachment.html>
More information about the gstreamer-devel
mailing list