From 86db590ed788f8b855fa99c28972a0d69521b513 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Sun, 23 Aug 2020 13:10:36 +0300 Subject: [PATCH] Limit FPS during encode --- applications/gui2/src/modules/camera.cpp | 2 +- components/rgbd-sources/src/frame.cpp | 3 ++- components/streams/include/ftl/streams/sender.hpp | 2 ++ components/streams/src/sender.cpp | 10 ++++++++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/applications/gui2/src/modules/camera.cpp b/applications/gui2/src/modules/camera.cpp index 4219d7004..3d787aaae 100644 --- a/applications/gui2/src/modules/camera.cpp +++ b/applications/gui2/src/modules/camera.cpp @@ -399,7 +399,7 @@ ftl::cuda::TextureObject<uchar4>& Camera::getFrame(ftl::codecs::Channel channel) if (std::atomic_load(¤t_fs_)) { auto& frame = current_fs_->frames[frame_idx].cast<ftl::rgbd::Frame>(); - current_frame_colour_ = frame.getTexture<uchar4>(Channel::Left); + if (frame.hasChannel(Channel::Left)) current_frame_colour_ = frame.getTexture<uchar4>(Channel::Left); if (frame.hasChannel(channel)) { current_frame_ = colouriser_->colourise(frame, channel, 0); diff --git a/components/rgbd-sources/src/frame.cpp b/components/rgbd-sources/src/frame.cpp index f6379f977..496c48807 100644 --- a/components/rgbd-sources/src/frame.cpp +++ b/components/rgbd-sources/src/frame.cpp @@ -125,7 +125,8 @@ cv::Size ftl::rgbd::Frame::getSize(ftl::codecs::Channel c) const { return f.getCPU().size(); } } else { - throw FTL_Error("Channel does not exists: " << int(c)); + //throw FTL_Error("Channel does not exists: " << int(c)); + return cv::Size(0,0); } } diff --git a/components/streams/include/ftl/streams/sender.hpp b/components/streams/include/ftl/streams/sender.hpp index 9e679167a..e85308608 100644 --- a/components/streams/include/ftl/streams/sender.hpp +++ b/components/streams/include/ftl/streams/sender.hpp @@ -74,6 +74,8 @@ class Sender : public ftl::Configurable { int add_iframes_; unsigned int iframe_; ftl::Handle handle_; + int64_t last_ts_=0; + int min_frame_interval_=0; struct EncodingState { uint8_t bitrate; diff --git a/components/streams/src/sender.cpp b/components/streams/src/sender.cpp index b4d9d4093..99713e908 100644 --- a/components/streams/src/sender.cpp +++ b/components/streams/src/sender.cpp @@ -29,6 +29,11 @@ Sender::Sender(nlohmann::json &config) : ftl::Configurable(config), stream_(null iframe_ = 1; add_iframes_ = value("iframes", 50); timestamp_ = -1; + min_frame_interval_ = 1000 / value("max_fps", 30); + + on("max_fps", [this]() { + min_frame_interval_ = 1000 / value("max_fps", 30); + }); on("iframes", [this]() { add_iframes_ = value("iframes", 50); @@ -294,6 +299,11 @@ void Sender::post(ftl::data::FrameSet &fs, ftl::codecs::Channel c, bool noencode } } + if (fs.timestamp() > last_ts_ && fs.timestamp() < last_ts_ + min_frame_interval_) { + return; + } + last_ts_ = fs.timestamp(); + // Don't transmit if noencode and needs encoding if (needs_encoding && noencode) { needs_encoding = false; -- GitLab