From e76cc98bfef02056e8d35a1b84355aa3e723dfe0 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Tue, 10 Mar 2020 18:28:59 +0200
Subject: [PATCH] Allow frame mask selection in receive

---
 components/streams/include/ftl/streams/receiver.hpp | 1 +
 components/streams/src/receiver.cpp                 | 8 +++++++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/components/streams/include/ftl/streams/receiver.hpp b/components/streams/include/ftl/streams/receiver.hpp
index 840af0388..5ca29947a 100644
--- a/components/streams/include/ftl/streams/receiver.hpp
+++ b/components/streams/include/ftl/streams/receiver.hpp
@@ -53,6 +53,7 @@ class Receiver : public ftl::Configurable, public ftl::rgbd::Generator {
 	ftl::codecs::Channel second_channel_;
 	int64_t timestamp_;
 	SHARED_MUTEX mutex_;
+	unsigned int frame_mask_;
 
 	struct InternalVideoStates {
 		InternalVideoStates();
diff --git a/components/streams/src/receiver.cpp b/components/streams/src/receiver.cpp
index ac61f1717..dfd8f0003 100644
--- a/components/streams/src/receiver.cpp
+++ b/components/streams/src/receiver.cpp
@@ -26,6 +26,7 @@ using ftl::codecs::definition_t;
 Receiver::Receiver(nlohmann::json &config) : ftl::Configurable(config), stream_(nullptr) {
 	timestamp_ = 0;
 	second_channel_ = Channel::Depth;
+	frame_mask_ = value("frame_mask", 0xFFFFFFFFu);
 
 	size_t bsize = value("frameset_buffer_size", 3);
 	for (size_t i=0; i<ftl::stream::kMaxStreams; ++i) {
@@ -39,6 +40,10 @@ Receiver::Receiver(nlohmann::json &config) : ftl::Configurable(config), stream_(
 			builder_[i].setBufferSize(bsize);
 		}
 	});
+
+	on("frame_mask", [this](const ftl::config::Event &e) {
+		frame_mask_ = value("frame_mask", 0xFFFFFFFFu);
+	});
 }
 
 Receiver::~Receiver() {
@@ -374,7 +379,8 @@ void Receiver::setStream(ftl::stream::Stream *s) {
 		}
 
 		// Too many frames, so ignore.
-		if (spkt.frameNumber() >= value("max_frames",32)) return;
+		//if (spkt.frameNumber() >= value("max_frames",32)) return;
+		if (spkt.frameNumber() >= 32 || ((1 << spkt.frameNumber()) & frame_mask_) == 0) return;
 
 		// Dummy no data packet.
 		if (pkt.data.size() == 0) return;
-- 
GitLab