'c++ GStreamer RTP Receive Stream

Hi I'm trying run the rtp receiving string in c++. When I use gst-launch-1.0 -v udpsrc port=5000 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! decodebin ! videoconvert ! autovideosink sync=false line i can get stream using cmd. Code in the c++ also works when i use parse launch pipeline = gst_parse_launch("gst-launch-1.0 -v udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! decodebin ! videoconvert ! autovideosink sync=false",NULL);

Here is the question when I'm trying to write line by line the code in c++ I think I'm getting linking error because of sometimes pad. Here what I tried.

To easily debug the code tried to link elements one by one like this int res = gst_element_link(udp, depay); However, it seems like i can't link udpsrc to rtph264depay or decodebin to videoconvert.

Can you help me where I am doing mistake?

#include <gst/gst.h>
#include <iostream>

static void pad_added(GstElement* element, GstPad* pad, gpointer data)
{
    gchar* name;
    name = gst_pad_get_name(pad);
    std::cout<<"A new pad is created:\n"<< name;
    g_free(name);

}

int main()
{

    GstElement* pipeline, * conv, * dec, * depay, * udp,*videosink;
    GstCaps* udpcaps;
    GMainLoop* loop;
    // init GStreamer
    gst_init(NULL, NULL);
    loop = g_main_loop_new(NULL, FALSE);

    //pipeline = gst_parse_launch("gst-launch-1.0 -v udpsrc port=5000 caps=\"application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96\" ! rtph264depay ! decodebin ! videoconvert ! autovideosink sync=false",NULL);
    
    // setup pipeline
    pipeline = gst_pipeline_new("pipeline");

    conv = gst_element_factory_make("videoconvert", "conv");

    videosink = gst_element_factory_make("autovideosink", "videosink");
   
    //enc = gst_element_factory_make("x264enc", "enc");

    depay = gst_element_factory_make("rtph264depay", "depay");
    dec = gst_element_factory_make("decodebin", "decode");
    //g_object_set(G_OBJECT(depay), "config-interval", 1, NULL);

    udp = gst_element_factory_make("udpsrc", "udp");
    //g_object_set(G_OBJECT(udp), "address", "127.0.0.1", NULL);
    g_object_set(G_OBJECT(udp), "port", 5000, NULL);
    udpcaps = gst_caps_new_simple("application/x-rtp",
        "media", G_TYPE_STRING, "video",
        "clock-rate", G_TYPE_INT, 9000,
        "encoding-name", G_TYPE_STRING, "H264",
        "payload", G_TYPE_INT, 96,
        NULL);

    g_object_set(G_OBJECT(udp), "caps", udpcaps , NULL);
    gst_caps_unref(udpcaps);
    
    gst_bin_add_many(GST_BIN(pipeline), udp, depay, dec, conv, videosink, NULL);

  //  g_signal_connect(udp, "pad-added", G_CALLBACK(pad_added), depay);
  
  //  int res2= gst_element_link(dec, conv);
    int res = gst_element_link(conv, videosink);
    //int res = gst_element_link_many(udp,depay, dec, conv, videosink, NULL);
    if (res!=TRUE)
    {
       std::cout << "Error!\n"<<res<<"\n";
       // return -1;
    }

    // play
    gst_element_set_state(pipeline, GST_STATE_PLAYING);

    g_main_loop_run(loop);

    // clean up
    gst_element_set_state(pipeline, GST_STATE_NULL);
    gst_object_unref(GST_OBJECT(pipeline));
    g_main_loop_unref(loop);

    return 0;

    
}
  


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source