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

Stefan Sauer ensonic at hora-obscura.de
Thu Oct 27 01:39:44 PDT 2011


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
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20111027/9b651f53/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ctrl.c
Type: text/x-csrc
Size: 5373 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20111027/9b651f53/attachment-0001.c>


More information about the gstreamer-devel mailing list