gstrtpbin and rtph264depay linking problem

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

gstrtpbin and rtph264depay linking problem

Qin Chen-2
Hi experts,

I am trying to write a pipeline for receiving and decoding H.264 RTP packets. Please see the C codes below. It is basically equivalent to following pipeline.
gst-launch -v gstrtpbin name=rtpbin                                          \
udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" \
port=5000 ! rtpbin.recv_rtp_sink_0 \
rtpbin. ! rtph264depay ! ffdec_h264 ! xvimagesink \

But I couldn't link gstrtpbin and rtph264depay. The error message is as follows:
0:00:00.135605335  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstutils.c:1587:gst_element_link_pads: trying to link element gst-rtp-bin:(any) to element rtp-decoder:(any)
0:00:00.135657988  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstelement.c:970:gst_element_get_static_pad: no such pad 'recv_rtp_src_%d_%d_%d' in element "gst-rtp-bin"
0:00:00.135679108  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstutils.c:1208:gst_element_get_compatible_pad:<gst-rtp-bin> Could not find a compatible pad to link to rtp-decoder:sink


Could someone give me some hints? Why I have no "recv_rtp_src_%d_%d_%d"? Or could someone lead me to similar examples? Thanks in advance!

Regards,

Qin


static

GstElement* construct_receiver_pipeline(void){
    GstElement *pipeline, *gstrtpbin, *vdec, *rtpdec, *vsink;
    GstElement *jitterbuf, *vconv;
    GstElement *udpsrc_rtp;
    GstCaps *caps;
    GstPad  *pad;
    gboolean err;
    GstPadLinkReturn res;

    //Create gstrtpbin
    gstrtpbin = gst_element_factory_make("gstrtpbin", "gst-rtp-bin");
    if ( !gstrtpbin ) {
        g_printerr("Failed to create gstrtpbin\n");
        return 0;
    }
    g_object_set(G_OBJECT (jitterbuf), "latency", jitter_latency, NULL);

    //RTP ource initialization
    udpsrc_rtp = gst_element_factory_make("udpsrc", "udp-udpsrc_rtp");
    if ( !udpsrc_rtp ) {
        g_printerr("Failed to create udpsrc\n");
        return 0;
    }
    g_object_set(G_OBJECT (udpsrc_rtp), "port", rtp_port, NULL);
    //gst_caps_new_simple and gst_element_linked_filter don't work
    g_object_set(G_OBJECT (udpsrc_rtp), "caps",
            gst_caps_from_string("application/x-rtp, "
                    "clock-rate=(int)90000, "
                    "payload=(int)96, "
                    "media=(string)video, "
                    "encoding-name=(string)H264"), NULL);

    //Create video decoder
    vdec = gst_element_factory_make(vdecoder, "video-decoder");
    if ( !vdec ) {
        g_printerr("Failed to create %s\n", vdecoder);
        return 0;
    }

    //Choose RTP decoder according to video codec
    rtpdecoder = g_strdup(select_rtp_decoder(vdecoder));
    g_free(vdecoder);

    //Create rtp decoder
    rtpdec = gst_element_factory_make(rtpdecoder, "rtp-decoder");
    if ( !rtpdec ) {
        g_printerr("Failed to create %s\n", rtpdecoder);
        return 0;
    }

    //Create video converter
    vconv = gst_element_factory_make("ffmpegcolorspace", "video-converter");
    if ( !vconv ) {
        g_printerr("Failed to create ffmpegcolorspace\n");
        return 0;
    }

    //Create video sink
    vsink = gst_element_factory_make("xvimagesink", "video-sink");
    if ( !vsink ) {
        g_printerr("Failed to create xvimagesink\n");
        return 0;
    }

    /* Set up the pipeline */
    gst_bin_add_many(GST_BIN (pipeline), udpsrc_rtp, gstrtpbin/*, jitterbuf*/,
            rtpdec, vdec, vconv, vsink, NULL);

    //link udpsrc_rtp to gstrtpbin
    pad = gst_element_get_request_pad(gstrtpbin, "recv_rtp_sink_%d");
    if ( !pad ) {
        g_printerr("Failed to create pad\n");
        return 0;
    }
    res = gst_pad_link(gst_element_get_pad(udpsrc_rtp, "src"), pad);
    gst_object_unref(GST_OBJECT (pad));
    if ( GST_PAD_LINK_FAILED(res)  ) {
        g_printerr("Failed to link pads\n");
        return 0;
    }

    err = gst_element_link_many(gstrtpbin, rtpdec, vdec, vconv, vsink, NULL);
    if ( err==FALSE ) {
        g_printerr("Failed to link elements\n");
        return 0;
    }

    return pipeline;
}

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: gstrtpbin and rtph264depay linking problem

