<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    On 10/25/2011 09:15 PM, Rossana Guerra wrote:
    <blockquote
cite="mid:CAAMjx-eOJoB1EPsHMRnMBq_U99MukrQCjwXUhOTJTncdGRQtyA@mail.gmail.com"
      type="cite">
      <pre wrap="">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)))
  {
</pre>
    </blockquote>
    <br>
    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).<br>
    <br>
    Thus for smptealpha you want to control "position".<br>
    <br>
    Stefan<br>
    <br>
    <blockquote
cite="mid:CAAMjx-eOJoB1EPsHMRnMBq_U99MukrQCjwXUhOTJTncdGRQtyA@mail.gmail.com"
      type="cite">
      <pre wrap="">        cout &lt;&lt; "ctrl vale..." &lt;&lt; ctrl &lt;&lt; endl;
        cout &lt;&lt; "no pudo crear controlador..." &lt;&lt; endl;
        GST_WARNING ("No puede controlar el elemento fuente\n");
        return 1;
  }



2011/10/25 Rossana Guerra <a class="moz-txt-link-rfc2396E" href="mailto:guerra.rossana@gmail.com">&lt;guerra.rossana@gmail.com&gt;</a>

</pre>
      <blockquote type="cite">
        <pre wrap="">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 &lt;gst.h&gt;
#include &lt;controller/gstcontroller.h&gt;

#include &lt;iostream&gt;

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 * &amp;alfa1, GstElement
*&amp;smpte, GstElement * &amp;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 (&amp;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(&amp;val_double, 0.0);
  gst_interpolation_control_source_set(csource,(0 *
GST_MSECOND),&amp;val_double);

  // Seteo segundo valor
  g_value_set_double (&amp;val_double, duracion);
  gst_interpolation_control_source_set(csource,(1 *
GST_MSECOND),&amp;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 * &amp; 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&oacute; 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&ordm; clip
    if ((video2 = gst_element_factory_make("gnlfilesource", "video2")) ==
NULL)
    {
      printf ("\n Fall&oacute; 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 (&amp;argc, &amp;argv);
    gst_controller_init (&amp;argc, &amp;argv);

    loop = g_main_loop_new (NULL, FALSE);

    /* chequeamos sintaxis */
    if (argc != 3)
    {
        g_print ("Uso: %s &lt;URI1&gt;  &lt;URI2&gt;\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 &lt;&lt; "...PLAY" &lt;&lt; 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 <a class="moz-txt-link-rfc2396E" href="mailto:ensonic@hora-obscura.de">&lt;ensonic@hora-obscura.de&gt;</a>

</pre>
        <blockquote type="cite">
          <pre wrap="">**
On 10/25/2011 08:06 AM, Rossana Guerra wrote:

Hello everyone, I am translating the following code to C/C++:
<a class="moz-txt-link-freetext" href="http://notes.brooks.nu/2011/01/python-gstreamer-controller/">http://notes.brooks.nu/2011/01/python-gstreamer-controller/</a>
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 &lt;gst.h&gt;
#include &lt;controller/gstcontroller.h&gt;

#include &lt;iostream&gt;


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 &lt;&lt; "Inicio..." &lt;&lt; endl;

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

  loop = g_main_loop_new (NULL, FALSE);

  /* make sure we have input */
  if (argc != 3) {
    g_print ("Usage: %s &lt;filename1&gt; &lt;filename2&gt;\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 &lt;&lt; "Creando 1..." &lt;&lt; endl;

  // Agrego Controlador

  GstController * ctrl = NULL;
  if (!(ctrl = gst_controller_new (G_OBJECT(smpte), "alpha",NULL)))  ///
Here's the error, always return NULL
  {
        cout &lt;&lt; "ctrl value..." &lt;&lt; ctrl &lt;&lt; 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 (&amp;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(&amp;val_double, 0.0);
  gst_interpolation_control_source_set(csource,(0 *
GST_MSECOND),&amp;val_double);

  // Seteo segundo valor
  g_value_set_double (&amp;val_double, duracion);
  gst_interpolation_control_source_set(csource,(1 *
GST_MSECOND),&amp;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 &lt;&lt; "Playing..." &lt;&lt; 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 <a class="moz-txt-link-abbreviated" href="mailto:listgstreamer-devel@lists.freedesktop.orghttp://lists.freedesktop.org/mailman/listinfo/gstreamer-devel">listgstreamer-devel@lists.freedesktop.orghttp://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a>



_______________________________________________
gstreamer-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a>
<a class="moz-txt-link-freetext" href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel">http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a>


</pre>
        </blockquote>
        <pre wrap="">
</pre>
      </blockquote>
      <pre wrap="">
</pre>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
gstreamer-devel mailing list
<a class="moz-txt-link-abbreviated" href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a>
<a class="moz-txt-link-freetext" href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel">http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>