[libcamera-devel] [PATCH v4 4/7] libcamera: delayed_controls: Remove spurious no-op queued controls
Jean-Michel Hautbois
jeanmichel.hautbois at ideasonboard.com
Tue Mar 9 10:56:19 CET 2021
On 04/03/2021 09:17, Naushir Patuck wrote:
> 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 at raspberrypi.com>
> Reported-by: David Plowman <david.plowman at raspberrypi.com>
> Fixes: 3d4b7b005911 ("libcamera: delayed_controls: Add helper for controls that apply with a delay")
> Tested-by: David Plowman <david.plowman at raspberrypi.com>
> Reviewed-by: Paul Elder <paul.elder at ideasonboard.com>
Tested-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> ---
> src/libcamera/delayed_controls.cpp | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/src/libcamera/delayed_controls.cpp b/src/libcamera/delayed_controls.cpp
> index f6d761d1cc41..5a05741c0285 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({});
>
More information about the libcamera-devel
mailing list