Tiago Katcipis


On Mon, Mar 1, 2010 at 1:24 AM, Qin Chen <[hidden email]> wrote:
Hi experts,

I am trying to write a pipeline for receiving and decoding H.264 RTP packets. Please see the C codes below. It is basically equivalent to following pipeline.
gst-launch -v gstrtpbin name=rtpbin                                          \
udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" \
port=5000 ! rtpbin.recv_rtp_sink_0 \
rtpbin. ! rtph264depay ! ffdec_h264 ! xvimagesink \

But I couldn't link gstrtpbin and rtph264depay. The error message is as follows:
0:00:00.135605335  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstutils.c:1587:gst_element_link_pads: trying to link element gst-rtp-bin:(any) to element rtp-decoder:(any)
0:00:00.135657988  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstelement.c:970:gst_element_get_static_pad: no such pad 'recv_rtp_src_%d_%d_%d' in element "gst-rtp-bin"
0:00:00.135679108  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstutils.c:1208:gst_element_get_compatible_pad:<gst-rtp-bin> Could not find a compatible pad to link to rtp-decoder:sink


Could someone give me some hints? Why I have no "recv_rtp_src_%d_%d_%d"?


as you can see the "recv_rtp_src_%d_%d_%d" pad is created dinamically, you cant get it.

"To use 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. After the packets are released from the jitterbuffer, they will be forwarded to aGstRtpSsrcDemux 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."
 
Or could someone lead me to similar examples? Thanks in advance!

Regards,

Qin


static

