[libcamera-devel,v2,06/14] ipa: raspberrypi: Add autofocus algorithm interface headers
diff mbox series

Message ID 20230123154934.27803-7-naush@raspberrypi.com
State Accepted
Commit 23aefee3378afc71a98b6c5a9e07e60591fec344
Headers show
Series
  • Raspberry Pi: Camera Module 3 support
Related show

Commit Message

Naushir Patuck Jan. 23, 2023, 3:49 p.m. UTC
From: Nick Hollinghurst <nick.hollinghurst@raspberrypi.com>

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>
---
 src/ipa/raspberrypi/controller/af_algorithm.h | 76 +++++++++++++++++++
 src/ipa/raspberrypi/controller/af_status.h    | 35 +++++++++
 src/ipa/raspberrypi/controller/pdaf_data.h    | 21 +++++
 3 files changed, 132 insertions(+)
 create mode 100644 src/ipa/raspberrypi/controller/af_algorithm.h
 create mode 100644 src/ipa/raspberrypi/controller/af_status.h
 create mode 100644 src/ipa/raspberrypi/controller/pdaf_data.h

Patch
diff mbox series

diff --git a/src/ipa/raspberrypi/controller/af_algorithm.h b/src/ipa/raspberrypi/controller/af_algorithm.h
new file mode 100644
index 000000000000..ad9b575450e3
--- /dev/null
+++ b/src/ipa/raspberrypi/controller/af_algorithm.h
@@ -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
diff --git a/src/ipa/raspberrypi/controller/af_status.h b/src/ipa/raspberrypi/controller/af_status.h
new file mode 100644
index 000000000000..92c088126733
--- /dev/null
+++ b/src/ipa/raspberrypi/controller/af_status.h
@@ -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;
+};
diff --git a/src/ipa/raspberrypi/controller/pdaf_data.h b/src/ipa/raspberrypi/controller/pdaf_data.h
new file mode 100644
index 000000000000..03c00d72c0e8
--- /dev/null
+++ b/src/ipa/raspberrypi/controller/pdaf_data.h
@@ -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];
+};