gst_controller_new returns NULL

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

gst_controller_new returns NULL

rossana
Hello everyone, I am translating the following code to C/C++: http://notes.brooks.nu/2011/01/python-gstreamer-controller/
It's a controller for controlling the alpha channel during crossfade, I adapted it for transitions, using, smpte instead.

The fact is it returns NULL and the programs stop running. The code is below, I appreciate any suggestion.
I am a bit clueless is an adaptation of a code I did before and it works.

Thanks and regards.

Rossana

//// the code

#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>


using namespace std;

// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
::::::::::::::::::::::::................
}

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;
  gint transicion = 1;

  cout << "Inicio..." << endl;

    /* init GStreamer */
  gst_init (&argc, &argv);
  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");

  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");
  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;
  }

  queue = gst_element_factory_make("queue", "queue");
  sink  = gst_element_factory_make("autovideosink", "sink");

  cout << "Creando 1..." << endl;

  // Agrego Controlador

  GstController * ctrl = NULL;
  if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "alpha",NULL)))  /// Here's the error, always return NULL
  {
        cout << "ctrl value..." << ctrl << endl;        
        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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource));

  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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);

  g_object_unref (csource);

  gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1, smpte, mixer, queue, color, sink, NULL);
  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);

  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);
  g_object_set(smpte,"type", transicion, NULL);

  /* 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;
}




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

Re: gst_controller_new returns NULL

Stefan Sauer
On 10/25/2011 08:06 AM, Rossana Guerra wrote:
Hello everyone, I am translating the following code to C/C++: http://notes.brooks.nu/2011/01/python-gstreamer-controller/
It's a controller for controlling the alpha channel during crossfade, I adapted it for transitions, using, smpte instead.

smptealpha does not have a property called "alpha". Only "border" and "invert" are controllable right now.

Stefan

The fact is it returns NULL and the programs stop running. The code is below, I appreciate any suggestion.
I am a bit clueless is an adaptation of a code I did before and it works.

Thanks and regards.

Rossana

//// the code

#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>


using namespace std;

// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
::::::::::::::::::::::::................
}

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;
  gint transicion = 1;

  cout << "Inicio..." << endl;

    /* init GStreamer */
  gst_init (&argc, &argv);
  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");

  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");
  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;
  }

  queue = gst_element_factory_make("queue", "queue");
  sink  = gst_element_factory_make("autovideosink", "sink");

  cout << "Creando 1..." << endl;

  // Agrego Controlador

  GstController * ctrl = NULL;
  if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "alpha",NULL)))  /// Here's the error, always return NULL
  {
        cout << "ctrl value..." << ctrl << endl;        
        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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource));

  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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);

  g_object_unref (csource);

  gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1, smpte, mixer, queue, color, sink, NULL);
  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);

  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);
  g_object_set(smpte,"type", transicion, NULL);

  /* 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;
}



_______________________________________________ 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: gst_controller_new returns NULL

rossana
Thanks Stefan, as I understand, now I have to control the "position" property.

I run an the following example, where I control the "alpha" property, and it works fine. I don't know if it's due a different pipeline, but it doesn't concern about "alpha" property.
Here's the code which runs (without sound):


#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>

using namespace std;


// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
:::::::::::::::
}

static void on_pad_added (GstElement *element, GstPad *pad, gpointer  data)
{
  GstPad *sinkpad = NULL;
  GstElement * queue = (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 (queue, "sink");

  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);

}

GstElement * getBin(const gchar * nomBin, GstElement * &alfa1, GstElement *&smpte, GstElement * &color, gint transicion = 1)
{

  GstElement * bin = gst_bin_new(nomBin);

  if (!bin)
  {
      g_printerr ("No se pudo crear el bin. Saliendo\n");
     return NULL;
  }

  alfa1   = gst_element_factory_make ("alpha","alfa1");
  smpte  = gst_element_factory_make ("smptealpha","smpte");
  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 NULL;
  }

  // Anexamos al bin
  gst_bin_add_many(GST_BIN (bin),alfa1,smpte,mixer,color,NULL);

  // Enlazamos elementos
  gst_element_link (alfa1, mixer);
  gst_element_link (smpte, mixer);
  gst_element_link (mixer,color);

  g_object_set(smpte,"type", transicion, NULL);

  return bin;
}

void getAndSetController(GstElement * smpte, gdouble duracion)
{
    GstController * ctrl = NULL;
    if (!(ctrl = gst_controller_new (G_OBJECT (smpte), "alpha",NULL))) {  // Here it works fine
        GST_WARNING ("No puede controlar el elemento fuente\n");
        return;
   }

  // 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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource));

  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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);


  g_object_unref (csource);

}

void addGhostPadsToBin(GstElement *alfa1, GstElement * smpte, GstElement * color, GstElement* bin)
{
    /* add ghostpad */
  GstPad * pad1 = gst_element_get_static_pad (alfa1, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink1", pad1));
  gst_object_unref (GST_OBJECT (pad1));

  GstPad * pad2 = gst_element_get_static_pad (smpte, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink2", pad2));
  gst_object_unref(GST_OBJECT(pad2));

  GstPad * pad3 = gst_element_get_static_pad (color, "src");
  gst_element_add_pad(bin, gst_ghost_pad_new("colorsrc", pad3));
  gst_object_unref(GST_OBJECT(pad3));

}

void crossTransicion(gdouble duracion, GstElement * & bin,gint transicion = 1)
{
    // devuelve el bin
    GstElement * alfa1, *smpte, *color;
    alfa1 = 0;
    smpte = 0;
    color = 0;

    bin = getBin("bin",alfa1, smpte,color,transicion);  // Crea el bin y los elementos

    getAndSetController(smpte,duracion);

    addGhostPadsToBin(alfa1, smpte, color, bin);

}

GstElement * getSetPipeline(gchar *argv[])
{
    gint dur1 = 9000; // duration (in ms) to play of first clip
    gint dur2 = 8000; // duration (in ms) to play of second clip
    gint dur_crossfade = 500; //number of milliseconds to crossfade for
    GstElement *comp = 0;
    GstElement *pipeline, *video1, *video2, *op, *bin, *queue, *sink;

    // ejecuta 2 clips serialmente con un crosdfade entre ellos usando el elemento (GnlOlin) gnlcomposition
    if ((comp = gst_element_factory_make("gnlcomposition", "micomposicion")) == NULL)
    {
      printf ("\n Fallo al crear gnlcomposition \n");
      return NULL;
    }

    op = gst_element_factory_make("gnloperation", "op");

    crossTransicion(dur_crossfade, bin,1);

    if (gst_bin_add (GST_BIN (op), bin) == FALSE)
    {
      printf ("\n No pudo agregar el bin a la gnloperacion op \n");
      return NULL;
    }

    g_object_set (op,"start", (dur1-dur_crossfade) * GST_MSECOND,NULL);
    g_object_set (op,"duration", dur_crossfade *  GST_MSECOND,NULL);
    g_object_set (op,"media-start", 0 *  GST_MSECOND,NULL);
    g_object_set(op,"media-duration", dur_crossfade * GST_MSECOND,NULL);
    g_object_set(op,"priority",0,NULL);

    if (gst_bin_add (GST_BIN (comp), op) == FALSE)
    {
      printf ("\n No pudo agregar la gnloperacion a la gnlcomposition \n");
      return NULL;
    }


    // configura primer clip

    if ((video1 = gst_element_factory_make("gnlfilesource", "video1")) == NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }
    if (gst_bin_add (GST_BIN (comp), video1) == FALSE)
    {
      printf ("\n No pudo agregar video1 a comp \n");
      return NULL;
    }

    g_object_set (video1, "location", argv[1], NULL);
    g_object_set(video1, "uri", argv[1],NULL);
    g_object_set (video1, "start", 0 * GST_MSECOND, NULL);
    g_object_set (video1, "duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "media-start", 0* GST_MSECOND, NULL);
    g_object_set (video1, "media-duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "priority", 1,NULL);

    // crea 2º clip
    if ((video2 = gst_element_factory_make("gnlfilesource", "video2")) == NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }


    if (gst_bin_add (GST_BIN (comp), video2) == FALSE)
    {
      printf ("\n No pudo agregar video2 a comp \n");
      return NULL;
    }

    g_object_set (video2, "location", argv[2], NULL);
    g_object_set (video2,"uri",argv[2],NULL);
    g_object_set (video2, "start", (dur1-dur_crossfade) * GST_MSECOND, NULL);
    g_object_set (video2, "duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "media-start", 0 * GST_MSECOND, NULL);
    g_object_set (video2, "media-duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "priority", 2,NULL);

    // setup the backend viewer
    queue = gst_element_factory_make("queue", "queue");
    sink  = gst_element_factory_make("autovideosink", "sink");

    pipeline = gst_pipeline_new ("video-player");

    /* Agrego elementos al pipeline */

    gst_bin_add_many (GST_BIN (pipeline),comp, queue, sink, NULL);

    g_signal_connect (comp, "pad-added", G_CALLBACK (on_pad_added),queue);

    gst_element_link (queue, sink);

    return pipeline;

}

void startPlay(GstElement * pip)
{
    /* Set the pipeline to "playing" state*/
  gst_element_set_state (pip, GST_STATE_PLAYING);

}


int main(gint argc, gchar *argv[])
{
    GMainLoop *loop = NULL;

    /* init GStreamer */
    gst_init (&argc, &argv);
    gst_controller_init (&argc, &argv);

    loop = g_main_loop_new (NULL, FALSE);

    /* chequeamos sintaxis */
    if (argc != 3)
    {
        g_print ("Uso: %s <URI1>  <URI2>\n", argv[0]);
        return -1;
    }

    GstElement * play = getSetPipeline(argv);


    GstBus *bus2 = gst_pipeline_get_bus (GST_PIPELINE (play));
    gst_bus_add_watch (bus2, bus_call, loop);
    gst_object_unref (bus2);

    cout << "...PLAY" << endl;

    startPlay(play);

    /* now run */
    g_main_loop_run (loop);

    /* also clean up */
    gst_element_set_state (play, GST_STATE_NULL);
    gst_object_unref (GST_OBJECT (play));
    return 0;
}





2011/10/25 Stefan Sauer <[hidden email]>
On 10/25/2011 08:06 AM, Rossana Guerra wrote:
Hello everyone, I am translating the following code to C/C++: http://notes.brooks.nu/2011/01/python-gstreamer-controller/
It's a controller for controlling the alpha channel during crossfade, I adapted it for transitions, using, smpte instead.

smptealpha does not have a property called "alpha". Only "border" and "invert" are controllable right now.

Stefan


The fact is it returns NULL and the programs stop running. The code is below, I appreciate any suggestion.
I am a bit clueless is an adaptation of a code I did before and it works.

Thanks and regards.

Rossana

//// the code

#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>


using namespace std;

// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
::::::::::::::::::::::::................
}

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;
  gint transicion = 1;

  cout << "Inicio..." << endl;

    /* init GStreamer */
  gst_init (&argc, &argv);
  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");

  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");
  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;
  }

  queue = gst_element_factory_make("queue", "queue");
  sink  = gst_element_factory_make("autovideosink", "sink");

  cout << "Creando 1..." << endl;

  // Agrego Controlador

  GstController * ctrl = NULL;
  if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "alpha",NULL)))  /// Here's the error, always return NULL
  {
        cout << "ctrl value..." << ctrl << endl;        
        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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource));

  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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);

  g_object_unref (csource);

  gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1, smpte, mixer, queue, color, sink, NULL);
  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);

  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);
  g_object_set(smpte,"type", transicion, NULL);

  /* 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;
}



_______________________________________________ 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: gst_controller_new returns NULL

rossana
Well I did the following change and it doesn't work, with the right propery it couldn't create the controller either. I am clueless.

if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "property",NULL)))
  {
        cout << "ctrl vale..." << ctrl << endl;
        cout << "no pudo crear controlador..." << endl;
        GST_WARNING ("No puede controlar el elemento fuente\n");
        return 1;
  }



2011/10/25 Rossana Guerra <[hidden email]>
Thanks Stefan, as I understand, now I have to control the "position" property.

I run an the following example, where I control the "alpha" property, and it works fine. I don't know if it's due a different pipeline, but it doesn't concern about "alpha" property.
Here's the code which runs (without sound):


#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>

using namespace std;


// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
:::::::::::::::
}

static void on_pad_added (GstElement *element, GstPad *pad, gpointer  data)
{
  GstPad *sinkpad = NULL;
  GstElement * queue = (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 (queue, "sink");


  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);

}

GstElement * getBin(const gchar * nomBin, GstElement * &alfa1, GstElement *&smpte, GstElement * &color, gint transicion = 1)
{

  GstElement * bin = gst_bin_new(nomBin);

  if (!bin)
  {
      g_printerr ("No se pudo crear el bin. Saliendo\n");
     return NULL;

  }

  alfa1   = gst_element_factory_make ("alpha","alfa1");
  smpte  = gst_element_factory_make ("smptealpha","smpte");
  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 NULL;
  }

  // Anexamos al bin
  gst_bin_add_many(GST_BIN (bin),alfa1,smpte,mixer,color,NULL);

  // Enlazamos elementos
  gst_element_link (alfa1, mixer);
  gst_element_link (smpte, mixer);
  gst_element_link (mixer,color);


  g_object_set(smpte,"type", transicion, NULL);

  return bin;
}

void getAndSetController(GstElement * smpte, gdouble duracion)

{
    GstController * ctrl = NULL;
    if (!(ctrl = gst_controller_new (G_OBJECT (smpte), "alpha",NULL))) {  // Here it works fine

        GST_WARNING ("No puede controlar el elemento fuente\n");
        return;

   }

  // 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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource));

  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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);


  g_object_unref (csource);

}

void addGhostPadsToBin(GstElement *alfa1, GstElement * smpte, GstElement * color, GstElement* bin)
{
    /* add ghostpad */
  GstPad * pad1 = gst_element_get_static_pad (alfa1, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink1", pad1));
  gst_object_unref (GST_OBJECT (pad1));

  GstPad * pad2 = gst_element_get_static_pad (smpte, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink2", pad2));
  gst_object_unref(GST_OBJECT(pad2));

  GstPad * pad3 = gst_element_get_static_pad (color, "src");
  gst_element_add_pad(bin, gst_ghost_pad_new("colorsrc", pad3));
  gst_object_unref(GST_OBJECT(pad3));

}

void crossTransicion(gdouble duracion, GstElement * & bin,gint transicion = 1)
{
    // devuelve el bin
    GstElement * alfa1, *smpte, *color;
    alfa1 = 0;
    smpte = 0;
    color = 0;

    bin = getBin("bin",alfa1, smpte,color,transicion);  // Crea el bin y los elementos

    getAndSetController(smpte,duracion);

    addGhostPadsToBin(alfa1, smpte, color, bin);

}

GstElement * getSetPipeline(gchar *argv[])
{
    gint dur1 = 9000; // duration (in ms) to play of first clip
    gint dur2 = 8000; // duration (in ms) to play of second clip
    gint dur_crossfade = 500; //number of milliseconds to crossfade for
    GstElement *comp = 0;
    GstElement *pipeline, *video1, *video2, *op, *bin, *queue, *sink;

    // ejecuta 2 clips serialmente con un crosdfade entre ellos usando el elemento (GnlOlin) gnlcomposition
    if ((comp = gst_element_factory_make("gnlcomposition", "micomposicion")) == NULL)
    {
      printf ("\n Fallo al crear gnlcomposition \n");
      return NULL;
    }

    op = gst_element_factory_make("gnloperation", "op");

    crossTransicion(dur_crossfade, bin,1);

    if (gst_bin_add (GST_BIN (op), bin) == FALSE)
    {
      printf ("\n No pudo agregar el bin a la gnloperacion op \n");
      return NULL;
    }

    g_object_set (op,"start", (dur1-dur_crossfade) * GST_MSECOND,NULL);
    g_object_set (op,"duration", dur_crossfade *  GST_MSECOND,NULL);
    g_object_set (op,"media-start", 0 *  GST_MSECOND,NULL);
    g_object_set(op,"media-duration", dur_crossfade * GST_MSECOND,NULL);
    g_object_set(op,"priority",0,NULL);

    if (gst_bin_add (GST_BIN (comp), op) == FALSE)
    {
      printf ("\n No pudo agregar la gnloperacion a la gnlcomposition \n");
      return NULL;
    }


    // configura primer clip

    if ((video1 = gst_element_factory_make("gnlfilesource", "video1")) == NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }
    if (gst_bin_add (GST_BIN (comp), video1) == FALSE)
    {
      printf ("\n No pudo agregar video1 a comp \n");
      return NULL;
    }

    g_object_set (video1, "location", argv[1], NULL);
    g_object_set(video1, "uri", argv[1],NULL);
    g_object_set (video1, "start", 0 * GST_MSECOND, NULL);
    g_object_set (video1, "duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "media-start", 0* GST_MSECOND, NULL);
    g_object_set (video1, "media-duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "priority", 1,NULL);

    // crea 2º clip
    if ((video2 = gst_element_factory_make("gnlfilesource", "video2")) == NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }


    if (gst_bin_add (GST_BIN (comp), video2) == FALSE)
    {
      printf ("\n No pudo agregar video2 a comp \n");
      return NULL;
    }

    g_object_set (video2, "location", argv[2], NULL);
    g_object_set (video2,"uri",argv[2],NULL);
    g_object_set (video2, "start", (dur1-dur_crossfade) * GST_MSECOND, NULL);
    g_object_set (video2, "duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "media-start", 0 * GST_MSECOND, NULL);
    g_object_set (video2, "media-duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "priority", 2,NULL);

    // setup the backend viewer

    queue = gst_element_factory_make("queue", "queue");
    sink  = gst_element_factory_make("autovideosink", "sink");

    pipeline = gst_pipeline_new ("video-player");

    /* Agrego elementos al pipeline */

    gst_bin_add_many (GST_BIN (pipeline),comp, queue, sink, NULL);

    g_signal_connect (comp, "pad-added", G_CALLBACK (on_pad_added),queue);

    gst_element_link (queue, sink);

    return pipeline;

}

void startPlay(GstElement * pip)
{
    /* Set the pipeline to "playing" state*/
  gst_element_set_state (pip, GST_STATE_PLAYING);

}


int main(gint argc, gchar *argv[])
{
    GMainLoop *loop = NULL;

    /* init GStreamer */
    gst_init (&argc, &argv);
    gst_controller_init (&argc, &argv);

    loop = g_main_loop_new (NULL, FALSE);

    /* chequeamos sintaxis */
    if (argc != 3)
    {
        g_print ("Uso: %s <URI1>  <URI2>\n", argv[0]);
        return -1;
    }

    GstElement * play = getSetPipeline(argv);


    GstBus *bus2 = gst_pipeline_get_bus (GST_PIPELINE (play));
    gst_bus_add_watch (bus2, bus_call, loop);
    gst_object_unref (bus2);

    cout << "...PLAY" << endl;

    startPlay(play);

    /* now run */

    g_main_loop_run (loop);

    /* also clean up */
    gst_element_set_state (play, GST_STATE_NULL);
    gst_object_unref (GST_OBJECT (play));
    return 0;

}





2011/10/25 Stefan Sauer <[hidden email]>
On 10/25/2011 08:06 AM, Rossana Guerra wrote:
Hello everyone, I am translating the following code to C/C++: http://notes.brooks.nu/2011/01/python-gstreamer-controller/
It's a controller for controlling the alpha channel during crossfade, I adapted it for transitions, using, smpte instead.

smptealpha does not have a property called "alpha". Only "border" and "invert" are controllable right now.

Stefan


The fact is it returns NULL and the programs stop running. The code is below, I appreciate any suggestion.
I am a bit clueless is an adaptation of a code I did before and it works.

Thanks and regards.

Rossana

//// the code

#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>


using namespace std;

// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
::::::::::::::::::::::::................
}

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;
  gint transicion = 1;

  cout << "Inicio..." << endl;

    /* init GStreamer */
  gst_init (&argc, &argv);
  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");

  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");
  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;
  }

  queue = gst_element_factory_make("queue", "queue");
  sink  = gst_element_factory_make("autovideosink", "sink");

  cout << "Creando 1..." << endl;

  // Agrego Controlador

  GstController * ctrl = NULL;
  if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "alpha",NULL)))  /// Here's the error, always return NULL
  {
        cout << "ctrl value..." << ctrl << endl;        
        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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource));

  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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);

  g_object_unref (csource);

  gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1, smpte, mixer, queue, color, sink, NULL);
  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);

  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);
  g_object_set(smpte,"type", transicion, NULL);

  /* 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;
}



_______________________________________________ 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: gst_controller_new returns NULL

rossana
I change the code, the problems is still there, the controller is NULL.
I initialize the controller properly, after, gst_init.

Here's the code, I don't know what it's wrong, very clueles, and worse, I need a controller (thanks!):

GstController * ctrl = gst_object_control_properties(G_OBJECT(smpte), "property",NULL);
  cout << "ctrl's value..." << ctrl << endl;   // returns 0

  if (ctrl == NULL)
  {
        cout << "controller wasn't created.." << endl;
        GST_WARNING ("No puede controlar el elemento fuente\n");
        return 1;
  }
  else
    cout << "controller created..." << endl;

  cout << "Controlando..." << endl;
  // 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);

  // 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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);

  gst_controller_set_control_source (ctrl, "property", GST_CONTROL_SOURCE (csource));

  g_object_unref (csource);




2011/10/25 Rossana Guerra <[hidden email]>
Well I did the following change and it doesn't work, with the right propery it couldn't create the controller either. I am clueless.

if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "property",NULL)))
  {
        cout << "ctrl vale..." << ctrl << endl;
        cout << "no pudo crear controlador..." << endl;

        GST_WARNING ("No puede controlar el elemento fuente\n");
        return 1;
  }



2011/10/25 Rossana Guerra <[hidden email]>
Thanks Stefan, as I understand, now I have to control the "position" property.

I run an the following example, where I control the "alpha" property, and it works fine. I don't know if it's due a different pipeline, but it doesn't concern about "alpha" property.
Here's the code which runs (without sound):


#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>

using namespace std;


// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
:::::::::::::::
}

static void on_pad_added (GstElement *element, GstPad *pad, gpointer  data)
{
  GstPad *sinkpad = NULL;
  GstElement * queue = (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 (queue, "sink");


  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);

}

GstElement * getBin(const gchar * nomBin, GstElement * &alfa1, GstElement *&smpte, GstElement * &color, gint transicion = 1)
{

  GstElement * bin = gst_bin_new(nomBin);

  if (!bin)
  {
      g_printerr ("No se pudo crear el bin. Saliendo\n");
     return NULL;

  }

  alfa1   = gst_element_factory_make ("alpha","alfa1");
  smpte  = gst_element_factory_make ("smptealpha","smpte");
  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 NULL;
  }

  // Anexamos al bin
  gst_bin_add_many(GST_BIN (bin),alfa1,smpte,mixer,color,NULL);

  // Enlazamos elementos
  gst_element_link (alfa1, mixer);
  gst_element_link (smpte, mixer);
  gst_element_link (mixer,color);


  g_object_set(smpte,"type", transicion, NULL);

  return bin;
}

void getAndSetController(GstElement * smpte, gdouble duracion)

{
    GstController * ctrl = NULL;
    if (!(ctrl = gst_controller_new (G_OBJECT (smpte), "alpha",NULL))) {  // Here it works fine

        GST_WARNING ("No puede controlar el elemento fuente\n");
        return;

   }

  // 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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource));

  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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);


  g_object_unref (csource);

}

void addGhostPadsToBin(GstElement *alfa1, GstElement * smpte, GstElement * color, GstElement* bin)
{
    /* add ghostpad */
  GstPad * pad1 = gst_element_get_static_pad (alfa1, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink1", pad1));
  gst_object_unref (GST_OBJECT (pad1));

  GstPad * pad2 = gst_element_get_static_pad (smpte, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink2", pad2));
  gst_object_unref(GST_OBJECT(pad2));

  GstPad * pad3 = gst_element_get_static_pad (color, "src");
  gst_element_add_pad(bin, gst_ghost_pad_new("colorsrc", pad3));
  gst_object_unref(GST_OBJECT(pad3));

}

void crossTransicion(gdouble duracion, GstElement * & bin,gint transicion = 1)
{
    // devuelve el bin
    GstElement * alfa1, *smpte, *color;
    alfa1 = 0;
    smpte = 0;
    color = 0;

    bin = getBin("bin",alfa1, smpte,color,transicion);  // Crea el bin y los elementos

    getAndSetController(smpte,duracion);

    addGhostPadsToBin(alfa1, smpte, color, bin);

}

GstElement * getSetPipeline(gchar *argv[])
{
    gint dur1 = 9000; // duration (in ms) to play of first clip
    gint dur2 = 8000; // duration (in ms) to play of second clip
    gint dur_crossfade = 500; //number of milliseconds to crossfade for
    GstElement *comp = 0;
    GstElement *pipeline, *video1, *video2, *op, *bin, *queue, *sink;

    // ejecuta 2 clips serialmente con un crosdfade entre ellos usando el elemento (GnlOlin) gnlcomposition
    if ((comp = gst_element_factory_make("gnlcomposition", "micomposicion")) == NULL)
    {
      printf ("\n Fallo al crear gnlcomposition \n");
      return NULL;
    }

    op = gst_element_factory_make("gnloperation", "op");

    crossTransicion(dur_crossfade, bin,1);

    if (gst_bin_add (GST_BIN (op), bin) == FALSE)
    {
      printf ("\n No pudo agregar el bin a la gnloperacion op \n");
      return NULL;
    }

    g_object_set (op,"start", (dur1-dur_crossfade) * GST_MSECOND,NULL);
    g_object_set (op,"duration", dur_crossfade *  GST_MSECOND,NULL);
    g_object_set (op,"media-start", 0 *  GST_MSECOND,NULL);
    g_object_set(op,"media-duration", dur_crossfade * GST_MSECOND,NULL);
    g_object_set(op,"priority",0,NULL);

    if (gst_bin_add (GST_BIN (comp), op) == FALSE)
    {
      printf ("\n No pudo agregar la gnloperacion a la gnlcomposition \n");
      return NULL;
    }


    // configura primer clip

    if ((video1 = gst_element_factory_make("gnlfilesource", "video1")) == NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }
    if (gst_bin_add (GST_BIN (comp), video1) == FALSE)
    {
      printf ("\n No pudo agregar video1 a comp \n");
      return NULL;
    }

    g_object_set (video1, "location", argv[1], NULL);
    g_object_set(video1, "uri", argv[1],NULL);
    g_object_set (video1, "start", 0 * GST_MSECOND, NULL);
    g_object_set (video1, "duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "media-start", 0* GST_MSECOND, NULL);
    g_object_set (video1, "media-duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "priority", 1,NULL);

    // crea 2º clip
    if ((video2 = gst_element_factory_make("gnlfilesource", "video2")) == NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }


    if (gst_bin_add (GST_BIN (comp), video2) == FALSE)
    {
      printf ("\n No pudo agregar video2 a comp \n");
      return NULL;
    }

    g_object_set (video2, "location", argv[2], NULL);
    g_object_set (video2,"uri",argv[2],NULL);
    g_object_set (video2, "start", (dur1-dur_crossfade) * GST_MSECOND, NULL);
    g_object_set (video2, "duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "media-start", 0 * GST_MSECOND, NULL);
    g_object_set (video2, "media-duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "priority", 2,NULL);

    // setup the backend viewer

    queue = gst_element_factory_make("queue", "queue");
    sink  = gst_element_factory_make("autovideosink", "sink");

    pipeline = gst_pipeline_new ("video-player");

    /* Agrego elementos al pipeline */

    gst_bin_add_many (GST_BIN (pipeline),comp, queue, sink, NULL);

    g_signal_connect (comp, "pad-added", G_CALLBACK (on_pad_added),queue);

    gst_element_link (queue, sink);

    return pipeline;

}

void startPlay(GstElement * pip)
{
    /* Set the pipeline to "playing" state*/
  gst_element_set_state (pip, GST_STATE_PLAYING);

}


int main(gint argc, gchar *argv[])
{
    GMainLoop *loop = NULL;

    /* init GStreamer */
    gst_init (&argc, &argv);
    gst_controller_init (&argc, &argv);

    loop = g_main_loop_new (NULL, FALSE);

    /* chequeamos sintaxis */
    if (argc != 3)
    {
        g_print ("Uso: %s <URI1>  <URI2>\n", argv[0]);
        return -1;
    }

    GstElement * play = getSetPipeline(argv);


    GstBus *bus2 = gst_pipeline_get_bus (GST_PIPELINE (play));
    gst_bus_add_watch (bus2, bus_call, loop);
    gst_object_unref (bus2);

    cout << "...PLAY" << endl;

    startPlay(play);

    /* now run */

    g_main_loop_run (loop);

    /* also clean up */
    gst_element_set_state (play, GST_STATE_NULL);
    gst_object_unref (GST_OBJECT (play));
    return 0;

}





2011/10/25 Stefan Sauer <[hidden email]>
On 10/25/2011 08:06 AM, Rossana Guerra wrote:
Hello everyone, I am translating the following code to C/C++: http://notes.brooks.nu/2011/01/python-gstreamer-controller/
It's a controller for controlling the alpha channel during crossfade, I adapted it for transitions, using, smpte instead.

smptealpha does not have a property called "alpha". Only "border" and "invert" are controllable right now.

Stefan


The fact is it returns NULL and the programs stop running. The code is below, I appreciate any suggestion.
I am a bit clueless is an adaptation of a code I did before and it works.

Thanks and regards.

Rossana

//// the code

#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>


using namespace std;

// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
::::::::::::::::::::::::................
}

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;
  gint transicion = 1;

  cout << "Inicio..." << endl;

    /* init GStreamer */
  gst_init (&argc, &argv);
  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");

  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");
  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;
  }

  queue = gst_element_factory_make("queue", "queue");
  sink  = gst_element_factory_make("autovideosink", "sink");

  cout << "Creando 1..." << endl;

  // Agrego Controlador

  GstController * ctrl = NULL;
  if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "alpha",NULL)))  /// Here's the error, always return NULL
  {
        cout << "ctrl value..." << ctrl << endl;        
        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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource));

  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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);

  g_object_unref (csource);

  gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1, smpte, mixer, queue, color, sink, NULL);
  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);

  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);
  g_object_set(smpte,"type", transicion, NULL);

  /* 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;
}



_______________________________________________ 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: gst_controller_new returns NULL

rossana
sorry I was appying a controller to a wrong name property. Now it is fixed, the controller it's created.

GstController * ctrl = gst_object_control_properties(G_OBJECT(smpte), "position",NULL);

  if (ctrl == NULL)
  {
        cout << "controller wasn't created.." << endl;

        GST_WARNING ("No puede controlar el elemento fuente\n");
        return 1;
  }
  else
    cout << "controller created..." << endl;

  cout << "Controlando..." << endl;

  // 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);

  // 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);
          //duracion = 500
  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);





2011/10/25 Rossana Guerra <[hidden email]>
I change the code, the problems is still there, the controller is NULL.
I initialize the controller properly, after, gst_init.

Here's the code, I don't know what it's wrong, very clueles, and worse, I need a controller (thanks!):

GstController * ctrl = gst_object_control_properties(G_OBJECT(smpte), "property",NULL);
  cout << "ctrl's value..." << ctrl << endl;   // returns 0

  if (ctrl == NULL)
  {
        cout << "controller wasn't created.." << endl;

        GST_WARNING ("No puede controlar el elemento fuente\n");
        return 1;
  }
  else
    cout << "controller created..." << endl;

  cout << "Controlando..." << endl;

  // 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);

  // 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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);

  gst_controller_set_control_source (ctrl, "property", GST_CONTROL_SOURCE (csource));

  g_object_unref (csource);





2011/10/25 Rossana Guerra <[hidden email]>
Well I did the following change and it doesn't work, with the right propery it couldn't create the controller either. I am clueless.

if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "property",NULL)))
  {
        cout << "ctrl vale..." << ctrl << endl;
        cout << "no pudo crear controlador..." << endl;

        GST_WARNING ("No puede controlar el elemento fuente\n");
        return 1;
  }



2011/10/25 Rossana Guerra <[hidden email]>
Thanks Stefan, as I understand, now I have to control the "position" property.

I run an the following example, where I control the "alpha" property, and it works fine. I don't know if it's due a different pipeline, but it doesn't concern about "alpha" property.
Here's the code which runs (without sound):


#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>

using namespace std;


// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
:::::::::::::::
}

static void on_pad_added (GstElement *element, GstPad *pad, gpointer  data)
{
  GstPad *sinkpad = NULL;
  GstElement * queue = (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 (queue, "sink");


  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);

}

GstElement * getBin(const gchar * nomBin, GstElement * &alfa1, GstElement *&smpte, GstElement * &color, gint transicion = 1)
{

  GstElement * bin = gst_bin_new(nomBin);

  if (!bin)
  {
      g_printerr ("No se pudo crear el bin. Saliendo\n");
     return NULL;

  }

  alfa1   = gst_element_factory_make ("alpha","alfa1");
  smpte  = gst_element_factory_make ("smptealpha","smpte");
  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 NULL;
  }

  // Anexamos al bin
  gst_bin_add_many(GST_BIN (bin),alfa1,smpte,mixer,color,NULL);

  // Enlazamos elementos
  gst_element_link (alfa1, mixer);
  gst_element_link (smpte, mixer);
  gst_element_link (mixer,color);


  g_object_set(smpte,"type", transicion, NULL);

  return bin;
}

void getAndSetController(GstElement * smpte, gdouble duracion)

{
    GstController * ctrl = NULL;
    if (!(ctrl = gst_controller_new (G_OBJECT (smpte), "alpha",NULL))) {  // Here it works fine

        GST_WARNING ("No puede controlar el elemento fuente\n");
        return;

   }

  // 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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource));

  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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);


  g_object_unref (csource);

}

void addGhostPadsToBin(GstElement *alfa1, GstElement * smpte, GstElement * color, GstElement* bin)
{
    /* add ghostpad */
  GstPad * pad1 = gst_element_get_static_pad (alfa1, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink1", pad1));
  gst_object_unref (GST_OBJECT (pad1));

  GstPad * pad2 = gst_element_get_static_pad (smpte, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink2", pad2));
  gst_object_unref(GST_OBJECT(pad2));

  GstPad * pad3 = gst_element_get_static_pad (color, "src");
  gst_element_add_pad(bin, gst_ghost_pad_new("colorsrc", pad3));
  gst_object_unref(GST_OBJECT(pad3));

}

void crossTransicion(gdouble duracion, GstElement * & bin,gint transicion = 1)
{
    // devuelve el bin
    GstElement * alfa1, *smpte, *color;
    alfa1 = 0;
    smpte = 0;
    color = 0;

    bin = getBin("bin",alfa1, smpte,color,transicion);  // Crea el bin y los elementos

    getAndSetController(smpte,duracion);

    addGhostPadsToBin(alfa1, smpte, color, bin);

}

GstElement * getSetPipeline(gchar *argv[])
{
    gint dur1 = 9000; // duration (in ms) to play of first clip
    gint dur2 = 8000; // duration (in ms) to play of second clip
    gint dur_crossfade = 500; //number of milliseconds to crossfade for
    GstElement *comp = 0;
    GstElement *pipeline, *video1, *video2, *op, *bin, *queue, *sink;

    // ejecuta 2 clips serialmente con un crosdfade entre ellos usando el elemento (GnlOlin) gnlcomposition
    if ((comp = gst_element_factory_make("gnlcomposition", "micomposicion")) == NULL)
    {
      printf ("\n Fallo al crear gnlcomposition \n");
      return NULL;
    }

    op = gst_element_factory_make("gnloperation", "op");

    crossTransicion(dur_crossfade, bin,1);

    if (gst_bin_add (GST_BIN (op), bin) == FALSE)
    {
      printf ("\n No pudo agregar el bin a la gnloperacion op \n");
      return NULL;
    }

    g_object_set (op,"start", (dur1-dur_crossfade) * GST_MSECOND,NULL);
    g_object_set (op,"duration", dur_crossfade *  GST_MSECOND,NULL);
    g_object_set (op,"media-start", 0 *  GST_MSECOND,NULL);
    g_object_set(op,"media-duration", dur_crossfade * GST_MSECOND,NULL);
    g_object_set(op,"priority",0,NULL);

    if (gst_bin_add (GST_BIN (comp), op) == FALSE)
    {
      printf ("\n No pudo agregar la gnloperacion a la gnlcomposition \n");
      return NULL;
    }


    // configura primer clip

    if ((video1 = gst_element_factory_make("gnlfilesource", "video1")) == NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }
    if (gst_bin_add (GST_BIN (comp), video1) == FALSE)
    {
      printf ("\n No pudo agregar video1 a comp \n");
      return NULL;
    }

    g_object_set (video1, "location", argv[1], NULL);
    g_object_set(video1, "uri", argv[1],NULL);
    g_object_set (video1, "start", 0 * GST_MSECOND, NULL);
    g_object_set (video1, "duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "media-start", 0* GST_MSECOND, NULL);
    g_object_set (video1, "media-duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "priority", 1,NULL);

    // crea 2º clip
    if ((video2 = gst_element_factory_make("gnlfilesource", "video2")) == NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }


    if (gst_bin_add (GST_BIN (comp), video2) == FALSE)
    {
      printf ("\n No pudo agregar video2 a comp \n");
      return NULL;
    }

    g_object_set (video2, "location", argv[2], NULL);
    g_object_set (video2,"uri",argv[2],NULL);
    g_object_set (video2, "start", (dur1-dur_crossfade) * GST_MSECOND, NULL);
    g_object_set (video2, "duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "media-start", 0 * GST_MSECOND, NULL);
    g_object_set (video2, "media-duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "priority", 2,NULL);

    // setup the backend viewer

    queue = gst_element_factory_make("queue", "queue");
    sink  = gst_element_factory_make("autovideosink", "sink");

    pipeline = gst_pipeline_new ("video-player");

    /* Agrego elementos al pipeline */

    gst_bin_add_many (GST_BIN (pipeline),comp, queue, sink, NULL);

    g_signal_connect (comp, "pad-added", G_CALLBACK (on_pad_added),queue);

    gst_element_link (queue, sink);

    return pipeline;

}

void startPlay(GstElement * pip)
{
    /* Set the pipeline to "playing" state*/
  gst_element_set_state (pip, GST_STATE_PLAYING);

}


int main(gint argc, gchar *argv[])
{
    GMainLoop *loop = NULL;

    /* init GStreamer */
    gst_init (&argc, &argv);
    gst_controller_init (&argc, &argv);

    loop = g_main_loop_new (NULL, FALSE);

    /* chequeamos sintaxis */
    if (argc != 3)
    {
        g_print ("Uso: %s <URI1>  <URI2>\n", argv[0]);
        return -1;
    }

    GstElement * play = getSetPipeline(argv);


    GstBus *bus2 = gst_pipeline_get_bus (GST_PIPELINE (play));
    gst_bus_add_watch (bus2, bus_call, loop);
    gst_object_unref (bus2);

    cout << "...PLAY" << endl;

    startPlay(play);

    /* now run */

    g_main_loop_run (loop);

    /* also clean up */
    gst_element_set_state (play, GST_STATE_NULL);
    gst_object_unref (GST_OBJECT (play));
    return 0;

}





2011/10/25 Stefan Sauer <[hidden email]>
On 10/25/2011 08:06 AM, Rossana Guerra wrote:
Hello everyone, I am translating the following code to C/C++: http://notes.brooks.nu/2011/01/python-gstreamer-controller/
It's a controller for controlling the alpha channel during crossfade, I adapted it for transitions, using, smpte instead.

smptealpha does not have a property called "alpha". Only "border" and "invert" are controllable right now.

Stefan


The fact is it returns NULL and the programs stop running. The code is below, I appreciate any suggestion.
I am a bit clueless is an adaptation of a code I did before and it works.

Thanks and regards.

Rossana

//// the code

#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>


using namespace std;

// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
::::::::::::::::::::::::................
}

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;
  gint transicion = 1;

  cout << "Inicio..." << endl;

    /* init GStreamer */
  gst_init (&argc, &argv);
  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");

  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");
  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;
  }

  queue = gst_element_factory_make("queue", "queue");
  sink  = gst_element_factory_make("autovideosink", "sink");

  cout << "Creando 1..." << endl;

  // Agrego Controlador

  GstController * ctrl = NULL;
  if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "alpha",NULL)))  /// Here's the error, always return NULL
  {
        cout << "ctrl value..." << ctrl << endl;        
        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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource));

  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, duracion);
  gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double);

  g_object_unref (csource);

  gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1, smpte, mixer, queue, color, sink, NULL);
  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);

  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);
  g_object_set(smpte,"type", transicion, NULL);

  /* 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;
}



_______________________________________________ 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: gst_controller_new returns NULL

Stefan Sauer
In reply to this post by rossana
On 10/25/2011 09:15 PM, Rossana Guerra wrote:
Well I did the following change and it doesn't work, with the right propery
it couldn't create the controller either. I am clueless.

if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "property",NULL)))
  {

I would suggest you to e.g. have a look at the docs for the controller and the examples in core (under tests/examples). The parameters for gst_controller_new are not arbitrary strings. They are names of real existing object properties on the object you pass as the first argument. Further they have to be marked as controllable (check the gst-inspect output for the element).

Thus for smptealpha you want to control "position".

Stefan

        cout << "ctrl vale..." << ctrl << endl;
        cout << "no pudo crear controlador..." << endl;
        GST_WARNING ("No puede controlar el elemento fuente\n");
        return 1;
  }



2011/10/25 Rossana Guerra [hidden email]

Thanks Stefan, as I understand, now I have to control the "position"
property.

I run an the following example, where I control the "alpha" property, and
it works fine. I don't know if it's due a different pipeline, but it doesn't
concern about "alpha" property.
Here's the code which runs (without sound):


#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>

using namespace std;


// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
:::::::::::::::
}

static void on_pad_added (GstElement *element, GstPad *pad, gpointer  data)
{
  GstPad *sinkpad = NULL;
  GstElement * queue = (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 (queue, "sink");


  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);

}

GstElement * getBin(const gchar * nomBin, GstElement * &alfa1, GstElement
*&smpte, GstElement * &color, gint transicion = 1)
{

  GstElement * bin = gst_bin_new(nomBin);

  if (!bin)
  {
      g_printerr ("No se pudo crear el bin. Saliendo\n");
     return NULL;

  }

  alfa1   = gst_element_factory_make ("alpha","alfa1");
  smpte  = gst_element_factory_make ("smptealpha","smpte");
  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 NULL;
  }

  // Anexamos al bin
  gst_bin_add_many(GST_BIN (bin),alfa1,smpte,mixer,color,NULL);

  // Enlazamos elementos
  gst_element_link (alfa1, mixer);
  gst_element_link (smpte, mixer);
  gst_element_link (mixer,color);


  g_object_set(smpte,"type", transicion, NULL);

  return bin;
}

void getAndSetController(GstElement * smpte, gdouble duracion)

{
    GstController * ctrl = NULL;
    if (!(ctrl = gst_controller_new (G_OBJECT (smpte), "alpha",NULL))) {
// Here it works fine

        GST_WARNING ("No puede controlar el elemento fuente\n");
        return;

   }

  // 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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE
(csource));


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, duracion);
  gst_interpolation_control_source_set(csource,(1 *
GST_MSECOND),&val_double);


  g_object_unref (csource);

}

void addGhostPadsToBin(GstElement *alfa1, GstElement * smpte, GstElement *
color, GstElement* bin)
{
    /* add ghostpad */
  GstPad * pad1 = gst_element_get_static_pad (alfa1, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink1", pad1));
  gst_object_unref (GST_OBJECT (pad1));

  GstPad * pad2 = gst_element_get_static_pad (smpte, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink2", pad2));
  gst_object_unref(GST_OBJECT(pad2));

  GstPad * pad3 = gst_element_get_static_pad (color, "src");
  gst_element_add_pad(bin, gst_ghost_pad_new("colorsrc", pad3));
  gst_object_unref(GST_OBJECT(pad3));

}

void crossTransicion(gdouble duracion, GstElement * & bin,gint transicion =
1)
{
    // devuelve el bin
    GstElement * alfa1, *smpte, *color;
    alfa1 = 0;
    smpte = 0;
    color = 0;

    bin = getBin("bin",alfa1, smpte,color,transicion);  // Crea el bin y
los elementos

    getAndSetController(smpte,duracion);

    addGhostPadsToBin(alfa1, smpte, color, bin);

}

GstElement * getSetPipeline(gchar *argv[])
{
    gint dur1 = 9000; // duration (in ms) to play of first clip
    gint dur2 = 8000; // duration (in ms) to play of second clip
    gint dur_crossfade = 500; //number of milliseconds to crossfade for
    GstElement *comp = 0;
    GstElement *pipeline, *video1, *video2, *op, *bin, *queue, *sink;

    // ejecuta 2 clips serialmente con un crosdfade entre ellos usando el
elemento (GnlOlin) gnlcomposition
    if ((comp = gst_element_factory_make("gnlcomposition",
"micomposicion")) == NULL)
    {
      printf ("\n Fallo al crear gnlcomposition \n");
      return NULL;
    }

    op = gst_element_factory_make("gnloperation", "op");

    crossTransicion(dur_crossfade, bin,1);

    if (gst_bin_add (GST_BIN (op), bin) == FALSE)
    {
      printf ("\n No pudo agregar el bin a la gnloperacion op \n");
      return NULL;
    }

    g_object_set (op,"start", (dur1-dur_crossfade) * GST_MSECOND,NULL);
    g_object_set (op,"duration", dur_crossfade *  GST_MSECOND,NULL);
    g_object_set (op,"media-start", 0 *  GST_MSECOND,NULL);
    g_object_set(op,"media-duration", dur_crossfade * GST_MSECOND,NULL);
    g_object_set(op,"priority",0,NULL);

    if (gst_bin_add (GST_BIN (comp), op) == FALSE)
    {
      printf ("\n No pudo agregar la gnloperacion a la gnlcomposition \n");
      return NULL;
    }


    // configura primer clip

    if ((video1 = gst_element_factory_make("gnlfilesource", "video1")) ==
NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }
    if (gst_bin_add (GST_BIN (comp), video1) == FALSE)
    {
      printf ("\n No pudo agregar video1 a comp \n");
      return NULL;
    }

    g_object_set (video1, "location", argv[1], NULL);
    g_object_set(video1, "uri", argv[1],NULL);
    g_object_set (video1, "start", 0 * GST_MSECOND, NULL);
    g_object_set (video1, "duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "media-start", 0* GST_MSECOND, NULL);
    g_object_set (video1, "media-duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "priority", 1,NULL);

    // crea 2º clip
    if ((video2 = gst_element_factory_make("gnlfilesource", "video2")) ==
NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }


    if (gst_bin_add (GST_BIN (comp), video2) == FALSE)
    {
      printf ("\n No pudo agregar video2 a comp \n");
      return NULL;
    }

    g_object_set (video2, "location", argv[2], NULL);
    g_object_set (video2,"uri",argv[2],NULL);
    g_object_set (video2, "start", (dur1-dur_crossfade) * GST_MSECOND,
NULL);
    g_object_set (video2, "duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "media-start", 0 * GST_MSECOND, NULL);
    g_object_set (video2, "media-duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "priority", 2,NULL);

    // setup the backend viewer

    queue = gst_element_factory_make("queue", "queue");
    sink  = gst_element_factory_make("autovideosink", "sink");

    pipeline = gst_pipeline_new ("video-player");

    /* Agrego elementos al pipeline */

    gst_bin_add_many (GST_BIN (pipeline),comp, queue, sink, NULL);

    g_signal_connect (comp, "pad-added", G_CALLBACK (on_pad_added),queue);

    gst_element_link (queue, sink);

    return pipeline;

}

void startPlay(GstElement * pip)
{
    /* Set the pipeline to "playing" state*/
  gst_element_set_state (pip, GST_STATE_PLAYING);

}


int main(gint argc, gchar *argv[])
{
    GMainLoop *loop = NULL;

    /* init GStreamer */
    gst_init (&argc, &argv);
    gst_controller_init (&argc, &argv);

    loop = g_main_loop_new (NULL, FALSE);

    /* chequeamos sintaxis */
    if (argc != 3)
    {
        g_print ("Uso: %s <URI1>  <URI2>\n", argv[0]);
        return -1;
    }

    GstElement * play = getSetPipeline(argv);


    GstBus *bus2 = gst_pipeline_get_bus (GST_PIPELINE (play));
    gst_bus_add_watch (bus2, bus_call, loop);
    gst_object_unref (bus2);

    cout << "...PLAY" << endl;

    startPlay(play);

    /* now run */

    g_main_loop_run (loop);

    /* also clean up */
    gst_element_set_state (play, GST_STATE_NULL);
    gst_object_unref (GST_OBJECT (play));
    return 0;

}





2011/10/25 Stefan Sauer [hidden email]

**
On 10/25/2011 08:06 AM, Rossana Guerra wrote:

Hello everyone, I am translating the following code to C/C++:
http://notes.brooks.nu/2011/01/python-gstreamer-controller/
It's a controller for controlling the alpha channel during crossfade, I
adapted it for transitions, using, smpte instead.


smptealpha does not have a property called "alpha". Only "border" and
"invert" are controllable right now.

Stefan


The fact is it returns NULL and the programs stop running. The code is
below, I appreciate any suggestion.
I am a bit clueless is an adaptation of a code I did before and it works.

Thanks and regards.

Rossana

//// the code

#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>


using namespace std;

// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
::::::::::::::::::::::::................
}

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;
  gint transicion = 1;

  cout << "Inicio..." << endl;

    /* init GStreamer */
  gst_init (&argc, &argv);
  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");

  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");
  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;
  }

  queue = gst_element_factory_make("queue", "queue");
  sink  = gst_element_factory_make("autovideosink", "sink");

  cout << "Creando 1..." << endl;

  // Agrego Controlador

  GstController * ctrl = NULL;
  if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "alpha",NULL)))  ///