GstElement* construct_receiver_pipeline(void){
    GstElement *pipeline, *gstrtpbin, *vdec, *rtpdec, *vsink;
    GstElement *jitterbuf, *vconv;
    GstElement *udpsrc_rtp;
    GstCaps *caps;
    GstPad  *pad;
    gboolean err;
    GstPadLinkReturn res;

    //Create gstrtpbin
    gstrtpbin = gst_element_factory_make("gstrtpbin", "gst-rtp-bin");
    if ( !gstrtpbin ) {
        g_printerr("Failed to create gstrtpbin\n");
        return 0;
    }
    g_object_set(G_OBJECT (jitterbuf), "latency", jitter_latency, NULL);

    //RTP ource initialization
    udpsrc_rtp = gst_element_factory_make("udpsrc", "udp-udpsrc_rtp");
    if ( !udpsrc_rtp ) {
        g_printerr("Failed to create udpsrc\n");
        return 0;
    }
    g_object_set(G_OBJECT (udpsrc_rtp), "port", rtp_port, NULL);
    //gst_caps_new_simple and gst_element_linked_filter don't work
    g_object_set(G_OBJECT (udpsrc_rtp), "caps",
            gst_caps_from_string("application/x-rtp, "
                    "clock-rate=(int)90000, "
                    "payload=(int)96, "
                    "media=(string)video, "
                    "encoding-name=(string)H264"), NULL);

    //Create video decoder
    vdec = gst_element_factory_make(vdecoder, "video-decoder");
    if ( !vdec ) {
        g_printerr("Failed to create %s\n", vdecoder);
        return 0;
    }

    //Choose RTP decoder according to video codec
    rtpdecoder = g_strdup(select_rtp_decoder(vdecoder));
    g_free(vdecoder);

    //Create rtp decoder
    rtpdec = gst_element_factory_make(rtpdecoder, "rtp-decoder");
    if ( !rtpdec ) {
        g_printerr("Failed to create %s\n", rtpdecoder);
        return 0;
    }

    //Create video converter
    vconv = gst_element_factory_make("ffmpegcolorspace", "video-converter");
    if ( !vconv ) {
        g_printerr("Failed to create ffmpegcolorspace\n");
        return 0;
    }

    //Create video sink
    vsink = gst_element_factory_make("xvimagesink", "video-sink");
    if ( !vsink ) {
        g_printerr("Failed to create xvimagesink\n");
        return 0;
    }

    /* Set up the pipeline */
    gst_bin_add_many(GST_BIN (pipeline), udpsrc_rtp, gstrtpbin/*, jitterbuf*/,
            rtpdec, vdec, vconv, vsink, NULL);

    //link udpsrc_rtp to gstrtpbin
    pad = gst_element_get_request_pad(gstrtpbin, "recv_rtp_sink_%d");
    if ( !pad ) {
        g_printerr("Failed to create pad\n");
        return 0;
    }
    res = gst_pad_link(gst_element_get_pad(udpsrc_rtp, "src"), pad);
    gst_object_unref(GST_OBJECT (pad));
    if ( GST_PAD_LINK_FAILED(res)  ) {
        g_printerr("Failed to link pads\n");
        return 0;
    }

    err = gst_element_link_many(gstrtpbin, rtpdec, vdec, vconv, vsink, NULL);
    if ( err==FALSE ) {
        g_printerr("Failed to link elements\n");
        return 0;
    }

    return pipeline;
}

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: gstrtpbin and rtph264depay linking problem

Qin Chen-2
Hi Tiago,

Thank you very much for your reply.

I didn't "request" the recv_rtp_src_%d_%d_%d pad. In my codes, I used
gst_element_link_many(gstrtpbin, rtpdec, vdec, vconv, vsink, NULL); and hope that I can get the "dynamically" created pad. But according to the error message, no such pad was created. Any idea? Thanks

Regards,

Qin



On Mon, Mar 1, 2010 at 7:20 AM, Tiago Katcipis <[hidden email]> wrote:


On Mon, Mar 1, 2010 at 1:24 AM, Qin Chen <[hidden email]> wrote:
Hi experts,

I am trying to write a pipeline for receiving and decoding H.264 RTP packets. Please see the C codes below. It is basically equivalent to following pipeline.
gst-launch -v gstrtpbin name=rtpbin                                          \
udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" \
port=5000 ! rtpbin.recv_rtp_sink_0 \
rtpbin. ! rtph264depay ! ffdec_h264 ! xvimagesink \

But I couldn't link gstrtpbin and rtph264depay. The error message is as follows:
0:00:00.135605335  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstutils.c:1587:gst_element_link_pads: trying to link element gst-rtp-bin:(any) to element rtp-decoder:(any)
0:00:00.135657988  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstelement.c:970:gst_element_get_static_pad: no such pad 'recv_rtp_src_%d_%d_%d' in element "gst-rtp-bin"
0:00:00.135679108  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstutils.c:1208:gst_element_get_compatible_pad:<gst-rtp-bin> Could not find a compatible pad to link to rtp-decoder:sink


Could someone give me some hints? Why I have no "recv_rtp_src_%d_%d_%d"?


as you can see the "recv_rtp_src_%d_%d_%d" pad is created dinamically, you cant get it.

"To use 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. After the packets are released from the jitterbuffer, they will be forwarded to aGstRtpSsrcDemux 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."
 
Or could someone lead me to similar examples? Thanks in advance!

Regards,

Qin


static

