[gst-devel] Problem using gstrtpbin

Wim Taymans wim.taymans at gmail.com
Mon May 11 19:58:59 CEST 2009


On Mon, 2009-05-11 at 14:19 -0300, Tiago Katcipis wrote:
> but the ssrc is being created, why does the pad not? i get all the
> msgs the pipeline sends and print them all and i get no error, i
> already made a test with just a udpsrc ! filesink and the data is
> comming.

Because those signals are emitted when a source is created in the
session, which happens before the various pt/ssrc demuxers add the pad
to gstrtpbin.

Wim

> 
> On Mon, May 11, 2009 at 2:06 PM, Wim Taymans <wim.taymans at gmail.com>
> wrote:
>         On Mon, 2009-05-11 at 13:55 -0300, Tiago Katcipis wrote:
>         > i still didnt the teste, but i found this
>         >
>         
>         
>         
>         Sometimes (dynamic pads) on elements *always* get notified to
>         you with
>         the "pad-added" callback. This is a signal on GstElement. You
>         will get
>         the newly created pads from gstrtpbin with this signal. The
>         other
>         signals you are trying to connect to are for something else.
>         
>         Wim
>         
>         
>         >
>         http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-plugins/html/gst-plugins-bad-plugins-gstrtpssrcdemux.html#GstRtpSsrcDemux-new-ssrc-pad
>         >
>         > the GstRtpSsrcDemux sends the signal, i tried to get the
>         signal from
>         > the bin with:
>         >
>         > g_signal_connect (rtp_bin, "new-ssrc-pad", G_CALLBACK
>         > (on_new_ssrc_pad), rtp_decoder);
>         >
>         > but i didnt got the signal.
>         >
>         > My question is, i can get the signal from an element inside
>         the bin
>         > from the bin or i have to retrieve the element from the bin
>         and then
>         > connect? and if i have to get the element from the bin (in
>         this case
>         > the GstRtpSsrcDemux),  how is the cleanest way of doing
>         this?
>         >
>         > thanks for all the help.
>         > Best regards,
>         > Katcipis
>         >
>         > here goes the src:
>         >
>         > #include <gst/gst.h>
>         > #include <glib.h>
>         >
>         > #define PORTA_UDP_ENTRADA 5000
>         >
>         > 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("Tipo da mensagem [%d], Nome da mensagem [%
>         s]\n",
>         > GST_MESSAGE_TYPE (msg), GST_MESSAGE_TYPE_NAME(msg));
>         >       break;
>         >   }
>         >
>         >   return TRUE;
>         > }
>         >
>         >
>         > static void
>         > on_new_ssrc (GstElement* gstrtpbin,
>         >                    guint session,
>         >                    guint ssrc,
>         >                    gpointer data)
>         > {
>         >   GstPad* sinkpad;
>         >   GstPad* srcpad[1];
>         >   GstElement* decoder = (GstElement *) data;
>         >   GstIterator* iter;
>         >   gint done, linked, iter_count;
>         >
>         >   g_print ("New session stabilished, linking gstrtpbin
>         session src pad
>         > to the rtp_decoder\n");
>         >
>         >   sinkpad = gst_element_get_static_pad(decoder, "sink");
>         >   // TODO Esta dificil de pegar o pad src do gstrtpbin que
>         eh criado
>         > ao iniciar uma sessao nova.
>         >   if(!sinkpad){
>         >       g_warning("Error getting rtp_decoder sink pad");
>         >       return;
>         >   }
>         >   /*
>         >      unique pad recv_rtp_src_%d_%d_%d on gstrtpbin with the
>         session
>         > number, SSRC and payload type respectively as the pad name.
>         >
>         >
>         http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-plugins/html/gst-plugins-bad-plugins-gstrtpbin.html
>         >   */
>         >
>         >   iter = gst_element_iterate_src_pads(gstrtpbin);
>         >   if(!iter){
>         >       g_warning("Error getting gstrtpbin pads iterator");
>         >       return;
>         >   }
>         >
>         >   done = FALSE;
>         >   linked = FALSE;
>         >   iter_count = 0;
>         >
>         >   while (!done) {
>         >       switch (gst_iterator_next (iter, (gpointer *) srcpad))
>         {
>         >           case GST_ITERATOR_OK:
>         >               if(gst_pad_link (*srcpad, sinkpad) !=
>         GST_PAD_LINK_OK){
>         >                   g_warning("Error linking gstrtpbin pad[%s]
>         to
>         > rtp_decoder pad[%s]", gst_pad_get_name(*srcpad),
>         > gst_pad_get_name(sinkpad));
>         >               }else{
>         >                   g_warning("Linked gstrtpbin pad[%s] to
>         rtp_decoder
>         > pad[%s] with success", gst_pad_get_name(*srcpad),
>         > gst_pad_get_name(sinkpad));
>         >                   linked = TRUE;
>         >               }
>         >               iter_count++;
>         >               gst_object_unref (*srcpad);
>         >           break;
>         >           case GST_ITERATOR_RESYNC:
>         >               gst_iterator_resync (iter);
>         >           break;
>         >           case GST_ITERATOR_ERROR:
>         >               done = TRUE;
>         >           break;
>         >           case GST_ITERATOR_DONE:
>         >               done = TRUE;
>         >           break;
>         >       }
>         >    }
>         >   if(!linked){
>         >       g_warning("failed to found a valid recv_src_pad on
>         gstrtpbin");
>         >   }
>         >   g_debug("GstRtpBin has [%d] src pads", iter_count);
>         >
>         >   gst_iterator_free (iter);
>         >   gst_object_unref (sinkpad);
>         > }
>         >
>         > static void
>         > on_new_ssrc_pad (GstElement *element,
>         >                  GstPad     *pad,
>         >                  guint      ssrc,
>         >                  gpointer   data)
>         > {
>         >   GstPad *sinkpad;
>         >   GstElement *decoder = (GstElement *) data;
>         >
>         >   /* We can now link this pad with the converter sink pad */
>         >   g_print ("Dynamic ssrc pad created, linking the pad to the
>         > rtp_decoder\n");
>         >
>         >   sinkpad = gst_element_get_static_pad (decoder, "sink");
>         >   if(gst_pad_link (pad, sinkpad) != GST_PAD_LINK_OK){
>         >       gchar* name = gst_pad_get_name(pad);
>         >       g_warning("Error linking the pad[%s] to rtp_decoder
>         sinkpad",
>         > name);
>         >       g_free(name);
>         >   }
>         >
>         >   gst_object_unref (sinkpad);
>         > }
>         >
>         > int
>         > main (int   argc,
>         >       char *argv[])
>         > {
>         >   GMainLoop *loop;
>         >
>         >   GstElement *pipeline, *source, *rtp_bin, *rtp_decoder,
>         *sink;
>         >   GstPad *gstrtp_sink_pad;
>         >   GstBus *bus;
>         >
>         >   /* Initialisation */
>         >   gst_init (&argc, &argv);
>         >
>         >   loop = g_main_loop_new (NULL, FALSE);
>         >
>         >   /* Create gstreamer elements */
>         >   pipeline    = gst_pipeline_new ("audio-player");
>         >   source      = gst_element_factory_make
>         ("udpsrc","udp-source");
>         >   rtp_bin     = gst_element_factory_make ("gstrtpbin",
>         "gst_rtpbin");
>         >   rtp_decoder = gst_element_factory_make ("rtpL16depay",
>         > "rtp_decoder");
>         >   sink        = gst_element_factory_make ("filesink",
>         "file-sink");
>         >
>         >   if (!pipeline || !source || !sink || !rtp_decoder || !
>         rtp_bin) {
>         >     g_printerr ("One element could not be created.
>         Exiting.\n");
>         >     return -1;
>         >   }
>         >
>         >   gstrtp_sink_pad = gst_element_get_request_pad(rtp_bin,
>         > "recv_rtp_sink_0");
>         >   if (!gstrtp_sink_pad) {
>         >     g_printerr ("Sink pad could not be created.
>         Exiting.\n");
>         >     return -1;
>         >   }
>         >
>         >   /* Set up the pipeline */
>         >   g_object_set (G_OBJECT (source), "port",
>         PORTA_UDP_ENTRADA , NULL);
>         >   g_object_set (G_OBJECT (sink), "location",
>         "dados_recebidos_rtp" ,
>         > NULL);
>         >
>         >   /* 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 */
>         >   /* file-source | ogg-demuxer | vorbis-decoder | converter
>         |
>         > alsa-output */
>         >   gst_bin_add_many (GST_BIN (pipeline),
>         >                     source, sink, rtp_bin, rtp_decoder,
>         NULL);
>         >
>         >   /* we link the elements together */
>         >   if(gst_pad_link(gst_element_get_static_pad(source, "src"),
>         > gstrtp_sink_pad) != GST_PAD_LINK_OK){
>         >       g_warning("Error linking source to the
>         gstrtp_sink_pad");
>         >       gst_object_unref (GST_OBJECT (pipeline));
>         >       return 0;
>         >   }
>         >
>         >   /*
>         >     After the packets are released from the jitterbuffer,
>         they will be
>         > forwarded to a GstRtpsSrcDemux element.
>         >     The GstRtpsSrcDemux element will demux the packets based
>         on the
>         > payload type and will create a unique pad
>         >     recv_rtp_src_%d_%d_%d on gstrtpbin with the session
>         number, SSRC
>         > and payload type respectively as the pad name.
>         >     Because of that we have to dinamicaly link the src pads
>         on
>         > runtime.
>         >   */
>         >   g_signal_connect (rtp_bin, "new-ssrc-pad", G_CALLBACK
>         > (on_new_ssrc_pad), rtp_decoder);
>         >   g_signal_connect (rtp_bin, "on-new-ssrc",  G_CALLBACK
>         (on_new_ssrc),
>         > rtp_decoder);
>         >
>         >   if(!gst_element_link (rtp_decoder, sink)){
>         >       g_warning("Error linking the rtp_decoder to the
>         sink");
>         >       gst_object_unref (GST_OBJECT (pipeline));
>         >       return -1;
>         >   }
>         >
>         >   /* Set the pipeline to "playing" state*/
>         >   g_print ("listening on port: %d\n", PORTA_UDP_ENTRADA);
>         >   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 on port\n");
>         >   gst_element_set_state (pipeline, GST_STATE_NULL);
>         >
>         >   g_print ("Deleting pipeline\n");
>         >   gst_object_unref (GST_OBJECT (pipeline));
>         >
>         >   return 0;
>         > }
>         >
>         >
>         > On Sat, May 9, 2009 at 3:40 PM, Aurelien Grimaud
>         <gstelzz at yahoo.fr>
>         > wrote:
>         >         Sorry, I misread your code.
>         >         the pad-added signal is a signal of elements,
>         documented in
>         >         the element
>         >         documentation.
>         >         Do you receive RTP ?
>         >         Because the pad wont be created if you do not
>         receive RTP.
>         >         What does tcpdump tell ?
>         >
>         >         Aurelien
>         >         Tiago Katcipis a écrit :
>         >
>         >         > i did it, the pad never is created :-(, but i get
>         no message
>         >         of
>         >         > warning or error neither. And on the list of
>         signals of the
>         >         gstrtpbin
>         >         > there is no "pad-added" signal, its normal to the
>         signal
>         >         dont be there?
>         >         > *
>         >         > g_signal_connect (rtp_bin, "pad-added",
>         G_CALLBACK
>         >         (on_pad_added),
>         >         > rtp_decoder);*
>         >         >
>         >         > On Sat, May 9, 2009 at 3:55 AM, Aurelien Grimaud
>         >         <gstelzz at yahoo.fr
>         >
>         >
>         >         > <mailto:gstelzz at yahoo.fr>> wrote:
>         >         >
>         >         >     You should add the pad-added signal on the
>         rtpbin.
>         >         >     When it triggers, check the pad name to find
>         out which
>         >         pad it is.
>         >         >     If pad is a recv_rtp_src_%d_%d_%d, link your
>         decoder and
>         >         sink in the
>         >         >     call back.
>         >         >
>         >         >     Aurelien
>         >         >
>         >         >     Tiago Katcipis a écrit :
>         >         >     > Im trying to do a rtp stream sending data
>         and another
>         >         side receiving
>         >         >     > the data, the part that sends the data is
>         working
>         >         fine, but the part
>         >         >     > that receives is giving me a lot of trouble.
>         At
>         >         >     >
>         >         >
>         >
>         http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-plugins/html/gst-plugins-bad-plugins-gstrtpbin.html
>         >         >     > i have read:
>         >         >     >
>         >         >     > "To use GstRtpBin
>         >         >     >
>         >         >
>         >
>         <http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-plugins/html/gst-plugins-bad-plugins-gstrtpbin.html#GstRtpBin>
>         >         >     > as an RTP receiver, request a recv_rtp_sink_
>         %|d| pad.
>         >         The session
>         >         >     > number must be specified in the pad name.
>         Data
>         >         received on the
>         >         >     > recv_rtp_sink_%|d| pad will be processed in
>         the
>         >         gstrtpsession
>         >         >     manager
>         >         >     > and after being validated forwarded on
>         GstRtpsSrcDemux
>         >         element. Each
>         >         >     > RTP stream is demuxed based on the SSRC and
>         send to a
>         >         >     > GstRtpJitterBuffer
>         >         >     >
>         >         >
>         >
>         <http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-plugins/html/gst-plugins-bad-plugins-gstrtpjitterbuffer.html#GstRtpJitterBuffer>.
>         >         >     > After the packets are released from the
>         jitterbuffer,
>         >         they will be
>         >         >     > forwarded to a GstRtpsSrcDemux element. The
>         >         GstRtpsSrcDemux element
>         >         >     > will demux the packets based on the payload
>         type and
>         >         will create a
>         >         >     > unique pad recv_rtp_src_%|d_|%|d_|%|d| on
>         gstrtpbin
>         >         with the session
>         >         >     > number, SSRC and payload type respectively
>         as the pad
>         >         name. "
>         >         >     >
>         >         >     > on my application i cant get the
>         recv_rtp_src_%|d_|%|
>         >         d_|%|d,  |i
>         >         >     > already tried on a lot of ways, my last shot
>         was try
>         >         to iterate over
>         >         >     > all the pads on the bin and try to conect, i
>         >         discovered that the src
>         >         >     > pad never shows up. No error is given. I can
>         get the
>         >         on-new-ssrc
>         >         >     > signal...and other signals as  |
>         on-ssrc-validated...
>         >         but on all this
>         >         >     > signals the | recv_rtp_src_%|d_|%|d_|%|d is
>         not
>         >         created yet, i also
>         >         >     > tried to get the "on-pad-added" signal but
>         this signal
>         >         never
>         >         >     happens|.
>         >         >     >
>         >         >     > My problem is, when the recv_rtp_src_%|d_|%|
>         d_|%|d is
>         >         created|.
>         >         >     When i
>         >         >     > iterate over the pads i always get a
>         >         >     > ** (teste_rtp:9516): DEBUG: GstRtpBin has
>         [0] src pads
>         >         >     >
>         >         >     > here goes the source code, is a little messy
>         because
>         >         im all day
>         >         >     trying
>         >         >     > a lot of different ways to do this. And i
>         get no error
>         >         message.
>         >         >     >
>         >         >     > #include <gst/gst.h>
>         >         >     > #include <glib.h>
>         >         >     >
>         >         >     > #define PORTA_UDP_ENTRADA 5000
>         >         >     >
>         >         >     > 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("Tipo da mensagem [%d], Nome
>         da mensagem
>         >         [%s]\n",
>         >         >     > GST_MESSAGE_TYPE (msg),
>         GST_MESSAGE_TYPE_NAME(msg));
>         >         >     >       break;
>         >         >     >   }
>         >         >     >
>         >         >     >   return TRUE;
>         >         >     > }
>         >         >     >
>         >         >     >
>         >         >     > static void
>         >         >     > on_new_ssrc (GstElement* gstrtpbin,
>         >         >     >                    guint session,
>         >         >     >                    guint ssrc,
>         >         >     >                    gpointer data)
>         >         >     > {
>         >         >     >   GstPad* sinkpad;
>         >         >     >   GstPad* srcpad[1];
>         >         >     >   GstElement* decoder = (GstElement *) data;
>         >         >     >   GstIterator* iter;
>         >         >     >   gint done, linked, iter_count;
>         >         >     >
>         >         >     >   g_print ("New session stabilished, linking
>         gstrtpbin
>         >         session
>         >         >     src pad
>         >         >     > to the rtp_decoder\n");
>         >         >     >
>         >         >     >   sinkpad =
>         gst_element_get_static_pad(decoder,
>         >         "sink");
>         >         >     >   // TODO Esta dificil de pegar o pad src do
>         gstrtpbin
>         >         que eh criado
>         >         >     > ao iniciar uma sessao nova.
>         >         >     >   if(!sinkpad){
>         >         >     >       g_warning("Error getting rtp_decoder
>         sink pad");
>         >         >     >       return;
>         >         >     >   }
>         >         >     >   /*
>         >         >     >      unique pad recv_rtp_src_%d_%d_%d on
>         gstrtpbin
>         >         with the session
>         >         >     > number, SSRC and payload type respectively
>         as the pad
>         >         name.
>         >         >     >
>         >         >     >
>         >         >
>         >
>         http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-plugins/html/gst-plugins-bad-plugins-gstrtpbin.html
>         >         >     >   */
>         >         >     >
>         >         >     >   iter =
>         gst_element_iterate_src_pads(gstrtpbin);
>         >         >     >   if(!iter){
>         >         >     >       g_warning("Error getting gstrtpbin
>         pads
>         >         iterator");
>         >         >     >       return;
>         >         >     >   }
>         >         >     >
>         >         >     >   done = FALSE;
>         >         >     >   linked = FALSE;
>         >         >     >   iter_count = 0;
>         >         >     >
>         >         >     >   while (!done) {
>         >         >     >       switch (gst_iterator_next (iter,
>         (gpointer *)
>         >         srcpad)) {
>         >         >     >           case GST_ITERATOR_OK:
>         >         >     >               if(gst_pad_link (*srcpad,
>         sinkpad) !=
>         >         >     GST_PAD_LINK_OK){
>         >         >     >                   g_warning("Error linking
>         gstrtpbin
>         >         pad[%s] to
>         >         >     > rtp_decoder pad[%s]",
>         gst_pad_get_name(*srcpad),
>         >         >     > gst_pad_get_name(sinkpad));
>         >         >     >               }else{
>         >         >     >                   g_warning("Linked
>         gstrtpbin pad[%s]
>         >         to rtp_decoder
>         >         >     > pad[%s] with success",
>         gst_pad_get_name(*srcpad),
>         >         >     > gst_pad_get_name(sinkpad));
>         >         >     >                   linked = TRUE;
>         >         >     >               }
>         >         >     >               iter_count++;
>         >         >     >               gst_object_unref (*srcpad);
>         >         >     >           break;
>         >         >     >           case GST_ITERATOR_RESYNC:
>         >         >     >               gst_iterator_resync (iter);
>         >         >     >           break;
>         >         >     >           case GST_ITERATOR_ERROR:
>         >         >     >               done = TRUE;
>         >         >     >           break;
>         >         >     >           case GST_ITERATOR_DONE:
>         >         >     >               done = TRUE;
>         >         >     >           break;
>         >         >     >       }
>         >         >     >    }
>         >         >     >   if(!linked){
>         >         >     >       g_warning("failed to found a valid
>         recv_src_pad
>         >         on
>         >         >     gstrtpbin");
>         >         >     >   }
>         >         >     >   g_debug("GstRtpBin has [%d] src pads",
>         iter_count);
>         >         >     >
>         >         >     >   gst_iterator_free (iter);
>         >         >     >   gst_object_unref (sinkpad);
>         >         >     > }
>         >         >     >
>         >         >     > static void
>         >         >     > on_pad_added (GstElement *element,
>         >         >     >               GstPad     *pad,
>         >         >     >               gpointer    data)
>         >         >     > {
>         >         >     >   GstPad *sinkpad;
>         >         >     >   GstElement *decoder = (GstElement *) data;
>         >         >     >
>         >         >     >   /* We can now link this pad with the
>         converter sink
>         >         pad */
>         >         >     >   g_print ("Dynamic pad created, linking
>         >         wavparser/converter\n");
>         >         >     >
>         >         >     >   sinkpad = gst_element_get_static_pad
>         (decoder,
>         >         "sink");
>         >         >     >   if(gst_pad_link (pad, sinkpad) !=
>         GST_PAD_LINK_OK){
>         >         >     >       g_warning("Error linking recv_rtp_src
>         pad to
>         >         sinkpad");
>         >         >     >   }
>         >         >     >   gst_object_unref (sinkpad);
>         >         >     > }
>         >         >     >
>         >         >     > int
>         >         >     > main (int   argc,
>         >         >     >       char *argv[])
>         >         >     > {
>         >         >     >   GMainLoop *loop;
>         >         >     >
>         >         >     >   GstElement *pipeline, *source, *rtp_bin,
>         >         *rtp_decoder, *sink;
>         >         >     >   GstPad *gstrtp_sink_pad;
>         >         >     >   GstBus *bus;
>         >         >     >
>         >         >     >   /* Initialisation */
>         >         >     >   gst_init (&argc, &argv);
>         >         >     >
>         >         >     >   loop = g_main_loop_new (NULL, FALSE);
>         >         >     >
>         >         >     >   /* Create gstreamer elements */
>         >         >     >   pipeline    = gst_pipeline_new
>         ("audio-player");
>         >         >     >   source      = gst_element_factory_make
>         >         ("udpsrc","udp-source");
>         >         >     >   rtp_bin     = gst_element_factory_make
>         ("gstrtpbin",
>         >         >     "gst_rtpbin");
>         >         >     >   rtp_decoder = gst_element_factory_make
>         >         ("rtpL16depay",
>         >         >     "rtp_decoder");
>         >         >     >   sink        = gst_element_factory_make
>         ("filesink",
>         >         "file-sink");
>         >         >     >
>         >         >     >   if (!pipeline || !source || !sink || !
>         rtp_decoder
>         >         || !rtp_bin) {
>         >         >     >     g_printerr ("One element could not be
>         created.
>         >         Exiting.\n");
>         >         >     >     return -1;
>         >         >     >   }
>         >         >     >
>         >         >     >   gstrtp_sink_pad =
>         >         gst_element_get_request_pad(rtp_bin,
>         >         >     > "recv_rtp_sink_0");
>         >         >     >   if (!gstrtp_sink_pad) {
>         >         >     >     g_printerr ("Sink pad could not be
>         created.
>         >         Exiting.\n");
>         >         >     >     return -1;
>         >         >     >   }
>         >         >     >
>         >         >     >   /* Set up the pipeline */
>         >         >     >   g_object_set (G_OBJECT (source), "port",
>         >         PORTA_UDP_ENTRADA ,
>         >         >     NULL);
>         >         >     >   g_object_set (G_OBJECT (sink), "location",
>         >         "dados_recebidos_rtp" ,
>         >         >     > NULL);
>         >         >     >
>         >         >     >   /* 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
>         */
>         >         >     >   /* file-source | ogg-demuxer |
>         vorbis-decoder |
>         >         converter |
>         >         >     > alsa-output */
>         >         >     >   gst_bin_add_many (GST_BIN (pipeline),
>         >         >     >                     source, sink, rtp_bin,
>         >         rtp_decoder, NULL);
>         >         >     >
>         >         >     >   /* we link the elements together */
>         >         >     >
>         if(gst_pad_link(gst_element_get_static_pad(source,
>         >         "src"),
>         >         >     > gstrtp_sink_pad) != GST_PAD_LINK_OK){
>         >         >     >       g_warning("Error linking source to the
>         >         gstrtp_sink_pad");
>         >         >     >       gst_object_unref (GST_OBJECT
>         (pipeline));
>         >         >     >       return 0;
>         >         >     >   }
>         >         >     >
>         >         >     >   /*
>         >         >     >     After the packets are released from the
>         >         jitterbuffer, they
>         >         >     will be
>         >         >     > forwarded to a GstRtpsSrcDemux element.
>         >         >     >     The GstRtpsSrcDemux element will demux
>         the packets
>         >         based on the
>         >         >     > payload type and will create a unique pad
>         >         >     >     recv_rtp_src_%d_%d_%d on gstrtpbin with
>         the
>         >         session number, SSRC
>         >         >     > and payload type respectively as the pad
>         name.
>         >         >     >     Because of that we have to dinamicaly
>         link the src
>         >         pads on
>         >         >     runtime.
>         >         >     >   */
>         >         >     >   g_signal_connect (rtp_bin, "pad-added",
>         G_CALLBACK
>         >         >     (on_pad_added),
>         >         >     > rtp_decoder);
>         >         >     >   g_signal_connect (rtp_bin, "on-new-ssrc",
>         G_CALLBACK
>         >         >     (on_new_ssrc),
>         >         >     > rtp_decoder);
>         >         >     >
>         >         >     >   if(!gst_element_link (rtp_decoder, sink)){
>         >         >     >       g_warning("Error linking the
>         rtp_decoder to the
>         >         sink");
>         >         >     >       gst_object_unref (GST_OBJECT
>         (pipeline));
>         >         >     >       return -1;
>         >         >     >   }
>         >         >     >
>         >         >     >   /* Set the pipeline to "playing" state*/
>         >         >     >   g_print ("listening on port: %d\n",
>         >         PORTA_UDP_ENTRADA);
>         >         >     >   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 on
>         port\n");
>         >         >     >   gst_element_set_state (pipeline,
>         GST_STATE_NULL);
>         >         >     >
>         >         >     >   g_print ("Deleting pipeline\n");
>         >         >     >   gst_object_unref (GST_OBJECT (pipeline));
>         >         >     >
>         >         >     >   return 0;
>         >         >     > }
>         >         >     >
>         >         >     >
>         >         >
>         >
>         ------------------------------------------------------------------------
>         >         >     >
>         >         >     >
>         >         >
>         >
>         ------------------------------------------------------------------------------
>         >         >     > The NEW KODAK i700 Series Scanners deliver
>         under ANY
>         >         >     circumstances! Your
>         >         >     > production scanning environment may not be a
>         perfect
>         >         world - but
>         >         >     thanks to
>         >         >     > Kodak, there's a perfect scanner to get the
>         job done!
>         >         With the
>         >         >     NEW KODAK i700
>         >         >     > Series Scanner you'll get full speed at 300
>         dpi even
>         >         with all image
>         >         >     > processing features enabled.
>         >         http://p.sf.net/sfu/kodak-com
>         >         >     >
>         >         >
>         >
>         ------------------------------------------------------------------------
>         >         >     >
>         >         >     >
>         _______________________________________________
>         >         >     > gstreamer-devel mailing list
>         >         >     > gstreamer-devel at lists.sourceforge.net
>         >
>         >         >     <mailto:gstreamer-devel at lists.sourceforge.net>
>         >         >     >
>         >
>         https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>         >         >     >
>         >         >
>         >         >
>         >         >
>         >
>         ------------------------------------------------------------------------------
>         >         >     The NEW KODAK i700 Series Scanners deliver
>         under ANY
>         >         >     circumstances! Your
>         >         >     production scanning environment may not be a
>         perfect
>         >         world - but
>         >         >     thanks to
>         >         >     Kodak, there's a perfect scanner to get the
>         job done!
>         >         With the NEW
>         >         >     KODAK i700
>         >         >     Series Scanner you'll get full speed at 300
>         dpi even
>         >         with all image
>         >         >     processing features enabled.
>         >         http://p.sf.net/sfu/kodak-com
>         >         >
>         _______________________________________________
>         >         >     gstreamer-devel mailing list
>         >         >     gstreamer-devel at lists.sourceforge.net
>         >
>         >         >     <mailto: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
>         >         >
>         >
>         ------------------------------------------------------------------------
>         >         >
>         >         >
>         >
>         ------------------------------------------------------------------------------
>         >         > The NEW KODAK i700 Series Scanners deliver under
>         ANY
>         >         circumstances! Your
>         >         > production scanning environment may not be a
>         perfect world -
>         >         but thanks to
>         >         > Kodak, there's a perfect scanner to get the job
>         done! With
>         >         the NEW KODAK i700
>         >         > Series Scanner you'll get full speed at 300 dpi
>         even with
>         >         all image
>         >         > processing features enabled.
>         http://p.sf.net/sfu/kodak-com
>         >         >
>         >
>         ------------------------------------------------------------------------
>         >         >
>         >         > _______________________________________________
>         >         > gstreamer-devel mailing list
>         >         > gstreamer-devel at lists.sourceforge.net
>         >         >
>         https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>         >         >
>         >
>         >
>         >
>         ------------------------------------------------------------------------------
>         >         The NEW KODAK i700 Series Scanners deliver under ANY
>         >         circumstances! Your
>         >         production scanning environment may not be a perfect
>         world -
>         >         but thanks to
>         >         Kodak, there's a perfect scanner to get the job
>         done! With the
>         >         NEW KODAK i700
>         >         Series Scanner you'll get full speed at 300 dpi even
>         with all
>         >         image
>         >         processing features enabled.
>         http://p.sf.net/sfu/kodak-com
>         >         _______________________________________________
>         >         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
>         >
>         ------------------------------------------------------------------------------
>         > The NEW KODAK i700 Series Scanners deliver under ANY
>         circumstances! Your
>         > production scanning environment may not be a perfect world -
>         but thanks to
>         > Kodak, there's a perfect scanner to get the job done! With
>         the NEW KODAK i700
>         > Series Scanner you'll get full speed at 300 dpi even with
>         all image
>         > processing features enabled. http://p.sf.net/sfu/kodak-com
>         > _______________________________________________
>         gstreamer-devel mailing list
>         gstreamer-devel at lists.sourceforge.net
>         https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>         
>         
>         ------------------------------------------------------------------------------
>         The NEW KODAK i700 Series Scanners deliver under ANY
>         circumstances! Your
>         production scanning environment may not be a perfect world -
>         but thanks to
>         Kodak, there's a perfect scanner to get the job done! With the
>         NEW KODAK i700
>         Series Scanner you'll get full speed at 300 dpi even with all
>         image
>         processing features enabled. http://p.sf.net/sfu/kodak-com
>         _______________________________________________
>         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
> ------------------------------------------------------------------------------
> The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
> production scanning environment may not be a perfect world - but thanks to
> Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
> Series Scanner you'll get full speed at 300 dpi even with all image 
> processing features enabled. http://p.sf.net/sfu/kodak-com
> _______________________________________________ gstreamer-devel mailing list gstreamer-devel at lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gstreamer-devel





More information about the gstreamer-devel mailing list