diff --git a/components/rgbd-sources/src/frameset.cpp b/components/rgbd-sources/src/frameset.cpp
index e2b1afa4d45f6d4e5dde6bac5765648c7affc591..4c9a95eb5302208c2a685a1211a6f7d9b6383730 100644
--- a/components/rgbd-sources/src/frameset.cpp
+++ b/components/rgbd-sources/src/frameset.cpp
@@ -142,9 +142,9 @@ void Builder::onFrameSet(const std::function<bool(ftl::rgbd::FrameSet &)> &cb) {
 
 			if (fs) {
 				UNIQUE_LOCK(fs->mtx, lk2);
-				lk.unlock();
 				// The buffers are invalid after callback so mark stale
 				fs->stale = true;
+				lk.unlock();
 
 				//LOG(INFO) << "PROCESS FRAMESET";
 
@@ -187,6 +187,7 @@ ftl::rgbd::FrameState &Builder::state(int ix) {
 static void mergeFrameset(ftl::rgbd::FrameSet &f1, ftl::rgbd::FrameSet &f2) {
 	// Prepend all frame encodings in f2 into corresponding frame in f1.
 	for (int i=0; i<f1.frames.size(); ++i) {
+		if (f2.frames.size() <= i) break;
 		f1.frames[i].mergeEncoding(f2.frames[i]);
 	}
 }
@@ -224,6 +225,7 @@ ftl::rgbd::FrameSet *Builder::_findFrameset(int64_t ts) {
  * Note: Must occur inside a mutex lock.
  */
 ftl::rgbd::FrameSet *Builder::_getFrameset() {
+	LOG(INFO) << "BUF SIZE = " << framesets_.size();
 	for (auto i=framesets_.begin(); i!=framesets_.end(); i++) {
 		auto *f = *i;
 		//LOG(INFO) << "GET: " << f->count << " of " << size_;