GstElement* construct_receiver_pipeline(void){
    GstElement *pipeline, *gstrtpbin, *vdec, *rtpdec, *vsink;
    GstElement *jitterbuf, *vconv;
    GstElement *udpsrc_rtp;
    GstCaps *caps;
    GstPad  *pad;
    gboolean err;
    GstPadLinkReturn res;

    //Create gstrtpbin
    gstrtpbin = gst_element_factory_make("gstrtpbin", "gst-rtp-bin");
    if ( !gstrtpbin ) {
        g_printerr("Failed to create gstrtpbin\n");
        return 0;
    }
    g_object_set(G_OBJECT (jitterbuf), "latency", jitter_latency, NULL);

    //RTP ource initialization
    udpsrc_rtp = gst_element_factory_make("udpsrc", "udp-udpsrc_rtp");
    if ( !udpsrc_rtp ) {
        g_printerr("Failed to create udpsrc\n");
        return 0;
    }
    g_object_set(G_OBJECT (udpsrc_rtp), "port", rtp_port, NULL);
    //gst_caps_new_simple and gst_element_linked_filter don't work
    g_object_set(G_OBJECT (udpsrc_rtp), "caps",
            gst_caps_from_string("application/x-rtp, "
                    "clock-rate=(int)90000, "
                    "payload=(int)96, "
                    "media=(string)video, "
                    "encoding-name=(string)H264"), NULL);

    //Create video decoder
    vdec = gst_element_factory_make(vdecoder, "video-decoder");
    if ( !vdec ) {
        g_printerr("Failed to create %s\n", vdecoder);
        return 0;
    }

    //Choose RTP decoder according to video codec
    rtpdecoder = g_strdup(select_rtp_decoder(vdecoder));
    g_free(vdecoder);

    //Create rtp decoder
    rtpdec = gst_element_factory_make(rtpdecoder, "rtp-decoder");
    if ( !rtpdec ) {
        g_printerr("Failed to create %s\n", rtpdecoder);
        return 0;
    }

    //Create video converter
    vconv = gst_element_factory_make("ffmpegcolorspace", "video-converter");
    if ( !vconv ) {
        g_printerr("Failed to create ffmpegcolorspace\n");
        return 0;
    }

    //Create video sink
    vsink = gst_element_factory_make("xvimagesink", "video-sink");
    if ( !vsink ) {
        g_printerr("Failed to create xvimagesink\n");
        return 0;
    }

    /* Set up the pipeline */
    gst_bin_add_many(GST_BIN (pipeline), udpsrc_rtp, gstrtpbin/*, jitterbuf*/,
            rtpdec, vdec, vconv, vsink, NULL);

    //link udpsrc_rtp to gstrtpbin
    pad = gst_element_get_request_pad(gstrtpbin, "recv_rtp_sink_%d");
    if ( !pad ) {
        g_printerr("Failed to create pad\n");
        return 0;
    }
    res = gst_pad_link(gst_element_get_pad(udpsrc_rtp, "src"), pad);
    gst_object_unref(GST_OBJECT (pad));
    if ( GST_PAD_LINK_FAILED(res)  ) {
        g_printerr("Failed to link pads\n");
        return 0;
    }

    err = gst_element_link_many(gstrtpbin, rtpdec, vdec, vconv, vsink, NULL);
    if ( err==FALSE ) {
        g_printerr("Failed to link elements\n");
        return 0;
    }

    return pipeline;
}

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: gstrtpbin and rtph264depay linking problem

Tiago Katcipis


On Mon, Mar 1, 2010 at 2:55 PM, Qin Chen <[hidden email]> wrote:
Hi Tiago,

Thank you very much for your reply.

I didn't "request" the recv_rtp_src_%d_%d_%d pad. In my codes, I used
gst_element_link_many(gstrtpbi
n, rtpdec, vdec, vconv, vsink, NULL); and hope that I can get the "dynamically" created pad. But according to the error message, no such pad was created. Any idea? Thanks

but according to the error msg it looks like in some moment you are trying to get it with a gst_element_get_static_pad:

