diff --git a/applications/gui/src/src_window.cpp b/applications/gui/src/src_window.cpp
index 23e774f6430d242d933fed5fdbf73fa945965e3f..405c4ee448560a162252fee9da5bf4e6911e81aa 100644
--- a/applications/gui/src/src_window.cpp
+++ b/applications/gui/src/src_window.cpp
@@ -202,7 +202,10 @@ bool SourceWindow::_processFrameset(ftl::rgbd::FrameSet &fs, bool fromstream) {
 	}
 
 	// Make sure there are enough framesets allocated
-	_checkFrameSets(fs.id);
+	{
+		UNIQUE_LOCK(mutex_, lk);
+		_checkFrameSets(fs.id);
+	}
 
 	if (!paused_) {
 		if (!fs.test(ftl::data::FSFlag::PARTIAL) || !screen_->root()->value("drop_partial_framesets", false)) { 
@@ -229,7 +232,10 @@ bool SourceWindow::_processFrameset(ftl::rgbd::FrameSet &fs, bool fromstream) {
 	}
 
 	const auto *cstream = interceptor_;
-	_createDefaultCameras(*framesets_[fs.id], true);  // cstream->available(fs.id).has(Channel::Depth)
+	{
+		UNIQUE_LOCK(mutex_, lk);
+		_createDefaultCameras(*framesets_[fs.id], true);  // cstream->available(fs.id).has(Channel::Depth)
+	}
 
 	//LOG(INFO) << "Channels = " << (unsigned int)cstream->available(fs.id);