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