0:00:00.135657988  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstelement.c:970:gst_element_get_static_pad: no such pad 'recv_rtp_src_%d_%d_%d' in element "gst-rtp-bin"

where is your "pad-added" handler? i think when a pad is added dynamically a "pad-added" signal is emitted by gstrtpbin.

best regards,
Katcipis
 


Regards,

Qin



On Mon, Mar 1, 2010 at 7:20 AM, Tiago Katcipis <[hidden email]> wrote:


On Mon, Mar 1, 2010 at 1:24 AM, Qin Chen <[hidden email]> wrote:
Hi experts,

I am trying to write a pipeline for receiving and decoding H.264 RTP packets. Please see the C codes below. It is basically equivalent to following pipeline.
gst-launch -v gstrtpbin name=rtpbin                                          \
udpsrc caps
="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" \
port
=5000 ! rtpbin.recv_rtp_sink_0 \
rtpbin
. ! rtph264depay ! ffdec_h264 ! xvimagesink \

But I couldn't link gstrtpbin and rtph264depay. The error message is as follows:
0:00:00.135605335  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstutils.c:1587:gst_element_link_pads: trying to link element gst-rtp-bin:(any) to element rtp-decoder:(any)
0:00:00.135657988  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstelement.c:970:gst_element_get_static_pad: no such pad 'recv_rtp_src_%d_%d_%d' in element "gst-rtp-bin"
0:00:00.135679108  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstutils.c:1208:gst_element_get_compatible_pad:<gst-rtp-bin> Could not find a compatible pad to link to rtp-decoder:sink

Could someone give me some hints? Why I have no "recv_rtp_src_%d_%d_%d"?


as you can see the "recv_rtp_src_%d_%d_%d" pad is created dinamically, you cant get it.

"To use 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. After the packets are released from the jitterbuffer, they will be forwarded to aGstRtpSsrcDemux 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."
 
Or could someone lead me to similar examples? Thanks in advance!

Regards,

Qin