Here's the error, always return NULL
  {
        cout << "ctrl value..." << ctrl << endl;
        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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE
(csource));


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, duracion);
  gst_interpolation_control_source_set(csource,(1 *
GST_MSECOND),&val_double);

  g_object_unref (csource);

  gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1,
smpte, mixer, queue, color, sink, NULL);
  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);

  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);
  g_object_set(smpte,"type", transicion, NULL);

  /* 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;
}




_______________________________________________
gstreamer-devel mailing [hidden email]



_______________________________________________
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: gst_controller_new returns NULL

rossana
Yes Stefan, maybe is my english,as I said in my previous email, it was fixed: it was a typing error, I meant "position" property.
It works fine now. Now I have a runtime error.

Thanks for your help!

2011/10/26 Stefan Sauer <[hidden email]>
On 10/25/2011 09:15 PM, Rossana Guerra wrote:
Well I did the following change and it doesn't work, with the right propery
it couldn't create the controller either. I am clueless.

if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "property",NULL)))
  {

I would suggest you to e.g. have a look at the docs for the controller and the examples in core (under tests/examples). The parameters for gst_controller_new are not arbitrary strings. They are names of real existing object properties on the object you pass as the first argument. Further they have to be marked as controllable (check the gst-inspect output for the element).

Thus for smptealpha you want to control "position".

Stefan

        cout << "ctrl vale..." << ctrl << endl;
        cout << "no pudo crear controlador..." << endl;
        GST_WARNING ("No puede controlar el elemento fuente\n");
        return 1;
  }



2011/10/25 Rossana Guerra [hidden email]

Thanks Stefan, as I understand, now I have to control the "position"
property.

I run an the following example, where I control the "alpha" property, and
it works fine. I don't know if it's due a different pipeline, but it doesn't
concern about "alpha" property.
Here's the code which runs (without sound):


#include <gst.h>
#include <controller/gstcontroller.h>

#include <iostream>

using namespace std;


// Manejador de errores
static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
{
:::::::::::::::
}

static void on_pad_added (GstElement *element, GstPad *pad, gpointer  data)
{
  GstPad *sinkpad = NULL;
  GstElement * queue = (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 (queue, "sink");


  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);

}

GstElement * getBin(const gchar * nomBin, GstElement * &alfa1, GstElement
*&smpte, GstElement * &color, gint transicion = 1)
{

  GstElement * bin = gst_bin_new(nomBin);

  if (!bin)
  {
      g_printerr ("No se pudo crear el bin. Saliendo\n");
     return NULL;

  }

  alfa1   = gst_element_factory_make ("alpha","alfa1");
  smpte  = gst_element_factory_make ("smptealpha","smpte");
  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 NULL;
  }

  // Anexamos al bin
  gst_bin_add_many(GST_BIN (bin),alfa1,smpte,mixer,color,NULL);

  // Enlazamos elementos
  gst_element_link (alfa1, mixer);
  gst_element_link (smpte, mixer);
  gst_element_link (mixer,color);


  g_object_set(smpte,"type", transicion, NULL);

  return bin;
}

void getAndSetController(GstElement * smpte, gdouble duracion)

{
    GstController * ctrl = NULL;
    if (!(ctrl = gst_controller_new (G_OBJECT (smpte), "alpha",NULL))) {
// Here it works fine

        GST_WARNING ("No puede controlar el elemento fuente\n");
        return;

   }

  // 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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE
(csource));


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, duracion);
  gst_interpolation_control_source_set(csource,(1 *
GST_MSECOND),&val_double);


  g_object_unref (csource);

}

void addGhostPadsToBin(GstElement *alfa1, GstElement * smpte, GstElement *
color, GstElement* bin)
{
    /* add ghostpad */
  GstPad * pad1 = gst_element_get_static_pad (alfa1, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink1", pad1));
  gst_object_unref (GST_OBJECT (pad1));

  GstPad * pad2 = gst_element_get_static_pad (smpte, "sink");
  gst_element_add_pad(bin, gst_ghost_pad_new("alfasink2", pad2));
  gst_object_unref(GST_OBJECT(pad2));

  GstPad * pad3 = gst_element_get_static_pad (color, "src");
  gst_element_add_pad(bin, gst_ghost_pad_new("colorsrc", pad3));
  gst_object_unref(GST_OBJECT(pad3));

}

