C++ RTP pipeline

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

C++ RTP pipeline

horai
Dear all,

I am very new to Gstreamer and I tried to reproduce my already working pipeline from command line to C++. The pipeline compiles and runs fine, but there is no output on my SPI TFT screen attached to Orange Pi, could anyone help me finding a bug in my code or pointing me how to resolve it?

Best regards,

Sender pipeline:
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=320,height=240,framerate=25/2 ! videoconvert !  x264enc ! rtph264pay ! udpsink host=192.168.1.3 port=1234

Receiver pipeline:
gst-launch-1.0 -v udpsrc port=1234 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! fbdevsink device=/dev/fb8 sync=false

C++ receiver code modified thanks to excellent post http://gstreamer-devel.966125.n4.nabble.com/C-code-for-rtp-h264-decoding-I-can-t-find-how-to-solve-the-error-Read-is-insteresting-td3242017.html

C++ receiver code:

#include <math.h>

#include <gst/gst.h>

/* the caps of the sender RTP stream. This is usually negotiated out of band with
 * SDP or RTSP. */
#define VIDEO_CAPS "application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264"


#define VIDEO_DEPAY "rtph264depay"
#define VIDEO_DEC   "avdec_h264"
#define VIDEO_SINK  "fbdevsink"
#define VIDEO_PARSE "h264parse"


int main (int argc, char *argv[])
{
  GstElement *rtpbin, *rtpsrc, *rtcpsrc, *rtcpsink;
  GstElement *videodepay,
             *videodec,
             //*videores,
             *videoconv,
             *videosink,
  *videoparse;
 

  GstElement *pipeline;
  GMainLoop *loop;
  GstCaps *caps;
  gboolean res;
  GstPadLinkReturn lres;
  GstPad *srcpad, *sinkpad;

  /* always init first */
  gst_init (&argc, &argv);

  /* the pipeline to hold everything */
  pipeline = gst_pipeline_new (NULL);
  g_assert (pipeline);

  /* the udp src and source we will use for RTP and RTCP */
  rtpsrc = gst_element_factory_make ("udpsrc", "rtpsrc");
  g_assert (rtpsrc);
  g_object_set (rtpsrc, "port", 1234, NULL);
  /* we need to set caps on the udpsrc for the RTP data */
  caps = gst_caps_from_string (VIDEO_CAPS);
  g_object_set (rtpsrc, "caps", caps, NULL);
  gst_caps_unref (caps);

 

  /* the depayloading and decoding */
  videodepay = gst_element_factory_make (VIDEO_DEPAY, "videodepay");
  g_assert (videodepay);
  videoparse= gst_element_factory_make (VIDEO_PARSE, "videoparse");
  g_assert (videoparse);
  videodec = gst_element_factory_make (VIDEO_DEC, "videodec");
  g_assert (videodec);
  /* the audio playback and format conversion */
  videoconv = gst_element_factory_make ("videoconvert", "videoconv");
  g_assert (videoconv);

  videosink = gst_element_factory_make (VIDEO_SINK, "videosink");
  g_assert (videosink);
g_object_set (videosink,"device", "/dev/fb8", NULL);
g_object_set (videosink, "sync", FALSE, NULL);


  /* add depayloading and playback to the pipeline and link */
  gst_bin_add_many (GST_BIN (pipeline), videodepay,videoparse, videodec, videoconv, /*videores,*/ videosink, NULL);

  res = gst_element_link_many (videodepay, videoparse,videodec, videoconv, /*videores,*/ videosink, NULL);
  g_assert (res == TRUE);


  /* set the pipeline to playing */
  g_print ("starting receiver pipeline\n");
  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  /* we need to run a GLib main loop to get the messages */
  loop = g_main_loop_new (NULL, FALSE);
  g_main_loop_run (loop);

  g_print ("stopping receiver pipeline\n");
  gst_element_set_state (pipeline, GST_STATE_NULL);

  gst_object_unref (pipeline);

  return 0;

}

Thank you

Reply | Threaded
Open this post in threaded view
|

Re: C++ RTP pipeline

horai
I am sorry, I should have slept a bit more not to be mentally blind. The code is not chained properly.

Best regards,
Ivo