[gst-devel] Problem using appsink on simple example

Andoni Morales ylatuya at gmail.com
Thu Jul 9 00:57:42 CEST 2009


2009/7/9 Andoni Morales <ylatuya at gmail.com>:
> 2009/7/9 Tiago Katcipis <katcipis at inf.ufsc.br>:
>> Puting appsink on the place of filesink dont works too. My problem is that
>> even filesink stops to work when i just add the appsink to the bin. It seens
> If you need to have an element in the pipeline that it's not linked
> b/c you may want to link it dinamically you need to lock it's state
> usin GST_STATE_LOCK(appsink), this way state changes won't affect to
I meant gst_element_set_locked_state(appsink)
> this element.
> Andoni
>> that only adding the appsink to the bin makes the pipe stop working.
>>
>> best regards,
>> Katcipis
>>
>> On Wed, Jul 8, 2009 at 7:32 PM, thiagoss <thiagossantos at gmail.com> wrote:
>>>
>>>
>>> On Wed, Jul 8, 2009 at 11:25 AM, Tiago Katcipis <katcipis at inf.ufsc.br>
>>> wrote:
>>>>
>>>> Im going to use appsink on a project using gstreamer and started to build
>>>> a basic example os]f how to use appsink using signals. My problem is that
>>>> when i simply add the appsink to the pipeline, the pipe simply stops to
>>>> work.
>>>>
>>>> On the following example im just trying to use the appsink instead the
>>>> filesink to write the entire stream to a file. If i use the filesink and
>>>> DONT add the appsink to the pipe, it works fine, if i just add the appsink
>>>> to the pipe ....it stops working, im not even using the appsink yet, the
>>>> filesink stops to write data, the result of the test will be an empty file,
>>>> and no error msg is sent. I dont know what detail im missing on how to use
>>>> appsink, hope someone can help me. By the way, gst_bin_add returns TRUE when
>>>> i add the appsink.
>>>>
>>>> the source code of the example:
>>>>
>>>> #include <gst/gst.h>
>>>> #include <glib.h>
>>>> #include <gst/app/gstappsink.h>
>>>> #include <stdio.h>
>>>>
>>>> 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 ("End of 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:
>>>>       g_print("Msg type[%d], Msg type name[%s]\n", GST_MESSAGE_TYPE(msg),
>>>> GST_MESSAGE_TYPE_NAME(msg));
>>>>       break;
>>>>   }
>>>>
>>>>   return TRUE;
>>>> }
>>>>
>>>>
>>>> static void link_two_elements(GstElement* src_element, GstElement*
>>>> sink_element)
>>>> {
>>>>   if(!gst_element_link(src_element, sink_element))
>>>>       g_debug("Error linking %s to %s",
>>>> gst_element_get_name(src_element), gst_element_get_name(sink_element));
>>>>
>>>> }
>>>>
>>>> static void link_two_pads(GstPad* src_pad, GstPad* sink_pad)
>>>> {
>>>>   if(!src_pad){
>>>>       g_warning("Error: src_pad is NULL on link_two_pads");
>>>>       return;
>>>>   }
>>>>
>>>>   if(!sink_pad){
>>>>       g_warning("Error: sink_pad is NULL on link_two_pads");
>>>>       return;
>>>>   }
>>>>
>>>>   if(gst_pad_link(src_pad, sink_pad) != GST_PAD_LINK_OK)
>>>>       g_debug("Error linking pads %s to %s", gst_pad_get_name(src_pad),
>>>> gst_pad_get_name(sink_pad));
>>>>
>>>> }
>>>>
>>>> static void on_new_buffer (GstElement* object,
>>>>                            gpointer user_data)
>>>> {
>>>>   FILE* file = (FILE*) user_data;
>>>>   GstAppSink* app_sink = (GstAppSink*) object;
>>>>   GstBuffer * buffer = gst_app_sink_pull_buffer(app_sink);
>>>>
>>>>   if(fwrite (GST_BUFFER_DATA(buffer), 1 , GST_BUFFER_SIZE(buffer) , file)
>>>> != GST_BUFFER_SIZE(buffer)){
>>>>       g_debug("Error writing data from appsink to file!!!");
>>>>   }else{
>>>>       g_debug("Data pulled from appsink and writed to file with
>>>> success!!");
>>>>   }
>>>>
>>>> }
>>>>
>>>> // Pipe to test this src: gst-launch audiotestsrc ! audioconvert !
>>>> alawenc ! rtppcmapay ! udpsink host=127.0.0.1 port=5000
>>>> // Equivalent working pipe: gst-launch udpsrc port=5000
>>>> caps=application/x-rtp ! gstrtpjitterbuffer ! rtppcmadepay ! alawdec !
>>>> audioconvert ! lame ! appsink
>>>> int
>>>> main (int   argc,
>>>>       char *argv[])
>>>> {
>>>>   GMainLoop *loop;
>>>>
>>>>   GstElement *pipeline, *source, *rtp_jitter, *rtp_alaw_depay,
>>>>              *alaw_decoder, *audio_convert, *lame, *filesink, *appsink;
>>>>   GstBus* bus;
>>>>   GstCaps* udp_caps;
>>>>   FILE* appsink_file;
>>>>   int udp_port;
>>>>
>>>>   if(argc < 2){
>>>>       g_warning("Usage: %s [port_to_be_listened]", argv[0]);
>>>>       return -1;
>>>>   }
>>>>
>>>>   udp_port = atoi(argv[1]);
>>>>
>>>>   /* Initialisation */
>>>>   gst_init (&argc, &argv);
>>>>
>>>>   udp_caps = gst_caps_from_string("application/x-rtp");
>>>>   if(!udp_caps){
>>>>       g_warning("Error alocating the udp caps");
>>>>       return -1;
>>>>   }
>>>>
>>>>   loop = g_main_loop_new (NULL, FALSE);
>>>>
>>>>   /* Create gstreamer elements */
>>>>   pipeline      = gst_pipeline_new("rtp-mp3-stream-decoder");
>>>>   source        = gst_element_factory_make("udpsrc",  "udp-rtp-source");
>>>>   rtp_jitter     = gst_element_factory_make("gstrtpjitterbuffer",
>>>> "rtp-jitter-buffer");
>>>>   rtp_alaw_depay = gst_element_factory_make("rtppcmadepay",
>>>> "rtp_alaw_depay");
>>>>   alaw_decoder   = gst_element_factory_make("alawdec","alaw-decoder");
>>>>   audio_convert  =
>>>> gst_element_factory_make("audioconvert","audio-convert");
>>>>   lame           = gst_element_factory_make("lame","mp3-encoder");
>>>>   filesink       = gst_element_factory_make("filesink",
>>>> "file-mp3-output");
>>>>   appsink        = gst_element_factory_make("appsink", "sink-buffer");
>>>>
>>>>
>>>>   if (!pipeline || !source || !rtp_jitter || !appsink ||
>>>>       !rtp_alaw_depay || !alaw_decoder || !audio_convert || !lame ||
>>>> !filesink) {
>>>>       g_printerr ("Elements could not be created. Exiting.\n");
>>>>       return -1;
>>>>   }
>>>>
>>>>   appsink_file = fopen("received_audio_appsink.mp3", "w");
>>>>   if(!appsink_file){
>>>>       g_printerr ("Appsink file could not be created. Exiting.\n");
>>>>       return -1;
>>>>   }
>>>>
>>>>   /* Set up the pipeline */
>>>>
>>>>   /* we set the properties to the source element to receive only rtp
>>>> packets*/
>>>>   g_object_set(G_OBJECT (source), "port", udp_port, NULL);
>>>>   g_object_set(G_OBJECT (source), "caps", udp_caps, NULL);
>>>>   /* we set the location of the mp3 generated file */
>>>>   g_object_set(G_OBJECT (filesink), "location",
>>>> "received_audio_filesink.mp3", NULL);
>>>>
>>>>   /*
>>>>     Make appsink emit the "new-preroll" and "new-buffer" signals. This
>>>> option is by default disabled because
>>>>     signal emission is expensive and unneeded when the application
>>>> prefers to operate in pull mode.
>>>>   */
>>>>   gst_app_sink_set_emit_signals ((GstAppSink*) appsink, TRUE);
>>>>
>>>>   /* we add a message handler */
>>>>   bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
>>>>   gst_bus_add_watch (bus, bus_call, loop);
>>>>   gst_object_unref (bus);
>>>>
>>>>   /* we add all elements into the pipeline */
>>>>   gst_bin_add_many (GST_BIN (pipeline),
>>>>                     source, rtp_jitter, rtp_alaw_depay, alaw_decoder,
>>>> audio_convert, lame, filesink, NULL);
>>>>
>>>>   /* When i just addn the appsink this the example stops to work and the
>>>> file will be empty (and im not using the appsink, just the filesink)
>>>>   if(gst_bin_add(GST_BIN (pipeline), appsink)){
>>>>       g_debug("Adcionou appsink com sucesso");
>>>>   }else{
>>>>       g_debug("Erro ao Adcionar appsink");
>>>>   }*/
>>>>
>>>>   /* we link all the elements together */
>>>>   link_two_elements(source, rtp_jitter);
>>>>   link_two_elements(rtp_jitter, rtp_alaw_depay);
>>>>   link_two_elements(rtp_alaw_depay, alaw_decoder);
>>>>   link_two_elements(alaw_decoder, audio_convert);
>>>>   link_two_elements(audio_convert, lame);
>>>>   link_two_elements(lame, filesink);
>>>
>>> Appsink (in this case of yours) is meant to *replace* filesink. You don't
>>> seem to link appsink to anything and also you link filesink to lame. So,
>>> remove filesink from your pipeline, and use appsink in its place.
>>>
>>>>
>>>>   /* Conecting to the new-buffer signal emited by the appsink */
>>>>   g_signal_connect (appsink, "new-buffer",  G_CALLBACK (on_new_buffer),
>>>> appsink_file);
>>>>
>>>>   /* Set the pipeline to "playing" state*/
>>>>   g_print ("Now listening on port: %d\n", udp_port);
>>>>   gst_element_set_state (pipeline, GST_STATE_PLAYING);
>>>>
>>>>   /* Iterate */
>>>>   g_print ("Running...\n");
>>>>   g_main_loop_run (loop);
>>>>
>>>>   /* Out of the main loop, clean up nicely */
>>>>   g_print ("Returned, stopping listening\n");
>>>>   gst_element_set_state (pipeline, GST_STATE_NULL);
>>>>
>>>>   g_print ("Deleting pipeline\n");
>>>>   gst_object_unref (GST_OBJECT (pipeline));
>>>>   fclose(appsink_file);
>>>>
>>>>   return 0;
>>>> }
>>>>
>>>>
>>>>
>>>> best regards,
>>>> Katcipis
>>>> --
>>>> "it might be a profitable thing to learn Java, but it has no intellectual
>>>> value whatsoever" Alexander Stepanov
>>>>
>>>>
>>>> ------------------------------------------------------------------------------
>>>> Enter the BlackBerry Developer Challenge
>>>> This is your chance to win up to $100,000 in prizes! For a limited time,
>>>> vendors submitting new applications to BlackBerry App World(TM) will have
>>>> the opportunity to enter the BlackBerry Developer Challenge. See full
>>>> prize
>>>> details at: http://p.sf.net/sfu/Challenge
>>>> _______________________________________________
>>>> gstreamer-devel mailing list
>>>> gstreamer-devel at lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>>>>
>>>
>>>
>>>
>>> --
>>> Thiago Sousa Santos
>>>
>>> Embedded Systems and Pervasive Computing Lab (Embedded)
>>> Center of Electrical Engineering and Informatics (CEEI)
>>> Federal University of Campina Grande (UFCG)
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> Enter the BlackBerry Developer Challenge
>>> This is your chance to win up to $100,000 in prizes! For a limited time,
>>> vendors submitting new applications to BlackBerry App World(TM) will have
>>> the opportunity to enter the BlackBerry Developer Challenge. See full
>>> prize
>>> details at: http://p.sf.net/sfu/Challenge
>>> _______________________________________________
>>> gstreamer-devel mailing list
>>> gstreamer-devel at lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>>>
>>
>>
>>
>> --
>> "it might be a profitable thing to learn Java, but it has no intellectual
>> value whatsoever" Alexander Stepanov
>>
>> ------------------------------------------------------------------------------
>> Enter the BlackBerry Developer Challenge
>> This is your chance to win up to $100,000 in prizes! For a limited time,
>> vendors submitting new applications to BlackBerry App World(TM) will have
>> the opportunity to enter the BlackBerry Developer Challenge. See full prize
>> details at: http://p.sf.net/sfu/Challenge
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>>
>>
>
>
>
> --
> Andoni Morales Alastruey
>
> LongoMatch:The Digital Coach
> http://www.longomatch.ylatuya.es
>



-- 
Andoni Morales Alastruey

LongoMatch:The Digital Coach
http://www.longomatch.ylatuya.es




More information about the gstreamer-devel mailing list