From 2627174fc013fa5065d67d0179f3a63b1c991249 Mon Sep 17 00:00:00 2001 From: brunoherbelin Date: Sun, 25 Oct 2020 00:23:44 +0200 Subject: [PATCH] To confirm: working implementation of SHM and UDP streaming connection --- NetworkSource.cpp | 12 ++++++++---- NetworkToolkit.cpp | 10 +++++++--- NetworkToolkit.h | 6 ++++-- Streamer.cpp | 10 ++++++---- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/NetworkSource.cpp b/NetworkSource.cpp index f2d6c01..b8cd6fa 100644 --- a/NetworkSource.cpp +++ b/NetworkSource.cpp @@ -104,7 +104,7 @@ void NetworkStream::open(const std::string &nameconnection) } } if (receiver_ == nullptr) { - Log::Notify("Cannot open %s.", nameconnection); + Log::Notify("Cannot open %s. Please try again.", nameconnection); failed_ = true; return; } @@ -176,15 +176,19 @@ void NetworkStream::update() #endif // build the pipeline depending on stream info std::ostringstream pipeline; - if (config_.protocol == NetworkToolkit::TCP_JPEG || config_.protocol == NetworkToolkit::TCP_H264) { + if (config_.protocol == NetworkToolkit::UDP_JPEG || config_.protocol == NetworkToolkit::UDP_H264) { - pipeline << "tcpclientsrc name=src timeout=1 port=" << config_.port; + pipeline << "udpsrc port=" << config_.port; + } + else if (config_.protocol == NetworkToolkit::TCP_JPEG || config_.protocol == NetworkToolkit::TCP_H264) { + + pipeline << "tcpclientsrc timeout=1 port=" << config_.port; } else if (config_.protocol == NetworkToolkit::SHM_RAW) { std::string path = SystemToolkit::full_filename(SystemToolkit::settings_path(), "shm"); path += std::to_string(config_.port); - pipeline << "shmsrc name=src is-live=true socket-path=" << path; + pipeline << "shmsrc is-live=true socket-path=" << path; // TODO rename SHM socket "shm_PORT" } diff --git a/NetworkToolkit.cpp b/NetworkToolkit.cpp index 59f896b..e5e2f29 100644 --- a/NetworkToolkit.cpp +++ b/NetworkToolkit.cpp @@ -22,17 +22,21 @@ const char* NetworkToolkit::protocol_name[NetworkToolkit::DEFAULT] = { const std::vector NetworkToolkit::protocol_send_pipeline { + "video/x-raw, format=I420, framerate=30/1 ! queue max-size-buffers=3 ! jpegenc ! rtpjpegpay ! udpsink name=sink", + "video/x-raw, format=I420, framerate=30/1 ! queue max-size-buffers=3 ! x264enc tune=\"zerolatency\" threads=2 ! rtph264pay ! udpsink name=sink", + "video/x-raw, format=RGB, framerate=30/1 ! queue max-size-buffers=3 ! shmsink buffer-time=100000 name=sink", "video/x-raw, format=I420 ! queue max-size-buffers=3 ! jpegenc ! rtpjpegpay ! rtpstreampay ! tcpserversink name=sink", "video/x-raw, format=I420 ! queue max-size-buffers=3 ! x264enc tune=\"zerolatency\" threads=2 ! rtph264pay ! rtpstreampay ! tcpserversink name=sink", - "video/x-raw, format=RGB, framerate=30/1 ! queue max-size-buffers=3 ! shmsink buffer-time=100000 name=sink" }; const std::vector NetworkToolkit::protocol_receive_pipeline { + " ! application/x-rtp,encoding-name=JPEG,payload=26 ! rtpjpegdepay ! jpegdec", + " ! application/x-rtp,media=video,encoding-name=H264,payload=96,clock-rate=90000 ! rtph264depay ! avdec_h264", + " ! video/x-raw, format=RGB, framerate=30/1", " ! application/x-rtp-stream,media=video,encoding-name=JPEG,payload=26 ! rtpstreamdepay ! rtpjpegdepay ! jpegdec", " ! application/x-rtp-stream,media=video,encoding-name=H264,payload=96,clock-rate=90000 ! rtpstreamdepay ! rtph264depay ! avdec_h264", - " ! video/x-raw, format=RGB, framerate=30/1" }; @@ -52,7 +56,7 @@ const std::vector NetworkToolkit::protocol_receive_pipeline { * * UDP unicast * SND - * gst-launch-1.0 videotestsrc is-live=true ! jpegenc ! rtpjpegpay ! udpsink port=5000 host=127.0.0.1 sync=false + * gst-launch-1.0 videotestsrc is-live=true ! videoconvert ! video/x-raw, format=RGB, framerate=30/1 ! queue max-size-buffers=3 ! jpegenc ! rtpjpegpay ! udpsink port=5000 host=127.0.0.1 * RCV * gst-launch-1.0 udpsrc port=5000 ! application/x-rtp,encoding-name=JPEG,payload=26 ! rtpjpegdepay ! jpegdec ! autovideosink * diff --git a/NetworkToolkit.h b/NetworkToolkit.h index 096ba45..f29e516 100644 --- a/NetworkToolkit.h +++ b/NetworkToolkit.h @@ -22,9 +22,11 @@ namespace NetworkToolkit { typedef enum { - TCP_JPEG = 0, - TCP_H264, + UDP_JPEG = 0, + UDP_H264, SHM_RAW, + TCP_JPEG, + TCP_H264, DEFAULT } Protocol; diff --git a/Streamer.cpp b/Streamer.cpp index 025a053..ecdfa7b 100644 --- a/Streamer.cpp +++ b/Streamer.cpp @@ -181,8 +181,9 @@ void Streaming::addStream(const std::string &sender, int reply_to) } // any other IP : offer UDP streaming else { - conf.protocol = NetworkToolkit::TCP_JPEG; + conf.protocol = NetworkToolkit::UDP_JPEG; } +// conf.protocol = NetworkToolkit::UDP_JPEG; // build OSC message char buffer[IP_MTU_SIZE]; @@ -272,7 +273,7 @@ void VideoStreamer::addFrame (FrameBuffer *frame_buffer, float dt) std::string description = "appsrc name=src ! videoconvert ! "; if (config_.protocol < 0 || config_.protocol >= NetworkToolkit::DEFAULT) - config_.protocol = NetworkToolkit::TCP_JPEG; + config_.protocol = NetworkToolkit::UDP_JPEG; description += NetworkToolkit::protocol_send_pipeline[config_.protocol]; // parse pipeline descriptor @@ -286,7 +287,7 @@ void VideoStreamer::addFrame (FrameBuffer *frame_buffer, float dt) } // setup streaming sink - if (config_.protocol == NetworkToolkit::TCP_JPEG || config_.protocol == NetworkToolkit::TCP_H264) { + if (config_.protocol == NetworkToolkit::UDP_JPEG || config_.protocol == NetworkToolkit::UDP_H264) { g_object_set (G_OBJECT (gst_bin_get_by_name (GST_BIN (pipeline_), "sink")), "host", config_.client_address.c_str(), "port", config_.port, NULL); @@ -345,7 +346,8 @@ void VideoStreamer::addFrame (FrameBuffer *frame_buffer, float dt) } // all good - Log::Info("VideoStreamer start (%s %d x %d)", config_.client_address.c_str(), width_, height_); + Log::Info("Streaming video to %s:%d (%d x %d)", + config_.client_address.c_str(), config_.port, width_, height_); // start streaming !! streaming_ = true;