[v3,04/41] libcamera: delayed_controls: Queue noop when needed, not before
diff mbox series

Message ID 20260914140309.3354666-5-stefan.klug@ideasonboard.com
State New
Headers show
Series
  • rkisp1: pipeline rework for PFC
Related show

Commit Message

Stefan Klug Sept. 14, 2026, 2:02 p.m. UTC
A no-op is queued when DelayedControls runs out of controls at the end
of applyControls(). But these controls are only needed on the next call
to applyControls(), so there is still time for a proper push. To fix
that, move the no-op push to the beginning of applyContols().

Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>

---

Changes in v3:
- Refrained dropping the writeCount_ member. It will be reused later

Changes in v2:
- Improved a log message
- Improved commit message
- dropped writeCount_ member
---
 src/libcamera/delayed_controls.cpp | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

Patch
diff mbox series

diff --git a/src/libcamera/delayed_controls.cpp b/src/libcamera/delayed_controls.cpp
index 87d4c48425c6..7e3a72e2cb1d 100644
--- a/src/libcamera/delayed_controls.cpp
+++ b/src/libcamera/delayed_controls.cpp
@@ -270,6 +270,13 @@  void DelayedControls::applyControls(uint32_t sequence)
 {
 	LOG(DelayedControls, Debug) << "frame " << sequence << " started";
 
+	while (queueCount_ - 1 < sequence) {
+		LOG(DelayedControls, Warning)
+			<< "Queue is empty, auto queue no-op for sequence "
+			<< queueCount_;
+		push(queueCount_, {});
+	}
+
 	/*
 	 * Create control list peeking ahead in the value queue to ensure
 	 * values are set in time to satisfy the sensor delay.
@@ -278,7 +285,7 @@  void DelayedControls::applyControls(uint32_t sequence)
 	for (auto &ctrl : values_) {
 		const ControlId *id = ctrl.first;
 		unsigned int delayDiff = maxDelay_ - controlParams_[id].delay;
-		unsigned int index = std::max<int>(0, writeCount_ - delayDiff);
+		unsigned int index = std::max<int>(0, sequence - delayDiff);
 		Info &info = ctrl.second[index];
 
 		if (info.updated) {
@@ -308,15 +315,8 @@  void DelayedControls::applyControls(uint32_t sequence)
 		}
 	}
 
-	writeCount_ = sequence + 1;
-
-	while (writeCount_ > queueCount_) {
-		LOG(DelayedControls, Warning)
-			<< "Queue is empty, auto queue no-op.";
-		push(queueCount_, {});
-	}
-
 	device_->setControls(&out);
+	writeCount_ = sequence;
 }
 
 } /* namespace libcamera */