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