summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2020-06-26 11:25:31 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-07-06 17:14:34 +0300
commite0c583871da9cc6d243bff26ef5ba224007fc5ed (patch)
treebdb81beae525b1794346dca2ef49ed6c23f12ef7
parent64652e26d7dbae24ab90a1a4bed19b733985fcf7 (diff)
libcamera: ipa: raspberrypi: Populate focus FoM from the ISP statistics
Switch FocusStatus::num to unsigned int for convenience. Fill in libcamera::controls::FocusFoM with the average of the middle two regions (across a 4x3 grid) FoM statistics from the ISP. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/ipa/raspberrypi/controller/focus_status.h2
-rw-r--r--src/ipa/raspberrypi/raspberrypi.cpp12
2 files changed, 13 insertions, 1 deletions
diff --git a/src/ipa/raspberrypi/controller/focus_status.h b/src/ipa/raspberrypi/controller/focus_status.h
index 3ad88777..ace2fe2c 100644
--- a/src/ipa/raspberrypi/controller/focus_status.h
+++ b/src/ipa/raspberrypi/controller/focus_status.h
@@ -17,7 +17,7 @@ extern "C" {
#endif
struct FocusStatus {
- int num;
+ unsigned int num;
uint32_t focus_measures[FOCUS_REGIONS];
};
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 62730198..b1f27861 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -42,6 +42,7 @@
#include "contrast_status.h"
#include "controller.hpp"
#include "dpc_status.h"
+#include "focus_status.h"
#include "geq_status.h"
#include "lux_status.h"
#include "metadata.hpp"
@@ -405,6 +406,17 @@ void IPARPi::reportMetadata()
static_cast<int32_t>(blackLevelStatus->black_level_g),
static_cast<int32_t>(blackLevelStatus->black_level_g),
static_cast<int32_t>(blackLevelStatus->black_level_b) });
+
+ FocusStatus *focusStatus = rpiMetadata_.GetLocked<FocusStatus>("focus.status");
+ if (focusStatus && focusStatus->num == 12) {
+ /*
+ * We get a 4x3 grid of regions by default. Calculate the average
+ * FoM over the central two positions to give an overall scene FoM.
+ * This can change later if it is not deemed suitable.
+ */
+ int32_t focusFoM = (focusStatus->focus_measures[5] + focusStatus->focus_measures[6]) / 2;
+ libcameraMetadata_.set(controls::FocusFoM, focusFoM);
+ }
}
/*