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(&current_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