ipa: raspberrypi: Add autofocus algorithm interface headers

Add a new AfAlgorithm class that defines the interface for the Raspberry Pi
autofocus algorithm.

Add an AfStatus structure that returns the results of the autofocus algorithm
back to the IPA.

Add a structure for PDAF statistics provided by supported sensors for use with
an autofocus algorithm. This structure is currently based on the IMX708's PDAF
"Type 1" statistics.

Signed-off-by: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Nick Hollinghurst 2023-01-23 15:49:26 +00:00 committed by Kieran Bingham
parent 6290deea02
commit 23aefee337
3 changed files with 132 additions and 0 deletions

View file

@ -0,0 +1,76 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2022, Raspberry Pi Ltd
*
* af_algorithm.hpp - auto focus algorithm interface
*/
#pragma once
#include <optional>
#include <libcamera/base/span.h>
#include "algorithm.h"
namespace RPiController {
class AfAlgorithm : public Algorithm
{
public:
AfAlgorithm(Controller *controller)
: Algorithm(controller) {}
/*
* An autofocus algorithm should provide the following calls.
*
* Where a ControlList combines a change of AfMode with other AF
* controls, setMode() should be called first, to ensure the
* algorithm will be in the correct state to handle controls.
*
* setLensPosition() returns true if the mode was AfModeManual and
* the lens position has changed, otherwise returns false. When it
* returns true, hwpos should be sent immediately to the lens driver.
*
* getMode() is provided mainly for validating controls.
* getLensPosition() is provided for populating DeviceStatus.
*/
enum AfRange { AfRangeNormal = 0,
AfRangeMacro,
AfRangeFull,
AfRangeMax };
enum AfSpeed { AfSpeedNormal = 0,
AfSpeedFast,
AfSpeedMax };
enum AfMode { AfModeManual = 0,
AfModeAuto,
AfModeContinuous };
enum AfPause { AfPauseImmediate = 0,
AfPauseDeferred,
AfPauseResume };
virtual void setRange([[maybe_unused]] AfRange range)
{
}
virtual void setSpeed([[maybe_unused]] AfSpeed speed)
{
}
virtual void setMetering([[maybe_unused]] bool use_windows)
{
}
virtual void setWindows([[maybe_unused]] libcamera::Span<libcamera::Rectangle const> const &wins)
{
}
virtual void setMode(AfMode mode) = 0;
virtual AfMode getMode() const = 0;
virtual bool setLensPosition(double dioptres, int32_t *hwpos) = 0;
virtual std::optional<double> getLensPosition() const = 0;
virtual void triggerScan() = 0;
virtual void cancelScan() = 0;
virtual void pause(AfPause pause) = 0;
};
} // namespace RPiController

View file

@ -0,0 +1,35 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2022, Raspberry Pi Ltd
*
* af_status.h - AF control algorithm status
*/
#pragma once
#include <optional>
/*
* The AF algorithm should post the following structure into the image's
* "af.status" metadata. lensSetting should control the lens.
*/
enum class AfState {
Idle = 0,
Scanning,
Focused,
Failed
};
enum class AfPauseState {
Running = 0,
Pausing,
Paused
};
struct AfStatus {
/* state for reporting */
AfState state;
AfPauseState pauseState;
/* lensSetting should be sent to the lens driver, when valid */
std::optional<int> lensSetting;
};

View file

@ -0,0 +1,21 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2022, Raspberry Pi Ltd
*
* pdaf_data.h - PDAF Metadata; for now this is
* largely based on IMX708's PDAF "Type 1" output.
*/
#pragma once
#include <stdint.h>
#define PDAF_DATA_ROWS 12
#define PDAF_DATA_COLS 16
struct PdafData {
/* Confidence values, in raster order, in arbitrary units */
uint16_t conf[PDAF_DATA_ROWS][PDAF_DATA_COLS];
/* Phase error, in raster order, in s11 Q4 format (S.6.4) */
int16_t phase[PDAF_DATA_ROWS][PDAF_DATA_COLS];
};