From 0f9261f765949266107e914eb1d96f23f252f1d9 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Sat, 15 Aug 2020 15:28:33 +0300
Subject: [PATCH] Periodic IFrame and reset on connect

---
 components/codecs/include/ftl/codecs/nvidia_encoder.hpp | 1 +
 components/codecs/src/nvidia_encoder.cpp                | 7 +++++++
 components/streams/src/netstream.cpp                    | 2 +-
 components/streams/src/sender.cpp                       | 5 ++++-
 4 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/components/codecs/include/ftl/codecs/nvidia_encoder.hpp b/components/codecs/include/ftl/codecs/nvidia_encoder.hpp
index db3f3d4df..5bff3adfd 100644
--- a/components/codecs/include/ftl/codecs/nvidia_encoder.hpp
+++ b/components/codecs/include/ftl/codecs/nvidia_encoder.hpp
@@ -43,6 +43,7 @@ class NvidiaEncoder : public ftl::codecs::Encoder {
 	Parameters params_;
 
 	bool was_reset_;
+	int64_t frame_count_ = 0;
 
 	bool _createEncoder(const cv::cuda::GpuMat &in, const ftl::codecs::Packet &pkt);
 	ftl::codecs::definition_t _verifiedDefinition(ftl::codecs::definition_t def, const cv::cuda::GpuMat &in);
diff --git a/components/codecs/src/nvidia_encoder.cpp b/components/codecs/src/nvidia_encoder.cpp
index 10e3d2e0b..65b9ec320 100644
--- a/components/codecs/src/nvidia_encoder.cpp
+++ b/components/codecs/src/nvidia_encoder.cpp
@@ -198,6 +198,11 @@ bool NvidiaEncoder::encode(const cv::cuda::GpuMat &in, ftl::codecs::Packet &pkt)
 	// Make sure conversions complete...
 	stream_.waitForCompletion();
 
+	// Insert periodic i-frames here.
+	if (((++frame_count_) % 128) == 0) {
+		was_reset_ = true;
+	}
+
 	uint64_t cs = _encode(pkt.data.data(), pkt.data.size(), was_reset_);
 	pkt.data.resize(cs);
 	was_reset_ = false;
@@ -218,6 +223,8 @@ bool NvidiaEncoder::_createEncoder(const cv::cuda::GpuMat &in, const ftl::codecs
 	LOG(INFO) << "Calculated bitrate " << (float(bitrate) / 1024.0f / 1024.0f) << "Mbps (" << int(pkt.bitrate) << ")";
 	
 	params_ = params;
+	frame_count_ = 0;
+	was_reset_ = true;
 
 	const int fps = 1000/ftl::timer::getInterval();
 	
diff --git a/components/streams/src/netstream.cpp b/components/streams/src/netstream.cpp
index 19ca6f083..628640772 100644
--- a/components/streams/src/netstream.cpp
+++ b/components/streams/src/netstream.cpp
@@ -324,7 +324,7 @@ bool Net::begin() {
 	active_ = true;
 	
 	// Initially send a colour request just to create the connection
-	_sendRequest(Channel::Colour, kAllFramesets, kAllFrames, 30, 255);
+	_sendRequest(Channel::Colour, kAllFramesets, kAllFrames, 30, 255, true);
 
 	return true;
 }
diff --git a/components/streams/src/sender.cpp b/components/streams/src/sender.cpp
index ebd778a32..a47e9854a 100644
--- a/components/streams/src/sender.cpp
+++ b/components/streams/src/sender.cpp
@@ -134,7 +134,10 @@ void Sender::fakePost(ftl::data::FrameSet &fs, ftl::codecs::Channel c) {
 bool Sender::_checkNeedsIFrame(int64_t ts, bool injecting) {
 	int mspf = ftl::timer::getInterval();
 
-	if (injecting) injection_timestamp_ = ts+2*mspf;
+	if (injecting) {
+		LOG(INFO) << "Inject persistent state: " << ts;
+		injection_timestamp_ = ts+2*mspf;
+	}
 
 	// Add an iframe at the requested frequency.
 	//if (add_iframes_ > 0 && ts != timestamp_) iframe_ = (iframe_+1) % add_iframes_;
-- 
GitLab