diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 7a4957d7e535..d83f7d787892 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -51,10 +51,12 @@
 #include "libcamera/internal/yaml_parser.h"
 
 #include "rkisp1_path.h"
+#include "sequence_sync_helper.h"
 
 namespace libcamera {
 
 LOG_DEFINE_CATEGORY(RkISP1)
+LOG_DEFINE_CATEGORY(RkISP1Schedule)
 
 class PipelineHandlerRkISP1;
 class RkISP1CameraData;
diff --git a/src/libcamera/pipeline/rkisp1/sequence_sync_helper.h b/src/libcamera/pipeline/rkisp1/sequence_sync_helper.h
new file mode 100644
index 000000000000..c3f91dbed45f
--- /dev/null
+++ b/src/libcamera/pipeline/rkisp1/sequence_sync_helper.h
@@ -0,0 +1,69 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2025, Ideas on Board
+ *
+ * Sequence sync helper
+ */
+
+#pragma once
+
+#include <queue>
+
+#include <libcamera/base/log.h>
+
+namespace libcamera {
+
+LOG_DECLARE_CATEGORY(RkISP1Schedule)
+
+class SequenceSyncHelper
+{
+public:
+	int gotFrame(size_t expectedSequence, size_t actualSequence)
+	{
+		ASSERT(!corrections_.empty());
+		int diff = actualSequence - expectedSequence;
+		int corr = corrections_.front();
+		corrections_.pop();
+		expectedOffset_ -= corr;
+		int necessaryCorrection = diff - expectedOffset_;
+		correctionToApply_ += necessaryCorrection;
+
+		LOG(RkISP1Schedule, Debug) << "Sync frame "
+					   << "expected: " << expectedSequence
+					   << " actual: " << actualSequence
+					   << " correction: " << corr
+					   << " expectedOffset: " << expectedOffset_
+					   << " correctionToApply " << correctionToApply_;
+
+		expectedOffset_ += necessaryCorrection;
+		return necessaryCorrection;
+	}
+
+	/* Value to be added to the source sequence */
+	int correction()
+	{
+		return correctionToApply_;
+	}
+
+	void pushCorrection(int correction)
+	{
+		corrections_.push(correction);
+		correctionToApply_ -= correction;
+		LOG(RkISP1Schedule, Debug)
+			<< "Push correction " << correction
+			<< " correctionToApply " << correctionToApply_;
+	}
+
+	void reset()
+	{
+		corrections_ = {};
+		correctionToApply_ = 0;
+		expectedOffset_ = 0;
+	}
+
+	std::queue<int> corrections_;
+	int correctionToApply_ = 0;
+	int expectedOffset_ = 0;
+};
+
+} /* namespace libcamera */