void crossTransicion(gdouble duracion, GstElement * & bin,gint transicion =
1)
{
    // devuelve el bin
    GstElement * alfa1, *smpte, *color;
    alfa1 = 0;
    smpte = 0;
    color = 0;

    bin = getBin("bin",alfa1, smpte,color,transicion);  // Crea el bin y
los elementos

    getAndSetController(smpte,duracion);

    addGhostPadsToBin(alfa1, smpte, color, bin);

}

GstElement * getSetPipeline(gchar *argv[])
{
    gint dur1 = 9000; // duration (in ms) to play of first clip
    gint dur2 = 8000; // duration (in ms) to play of second clip
    gint dur_crossfade = 500; //number of milliseconds to crossfade for
    GstElement *comp = 0;
    GstElement *pipeline, *video1, *video2, *op, *bin, *queue, *sink;

    // ejecuta 2 clips serialmente con un crosdfade entre ellos usando el
elemento (GnlOlin) gnlcomposition
    if ((comp = gst_element_factory_make("gnlcomposition",
"micomposicion")) == NULL)
    {
      printf ("\n Fallo al crear gnlcomposition \n");
      return NULL;
    }

    op = gst_element_factory_make("gnloperation", "op");

    crossTransicion(dur_crossfade, bin,1);

    if (gst_bin_add (GST_BIN (op), bin) == FALSE)
    {
      printf ("\n No pudo agregar el bin a la gnloperacion op \n");
      return NULL;
    }

    g_object_set (op,"start", (dur1-dur_crossfade) * GST_MSECOND,NULL);
    g_object_set (op,"duration", dur_crossfade *  GST_MSECOND,NULL);
    g_object_set (op,"media-start", 0 *  GST_MSECOND,NULL);
    g_object_set(op,"media-duration", dur_crossfade * GST_MSECOND,NULL);
    g_object_set(op,"priority",0,NULL);

    if (gst_bin_add (GST_BIN (comp), op) == FALSE)
    {
      printf ("\n No pudo agregar la gnloperacion a la gnlcomposition \n");
      return NULL;
    }


    // configura primer clip

    if ((video1 = gst_element_factory_make("gnlfilesource", "video1")) ==
NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }
    if (gst_bin_add (GST_BIN (comp), video1) == FALSE)
    {
      printf ("\n No pudo agregar video1 a comp \n");
      return NULL;
    }

    g_object_set (video1, "location", argv[1], NULL);
    g_object_set(video1, "uri", argv[1],NULL);
    g_object_set (video1, "start", 0 * GST_MSECOND, NULL);
    g_object_set (video1, "duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "media-start", 0* GST_MSECOND, NULL);
    g_object_set (video1, "media-duration", dur1 * GST_MSECOND, NULL);
    g_object_set (video1, "priority", 1,NULL);

    // crea 2º clip
    if ((video2 = gst_element_factory_make("gnlfilesource", "video2")) ==
NULL)
    {
      printf ("\n Falló la creacion del gnlfilesource \n");
      return NULL;
    }


    if (gst_bin_add (GST_BIN (comp), video2) == FALSE)
    {
      printf ("\n No pudo agregar video2 a comp \n");
      return NULL;
    }

    g_object_set (video2, "location", argv[2], NULL);
    g_object_set (video2,"uri",argv[2],NULL);
    g_object_set (video2, "start", (dur1-dur_crossfade) * GST_MSECOND,
NULL);
    g_object_set (video2, "duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "media-start", 0 * GST_MSECOND, NULL);
    g_object_set (video2, "media-duration", dur2 * GST_MSECOND, NULL);
    g_object_set (video2, "priority", 2,NULL);

    // setup the backend viewer

    queue = gst_element_factory_make("queue", "queue");
    sink  = gst_element_factory_make("autovideosink", "sink");

    pipeline = gst_pipeline_new ("video-player");

    /* Agrego elementos al pipeline */

    gst_bin_add_many (GST_BIN (pipeline),comp, queue, sink, NULL);

    g_signal_connect (comp, "pad-added", G_CALLBACK (on_pad_added),queue);

    gst_element_link (queue, sink);

    return pipeline;

}

void startPlay(GstElement * pip)
{
    /* Set the pipeline to "playing" state*/
  gst_element_set_state (pip, GST_STATE_PLAYING);

}


int main(gint argc, gchar *argv[])
{
    GMainLoop *loop = NULL;

    /* init GStreamer */
    gst_init (&argc, &argv);
    gst_controller_init (&argc, &argv);

    loop = g_main_loop_new (NULL, FALSE);

    /* chequeamos sintaxis */
    if (argc != 3)
    {
        g_print ("Uso: %s <URI1>  <URI2>\n", argv[0]);
        return -1;
    }

    GstElement * play = getSetPipeline(argv);


    GstBus *bus2 = gst_pipeline_get_bus (GST_PIPELINE (play));
    gst_bus_add_watch (bus2, bus_call, loop);
    gst_object_unref (bus2);

    cout << "...PLAY" << endl;

    startPlay(play);

    /* now run */

    g_main_loop_run (loop);

    /* also clean up */
    gst_element_set_state (play, GST_STATE_NULL);
    gst_object_unref (GST_OBJECT (play));
    return 0;

}





2011/10/25 Stefan Sauer [hidden email]

**
On 10/25/2011 08:06 AM, Rossana Guerra wrote:

Hello everyone, I am translating the following code to C/C++:
http://notes.brooks.nu/2011/01/python-gstreamer-controller/ It's a controller for controlling the alpha channel during crossfade, I adapted it for transitions, using, smpte instead. smptealpha does not have a property called "alpha". Only "border" and "invert" are controllable right now. Stefan The fact is it returns NULL and the programs stop running. The code is below, I appreciate any suggestion. I am a bit clueless is an adaptation of a code I did before and it works. Thanks and regards. Rossana //// the code #include <gst.h> #include <controller/gstcontroller.h> #include <iostream> using namespace std; // Manejador de errores static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data) { ::::::::::::::::::::::::................ } 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; gint transicion = 1; cout << "Inicio..." << endl; /* init GStreamer */ gst_init (&argc, &argv); 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"); 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"); 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; } queue = gst_element_factory_make("queue", "queue"); sink = gst_element_factory_make("autovideosink", "sink"); cout << "Creando 1..." << endl; // Agrego Controlador GstController * ctrl = NULL; if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "alpha",NULL))) /// Here's the error, always return NULL { cout << "ctrl value..." << ctrl << endl; 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_controller_set_control_source (ctrl, "alpha", GST_CONTROL_SOURCE (csource)); 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, duracion); gst_interpolation_control_source_set(csource,(1 * GST_MSECOND),&val_double); g_object_unref (csource); gst_bin_add_many (GST_BIN (pipeline),src1, src2, dec1, dec2, alfa1, smpte, mixer, queue, color, sink, NULL); 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); 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); g_object_set(smpte,"type", transicion, NULL); /* 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; } ______________________________
_________________ gstreamer-devel mailing [hidden email]
_______________________________________________ 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