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

classic Classic list List threaded Threaded
14 messages Options
Reply | Threaded
Open this post in threaded view
|

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

rossana
Hi I trying to control the position property of a smptealpha element. It controls the opacity of the alpha channel, 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.

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;
  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
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

Stefan Sauer
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

rossana
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

rossana
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.

2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel




_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

rossana
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 <[hidden email]>
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.


2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel





_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

rossana
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.
In this way:

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 <[hidden email]>
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 <[hidden email]>
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.


2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel






_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

Stefan Sauer
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 <[hidden email]>
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 <[hidden email]>
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.


2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel





_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

ctrl.c (5K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

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

rossana
Sorry Stefan, where is the code to compare with?..I downloaded the doc (pdf) and the order remains the same.
Regards and thanks


2011/10/27 Stefan Sauer <[hidden email]>
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 <[hidden email]>
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 <[hidden email]>
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.


2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel





_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

Stefan Sauer
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?

Stefan

Regards and thanks


2011/10/27 Stefan Sauer <[hidden email]>
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 <[hidden email]>
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 <[hidden email]>
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.


2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel





_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

rossana
Hi Stefan, I didn't receive the email, I even looked into the spam folder, just in case....

2011/10/28 Stefan Sauer <[hidden email]>
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?

Stefan


Regards and thanks


2011/10/27 Stefan Sauer <[hidden email]>
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 <[hidden email]>
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 <[hidden email]>
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.


2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel





_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

rossana
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@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 <[hidden email]>
Hi Stefan, I didn't receive the email, I even looked into the spam folder, just in case....

2011/10/28 Stefan Sauer <[hidden email]>
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?

Stefan


Regards and thanks


2011/10/27 Stefan Sauer <[hidden email]>
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 <[hidden email]>
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 <[hidden email]>
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.


2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel





_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel




_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

Stefan Sauer
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@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 <[hidden email]>
Hi Stefan, I didn't receive the email, I even looked into the spam folder, just in case....

2011/10/28 Stefan Sauer <[hidden email]>
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?

Stefan


Regards and thanks


2011/10/27 Stefan Sauer <[hidden email]>
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 <[hidden email]>
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 <[hidden email]>
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.


2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel





_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

rossana
thanks for response, it helps me a lot. In fact I need audio as well, I'll work around it, at least with one file.
Regards,

Rossana


2011/10/31 Stefan Sauer <[hidden email]>
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@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 <[hidden email]>
Hi Stefan, I didn't receive the email, I even looked into the spam folder, just in case....

2011/10/28 Stefan Sauer <[hidden email]>
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?

Stefan


Regards and thanks


2011/10/27 Stefan Sauer <[hidden email]>
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 <[hidden email]>
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 <[hidden email]>
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.


2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel





_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

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

rossana
In reply to this post by Stefan Sauer


2011/10/31 Stefan Sauer <[hidden email]>
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.

or you meant dec1?
 
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

trying to do this

thanks

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@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 <[hidden email]>
Hi Stefan, I didn't receive the email, I even looked into the spam folder, just in case....

2011/10/28 Stefan Sauer <[hidden email]>
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?

Stefan


Regards and thanks


2011/10/27 Stefan Sauer <[hidden email]>
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 <[hidden email]>
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 <[hidden email]>
Where it says guint duration = 500.0 it should say guint duration = 500. Nonetheless, the error persists.


2011/10/26 Rossana Guerra <[hidden email]>
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 <[hidden email]>
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 [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel





_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



_______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



_______________________________________________
gstreamer-devel mailing list
[hidden email]
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel