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