<!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 << "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 <a class="moz-txt-link-rfc2396E" href="mailto:guerra.rossana@gmail.com"><guerra.rossana@gmail.com></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 <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 <a class="moz-txt-link-rfc2396E" href="mailto:ensonic@hora-obscura.de"><ensonic@hora-obscura.de></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 <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 <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>