@@ -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 */
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(-)