Crossfade - Resource not found message at runtime

Angel Martin amartin at vicomtech.org
Wed Sep 7 00:09:14 PDT 2011


Dear Rossana,

I think that this kind of error message is obtained when the video resource
is not found so check the file path to the files and be sure that the paths
are right in the location assignment of each gnlfilesource.

Moreover, You have a bug in the getAndSetController concerning the duration
of the transition:

g_value_set_double (&val_double, 1.0);
gst_interpolation_control_source_set(csource,(duracion *
GST_MSECOND),&val_double);

Best,

Angel

2011/9/7 Rossana Guerra <guerra.rossana at gmail.com>

> Hi all, I am totally new with GSteamer, so sorry for the lots of mistakes I
> have. I am trying to do the example of this link in C/C++
> http://notes.brooks.nu/gstreamer-video-crossfade-example/
> It's about crossfade. I doing it with .AVI files.
>
> At runtime I got the Resource not found error. Another  examples, like a
> playbin, work properly with .AVI's, so I don't think is a codec issue.
> The video files are passing as arguments (uri format).
>
> Thanks in advance.
>
> /////////////////////////
> Heres the code
>
>
> #include <gst.h>
> #include <controller/gstcontroller.h>
>
> #include <iostream>
>
> using namespace std;
>
> // Error handler
> static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
> {
>     GMainLoop *loop = (GMainLoop *) data;
>
>     switch (GST_MESSAGE_TYPE (msg))
>     {
>     case GST_MESSAGE_EOS:
>         g_print ("Final de stream\n");
>         g_main_loop_quit (loop);
>         break;
>     case GST_MESSAGE_ERROR:
>     {
>         gchar *debug;
>         GError *error;
>         gst_message_parse_error (msg, &error, &debug);
>         g_free (debug);
>         g_printerr ("Error: %s\n", error->message);
>         g_error_free (error);
>         g_main_loop_quit (loop);
>         break;
>     }
>     default:
>         break;
>     }
>     return TRUE;
> }
>
> static void on_pad_added (GstElement *element, GstPad *pad, gpointer  data)
> {
>   GstPad *sinkpad;
>   GstElement * queue = (GstElement *) data;
>
>   /* We can now link this pad with the vorbis-decoder sink pad */
>   g_print ("Dynamic pad created, linking demuxer/decoder\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
> *&alfa2, GstElement * &color)
> {
>
>   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");
>   alfa2  = gst_element_factory_make ("alpha","alfa2");
>   color  = gst_element_factory_make ("ffmpegcolorspace", "color");
>   GstElement * mixer  = gst_element_factory_make("videomixer", "mixer");
>
>   if ((!alfa1) || (!alfa2) || (!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,alfa2,mixer,color,NULL);
>
>   // Enlazamos elementos
>   gst_element_link (alfa1, mixer);
>   gst_element_link (alfa2, mixer);
>   gst_element_link (mixer,color);
>
>   return bin;
> }
>
> void getAndSetController(GstElement * alfa2, gdouble duracion)
> {
>     GstController * ctrl = NULL;
>     if (!(ctrl = gst_controller_new (G_OBJECT (alfa2), "alpha",NULL))) {
>         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);
>
>
>   // Seteo los valores de control del alfa2
>
>   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);
>
>
>   g_value_set_double(&val_double, 0.0);
>   gst_interpolation_control_source_set(csource,(0*
> GST_MSECOND),&val_double);
>
>   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 * alfa2, 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 (alfa2, "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 crossFade(gdouble duracion, GstElement * & bin)
> {
>     // devuelve el bin
>     GstElement * alfa1, *alfa2, *color;
>     alfa1 = 0;
>     alfa2 = 0;
>     color = 0;
>
>     bin = getBin("bin",alfa1, alfa2,color);  // Crea el bin y los elementos
>
>     getAndSetController(alfa2,duracion);
>
>     addGhostPadsToBin(alfa1, alfa2, 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;
>
>      //we play two clips serially with a crossfade between them
>      // using the gnonlin gnlcomposition element.
>     if ((comp = gst_element_factory_make("gnlcomposition",
> "mycomposition")) == NULL)
>     {
>       printf ("\n Fallo al crear gnlcomposition \n");
>       return NULL;
>     }
>
>     // setup first 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, "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);
>
>     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;
>     }
>
>     // setup second clip
>     g_object_set (video2, "location", 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 crossfade
>     op = gst_element_factory_make("gnloperation", "op");
>
>     crossFade(dur_crossfade, bin);
>
>     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;
>     }
>
>     // 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);
>
>     cout << "creó pipeline!!!" << endl;
>
>     return pipeline;
>
> }
>
> void startPlay(GstElement * pip)
> {
>     /* Set the pipeline to "playing" state*/
>   cout << "antes del PLAY" << endl;
>   gst_element_set_state (pip, GST_STATE_PLAYING);
>   cout << "dp del PLAY" << endl;
>
> }
>
>
> 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);
>
>     /* make sure we have a URI */
>     if (argc != 3)
>     {
>         g_print ("Uso: %s <URI1>  <URI2>\n", argv[0]);
>         return -1;
>     }
>
>     GstElement * play = getSetPipeline(argv);
>
>     cout << "creo pipeline" << endl;
>
>     GstBus *bus2 = gst_pipeline_get_bus (GST_PIPELINE (play));
>     gst_bus_add_watch (bus2, bus_call, loop);
>     gst_object_unref (bus2);
>
>     cout << "start 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;
> }
>
>
>
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>


-- 

Ángel Martín Navas
Investigador / Researcher
Televisión Digital y Servicios Multimedia / Digital TV & Multimedia Services

Vicomtech - Visual Interaction Communication Technologies
Mikeletegi Pasealekua, 57 - Parque Tecnológico
20009 Donostia - San Sebastián - Spain
Tel: +[34] 943 30 92 30
Fax: +[34] 943 30 93 93
e-mail: amartin at vicomtech.org
www.vicomtech.org

*** member of IK4 Research Alliance ****
www.ik4.es
*** member of GraphicsMedia.net ****
www.graphicsmedia.net



-----------------------------------------------------
Vicomtech is an ISO 9001:2000 certified institute
-----------------------------------------------------

Este mensaje se dirige exclusivamente a su destinatario.
La información incluida en el presente correo es confidencial sometida a
secreto profesional, especialmente en lo que respecta a los datos de
carácter personal, cuya divulgación está prohibida, en virtud de la
legislación vigente. Si usted no es el destinatario legítimo y lo ha
recibido por error o tiene conocimiento del mismo por cualquier motivo,
le rogamos que nos lo comunique por este medio y proceda a destruirlo o
borrarlo. En todo caso abstengase de utilizar, reproducir, alterar,
archivar o comunicar a terceros el presente mensaje así como los ficheros
anexos, todo ello bajo pena de incurrir en responsabilidades legales.
Cualquier opinión contenida en este correo es exclusiva de su autor y no
representa necesariamente la opinión de ASOCIACIÓN CENTRO DE TECNOLOGÍAS
DE INTERACCIÓN VISUAL Y COMUNICACIONES VICOMTECH (en adelante Vicomtech-IK4)
El emisor no garantiza la integridad, rapidez o seguridad del presente correo,
ni se responsabiliza de posibles perjuicios derivados de la captura,
incorporaciones de virus o cualesquiera otras manipulaciones
efectuadas por terceros.
Con motivo de la entrada en vigor de la Ley 34/2002, de 11 de julio, de
Servicios de la Sociedad de la Información y de Comercio Electrónico, le
informamos que pueden revocar en cualquier momento, de forma sencilla
y gratuita,
el consentimiento para la recepción de mensajes de vicomtech.org en
info.lopd at vicomtech.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20110907/d9e9988a/attachment-0001.html>


More information about the gstreamer-devel mailing list