From 402a6e28e772b4effda1fc9ea8e62791fbf1c890 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Tue, 21 Jul 2020 11:02:59 +0300 Subject: [PATCH] Only stream on change and fix mult pack send --- components/streams/src/feed.cpp | 2 +- components/streams/src/sender.cpp | 13 +++++++------ .../structures/include/ftl/data/new_frameset.hpp | 5 +++++ components/structures/src/frameset.cpp | 7 +++++++ 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp index 0042bed83..77e183c86 100644 --- a/components/streams/src/feed.cpp +++ b/components/streams/src/feed.cpp @@ -826,7 +826,7 @@ void Feed::_beginRecord(Filter *f) { record_stream_->select(fs->frameset(), f->channels(), true); for (auto c : f->channels()) { - recorder_->post(*fs.get(), c); + if (fs->hasAnyChanged(c)) recorder_->post(*fs.get(), c); } return true; }); diff --git a/components/streams/src/sender.cpp b/components/streams/src/sender.cpp index 0eb8b64aa..4eb69ec59 100644 --- a/components/streams/src/sender.cpp +++ b/components/streams/src/sender.cpp @@ -173,11 +173,12 @@ void Sender::post(ftl::data::FrameSet &fs, ftl::codecs::Channel c, bool noencode const auto &packets = frame.getEncoded(cc); if (packets.size() > 0) { if (packets.size() == 1) { - forward_count += packets.front().frame_count; + } else { // PROBLEMS - LOG(WARNING) << "Multi packet send!"; + LOG(WARNING) << "Multi packet send! - Channel = " << int(c) << ", count = " << packets.size(); } + forward_count += packets.back().frame_count; } } else { needs_encoding = false; @@ -200,7 +201,7 @@ void Sender::post(ftl::data::FrameSet &fs, ftl::codecs::Channel c, bool noencode if (!frame.has(c)) continue; const auto &packets = frame.getEncoded(c); - if (packets.size() == 1) { + //if (packets.size() == 1) { StreamPacket spkt; spkt.version = 5; spkt.timestamp = fs.timestamp(); @@ -209,10 +210,10 @@ void Sender::post(ftl::data::FrameSet &fs, ftl::codecs::Channel c, bool noencode spkt.channel = c; spkt.flags = (last_flush) ? ftl::codecs::kFlagCompleted : 0; - stream_->post(spkt, packets.front()); - } else if (packets.size() > 1) { + stream_->post(spkt, packets.back()); + //} else if (packets.size() > 1) { // PROBLEMS - } + //} } } diff --git a/components/structures/include/ftl/data/new_frameset.hpp b/components/structures/include/ftl/data/new_frameset.hpp index 229bf974e..93b6d4ee4 100644 --- a/components/structures/include/ftl/data/new_frameset.hpp +++ b/components/structures/include/ftl/data/new_frameset.hpp @@ -125,6 +125,11 @@ class FrameSet : public ftl::data::Frame { */ static std::shared_ptr<FrameSet> fromFrame(Frame &); + /** + * Check if channel has changed in any frames. + */ + bool hasAnyChanged(ftl::codecs::Channel) const; + private: std::atomic<int> flags_; }; diff --git a/components/structures/src/frameset.cpp b/components/structures/src/frameset.cpp index fe45a6ed3..330ccf659 100644 --- a/components/structures/src/frameset.cpp +++ b/components/structures/src/frameset.cpp @@ -83,6 +83,13 @@ const ftl::data::Frame &ftl::data::FrameSet::firstFrame() const { throw FTL_Error("No frames in frameset"); } +bool ftl::data::FrameSet::hasAnyChanged(ftl::codecs::Channel c) const { + for (size_t i=0; i<frames.size(); ++i) { + if (frames[i].changed(c)) return true; + } + return false; +} + void FrameSet::store() { if (status() != ftl::data::FrameStatus::CREATED) throw FTL_Error("Cannot store frameset multiple times"); -- GitLab