diff --git a/components/streams/include/ftl/streams/receiver.hpp b/components/streams/include/ftl/streams/receiver.hpp
index 840af0388db917dbbf3c653edfbe138757d4a36d..5ca29947ae54d8a89cf16e04f1b05c8bf07d3158 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 ac61f171786ded4a1e2f2c54a4c2c3dacd881e2a..dfd8f0003bda646ae4588003c6339d219623192c 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;