diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp index 0042bed839e5fb702d8c7a60c0f0d9e2835475f7..77e183c867c9875d4bc7460b10b1b76116ea3f06 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 0eb8b64aaf09a257812d18f5e4a0fe4c37521b14..4eb69ec59b72d53e2a650ae065b7a48b548796ad 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 229bf974e41ba1f7cd53a9c6ca3426eb095a6c3f..93b6d4ee4003ab59068c0ddc1770561e4cf0fc35 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 fe45a6ed34a9bbc3cf6bc10a4eed2924a1853742..330ccf6592025a6c36b3f36da4d1b3e31b6fffb8 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");