diff --git a/components/codecs/include/ftl/codecs/nvidia_encoder.hpp b/components/codecs/include/ftl/codecs/nvidia_encoder.hpp index db3f3d4dfa3855efd72cbd0b129d27728db33c5b..5bff3adfdcc145d958c76ca941d76e426f3ee6b5 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 10e3d2e0b5938a276a36202223963d97b07c3a07..65b9ec32013b58fe9267aaf00151e6f3e0dc5082 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 19ca6f08328153f2dd430ef362fc3fa9b9884560..62864077276916106d17c53bb3bfc5ce051b03b2 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 ebd778a3298b212dc5845553ea8473d1ccfb8712..a47e9854a38784802e0b26ee344a20c790b77ac9 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_;