static
GstElement* construct_receiver_pipeline(
void){
    GstElement *pipeline, *gstrtpbin, *vdec, *rtpdec, *vsink;
    GstElement *jitterbuf, *vconv;
    GstElement *udpsrc_rtp;
    GstCaps *caps;
    GstPad  *pad;
    gboolean err;
    GstPadLinkReturn res;

    //Create gstrtpbin
    gstrtpbin = gst_element_factory_make("
gstrtpbin", "gst-rtp-bin");
    if ( !gstrtpbin ) {
        g_printerr("Failed to create gstrtpbin\n");
        return 0;
    }
    g_object_set(G_OBJECT (jitterbuf), "latency", jitter_latency, NULL);

    //RTP ource initialization
    udpsrc_rtp = gst_element_factory_make("
udpsrc", "udp-udpsrc_rtp");
    if ( !udpsrc_rtp ) {
        g_printerr("Failed to create udpsrc\n");
        return 0;
    }
    g_object_set(G_OBJECT (udpsrc_rtp), "port", rtp_port, NULL);
    //gst_caps_new_simple and gst_element_linked_filter don't work
    g_object_set(G_OBJECT (udpsrc_rtp), "caps",
            gst_caps_from_string("
application/x-rtp, "
                    "clock-rate=(int)90000, "
                    "payload=(int)96, "
                    "media=(string)video, "
                    "encoding-name=(string)H264"), NULL);

    //Create video decoder
    vdec = gst_element_factory_make(
vdecoder, "video-decoder");
    if ( !vdec ) {
        g_printerr("Failed to create %s\n", vdecoder);
        return 0;
    }

    //Choose RTP decoder according to video codec
    rtpdecoder = g_strdup(select_rtp_decoder(
vdecoder));
    g_free(vdecoder);

    //Create rtp decoder
    rtpdec = gst_element_factory_make(
rtpdecoder, "rtp-decoder");
    if ( !rtpdec ) {
        g_printerr("Failed to create %s\n", rtpdecoder);
        return 0;
    }

    //Create video converter
    vconv = gst_element_factory_make("
ffmpegcolorspace", "video-converter");
    if ( !vconv ) {
        g_printerr("Failed to create ffmpegcolorspace\n");
        return 0;
    }

    //Create video sink
    vsink = gst_element_factory_make("
xvimagesink", "video-sink");
    if ( !vsink ) {
        g_printerr("Failed to create xvimagesink\n");
        return 0;
    }

    /* Set up the pipeline */
    gst_bin_add_many(GST_BIN (pipeline), udpsrc_rtp, gstrtpbin/*, jitterbuf*/,
            rtpdec, vdec, vconv, vsink, NULL);

    //link udpsrc_rtp to gstrtpbin
    pad = gst_element_get_request_pad(
gstrtpbin, "recv_rtp_sink_%d");
    if ( !pad ) {
        g_printerr("Failed to create pad\n");
        return 0;
    }
    res = gst_pad_link(gst_element_get_
pad(udpsrc_rtp, "src"), pad);
    gst_object_unref(GST_OBJECT (pad));
    if ( GST_PAD_LINK_FAILED(res)  ) {
        g_printerr("Failed to link pads\n");
        return 0;
    }

    err = gst_element_link_many(
gstrtpbin, rtpdec, vdec, vconv, vsink, NULL);
    if ( err==FALSE ) {
        g_printerr("Failed to link elements\n");
        return 0;
    }

    return pipeline;
}

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



------------------------------
------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: gstrtpbin and rtph264depay linking problem

Qin Chen-2
Hi Tiago,

I added a callback for pad-added. Now it works. Thanks for the help.

Regards,

Qin


On Mon, Mar 1, 2010 at 5:15 PM, Tiago Katcipis <[hidden email]> wrote:


On Mon, Mar 1, 2010 at 2:55 PM, Qin Chen <[hidden email]> wrote:
Hi Tiago,

Thank you very much for your reply.

I didn't "request" the recv_rtp_src_%d_%d_%d pad. In my codes, I used
gst_element_link_many(gstrtpbi
n, rtpdec, vdec, vconv, vsink, NULL); and hope that I can get the "dynamically" created pad. But according to the error message, no such pad was created. Any idea? Thanks

but according to the error msg it looks like in some moment you are trying to get it with a gst_element_get_static_pad:

0:00:00.135657988  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstelement.c:970:gst_element_get_static_pad: no such pad 'recv_rtp_src_%d_%d_%d' in element "gst-rtp-bin"

where is your "pad-added" handler? i think when a pad is added dynamically a "pad-added" signal is emitted by gstrtpbin.

best regards,
Katcipis
 


Regards,

Qin



On Mon, Mar 1, 2010 at 7:20 AM, Tiago Katcipis <[hidden email]> wrote:


On Mon, Mar 1, 2010 at 1:24 AM, Qin Chen <[hidden email]> wrote:
Hi experts,

I am trying to write a pipeline for receiving and decoding H.264 RTP packets. Please see the C codes below. It is basically equivalent to following pipeline.
gst-launch -v gstrtpbin name=rtpbin                                          \
udpsrc caps
="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264" \
port
=5000 ! rtpbin.recv_rtp_sink_0 \
rtpbin
. ! rtph264depay ! ffdec_h264 ! xvimagesink \

But I couldn't link gstrtpbin and rtph264depay. The error message is as follows:
0:00:00.135605335  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstutils.c:1587:gst_element_link_pads: trying to link element gst-rtp-bin:(any) to element rtp-decoder:(any)
0:00:00.135657988  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstelement.c:970:gst_element_get_static_pad: no such pad 'recv_rtp_src_%d_%d_%d' in element "gst-rtp-bin"
0:00:00.135679108  5934  0x95aa008 INFO        GST_ELEMENT_PADS gstutils.c:1208:gst_element_get_compatible_pad:<gst-rtp-bin> Could not find a compatible pad to link to rtp-decoder:sink

Could someone give me some hints? Why I have no "recv_rtp_src_%d_%d_%d"?


as you can see the "recv_rtp_src_%d_%d_%d" pad is created dinamically, you cant get it.

"To use 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. After the packets are released from the jitterbuffer, they will be forwarded to aGstRtpSsrcDemux 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."
 
Or could someone lead me to similar examples? Thanks in advance!

Regards,

Qin


static
GstElement* construct_receiver_pipeline(
void){
    GstElement *pipeline, *gstrtpbin, *vdec, *rtpdec, *vsink;
    GstElement *jitterbuf, *vconv;
    GstElement *udpsrc_rtp;
    GstCaps *caps;
    GstPad  *pad;
    gboolean err;
    GstPadLinkReturn res;

    //Create gstrtpbin
    gstrtpbin = gst_element_factory_make("
gstrtpbin", "gst-rtp-bin");
    if ( !gstrtpbin ) {
        g_printerr("Failed to create gstrtpbin\n");
        return 0;
    }
    g_object_set(G_OBJECT (jitterbuf), "latency", jitter_latency, NULL);

    //RTP ource initialization
    udpsrc_rtp = gst_element_factory_make("
udpsrc", "udp-udpsrc_rtp");
    if ( !udpsrc_rtp ) {
        g_printerr("Failed to create udpsrc\n");
        return 0;
    }
    g_object_set(G_OBJECT (udpsrc_rtp), "port", rtp_port, NULL);
    //gst_caps_new_simple and gst_element_linked_filter don't work
    g_object_set(G_OBJECT (udpsrc_rtp), "caps",
            gst_caps_from_string("
application/x-rtp, "
                    "clock-rate=(int)90000, "
                    "payload=(int)96, "
                    "media=(string)video, "
                    "encoding-name=(string)H264"), NULL);

    //Create video decoder
    vdec = gst_element_factory_make(
vdecoder, "video-decoder");
    if ( !vdec ) {
        g_printerr("Failed to create %s\n", vdecoder);
        return 0;
    }

    //Choose RTP decoder according to video codec
    rtpdecoder = g_strdup(select_rtp_decoder(
vdecoder));
    g_free(vdecoder);

    //Create rtp decoder
    rtpdec = gst_element_factory_make(
rtpdecoder, "rtp-decoder");
    if ( !rtpdec ) {
        g_printerr("Failed to create %s\n", rtpdecoder);
        return 0;
    }

    //Create video converter
    vconv = gst_element_factory_make("
ffmpegcolorspace", "video-converter");
    if ( !vconv ) {
        g_printerr("Failed to create ffmpegcolorspace\n");
        return 0;
    }

    //Create video sink
    vsink = gst_element_factory_make("
xvimagesink", "video-sink");
    if ( !vsink ) {
        g_printerr("Failed to create xvimagesink\n");
        return 0;
    }

    /* Set up the pipeline */
    gst_bin_add_many(GST_BIN (pipeline), udpsrc_rtp, gstrtpbin/*, jitterbuf*/,
            rtpdec, vdec, vconv, vsink, NULL);

    //link udpsrc_rtp to gstrtpbin
    pad = gst_element_get_request_pad(
gstrtpbin, "recv_rtp_sink_%d");
    if ( !pad ) {
        g_printerr("Failed to create pad\n");
        return 0;
    }
    res = gst_pad_link(gst_element_get_
pad(udpsrc_rtp, "src"), pad);
    gst_object_unref(GST_OBJECT (pad));
    if ( GST_PAD_LINK_FAILED(res)  ) {
        g_printerr("Failed to link pads\n");
        return 0;
    }

    err = gst_element_link_many(
gstrtpbin, rtpdec, vdec, vconv, vsink, NULL);
    if ( err==FALSE ) {
        g_printerr("Failed to link elements\n");
        return 0;
    }

    return pipeline;
}

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



------------------------------
------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel



------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/gstreamer-devel