summaryrefslogtreecommitdiff
path: root/src/libcamera/delayed_controls.cpp
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2021-03-04 08:17:25 +0000
committerKieran Bingham <kieran.bingham@ideasonboard.com>2021-03-12 14:12:55 +0000
commit47e27ee93bcfb70288e2ee1cd81153d416307b47 (patch)
tree83aafc8366bb50123eb4a4448397dc85d782108b /src/libcamera/delayed_controls.cpp
parentf1569db3fb784095bc712c8ebff3a246a13ee5af (diff)
libcamera: delayed_controls: Remove spurious no-op queued controls
In DelayedControls::applyControls(), the controls queue would be extended via a no-op control push to fill the intermittent slots with unchanged control values. This is needed so that we read back unchanged control values correctly on every frame. However, there was one additional no-op performed on every frame that is not required, meaning that any controls queued by the pipeline handler would have their write delayed by one further frame. The original StaggeredCtrl did not do this, as it only had one index to manage, whereas DelayedControls uses two. Remove this last no-op push so that the pipeline_handler provided controls would be written on the very next frame if possible. As a consequence, we must mark the control update as completed within the DelayedControls::applyControls() loop, otherwise it might get reused when cycling through the ring buffer. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reported-by: David Plowman <david.plowman@raspberrypi.com> Fixes: 3d4b7b005911 ("libcamera: delayed_controls: Add helper for controls that apply with a delay") Tested-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Tested-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/libcamera/delayed_controls.cpp')
-rw-r--r--src/libcamera/delayed_controls.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/libcamera/delayed_controls.cpp b/src/libcamera/delayed_controls.cpp
index a2af4a29..2f953a06 100644
--- a/src/libcamera/delayed_controls.cpp
+++ b/src/libcamera/delayed_controls.cpp
@@ -226,11 +226,11 @@ void DelayedControls::applyControls(uint32_t sequence)
* values are set in time to satisfy the sensor delay.
*/
ControlList out(device_->controls());
- for (const auto &ctrl : values_) {
+ 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);
- const Info &info = ctrl.second[index];
+ Info &info = ctrl.second[index];
if (info.updated) {
if (controlParams_[id].priorityWrite) {
@@ -253,12 +253,15 @@ void DelayedControls::applyControls(uint32_t sequence)
<< "Setting " << id->name()
<< " to " << info.toString()
<< " at index " << index;
+
+ /* Done with this update, so mark as completed. */
+ info.updated = false;
}
}
writeCount_++;
- while (writeCount_ >= queueCount_) {
+ while (writeCount_ > queueCount_) {
LOG(DelayedControls, Debug)
<< "Queue is empty, auto queue no-op.";
push({});