summaryrefslogtreecommitdiff
path: root/src/ipa/raspberrypi
diff options
context:
space:
mode:
authorDavid Plowman <david.plowman@raspberrypi.com>2020-09-07 08:16:02 +0100
committerKieran Bingham <kieran.bingham@ideasonboard.com>2020-09-29 11:43:07 +0100
commit5c32a0daf5c3ce59491b043bd2e3efd1f7a7d224 (patch)
treef24b147bf8ff981c98ee404d9106b8b74ab3ce02 /src/ipa/raspberrypi
parent4cff3937e1af979ad69d64d7658695950d1c1864 (diff)
libcamera: raspberrypi: Plumb user transform through to IPA
This commit plumbs the user transform from the Raspberry Pi pipeline handler through to the IPA. Note that the transform is actually handled in the sensor (by setting the h/v flip bits), so the IPAs need to understand the orientation of the image they receive. Once in the IPA we add it to the CameraMode description, so that it becomes automatically available to all the individual control algorithms. The IPA configure method has to be reordered just a little so as to fill in the transform in the camera mode before calling SwitchMode. Signed-off-by: David Plowman <david.plowman@raspberrypi.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'src/ipa/raspberrypi')
-rw-r--r--src/ipa/raspberrypi/controller/camera_mode.h4
-rw-r--r--src/ipa/raspberrypi/raspberrypi.cpp48
2 files changed, 31 insertions, 21 deletions
diff --git a/src/ipa/raspberrypi/controller/camera_mode.h b/src/ipa/raspberrypi/controller/camera_mode.h
index 875bab31..920f11be 100644
--- a/src/ipa/raspberrypi/controller/camera_mode.h
+++ b/src/ipa/raspberrypi/controller/camera_mode.h
@@ -6,6 +6,8 @@
*/
#pragma once
+#include <libcamera/transform.h>
+
// Description of a "camera mode", holding enough information for control
// algorithms to adapt their behaviour to the different modes of the camera,
// including binning, scaling, cropping etc.
@@ -33,6 +35,8 @@ struct CameraMode {
double noise_factor;
// line time in nanoseconds
double line_length;
+ // any camera transform *not* reflected already in the camera tuning
+ libcamera::Transform transform;
};
#ifdef __cplusplus
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index 0555cc4e..f53da87f 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -230,6 +230,33 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
/* Re-assemble camera mode using the sensor info. */
setMode(sensorInfo);
+ /*
+ * The ipaConfig.data always gives us the user transform first. Note that
+ * this will always make the LS table pointer (if present) element 1.
+ */
+ mode_.transform = static_cast<libcamera::Transform>(ipaConfig.data[0]);
+
+ /* Store the lens shading table pointer and handle if available. */
+ if (ipaConfig.operation & RPI_IPA_CONFIG_LS_TABLE) {
+ /* Remove any previous table, if there was one. */
+ if (lsTable_) {
+ munmap(lsTable_, MAX_LS_GRID_SIZE);
+ lsTable_ = nullptr;
+ }
+
+ /* Map the LS table buffer into user space (now element 1). */
+ lsTableHandle_ = FileDescriptor(ipaConfig.data[1]);
+ if (lsTableHandle_.isValid()) {
+ lsTable_ = mmap(nullptr, MAX_LS_GRID_SIZE, PROT_READ | PROT_WRITE,
+ MAP_SHARED, lsTableHandle_.fd(), 0);
+
+ if (lsTable_ == MAP_FAILED) {
+ LOG(IPARPI, Error) << "dmaHeap mmap failure for LS table.";
+ lsTable_ = nullptr;
+ }
+ }
+ }
+
/* Pass the camera mode to the CamHelper to setup algorithms. */
helper_->SetCameraMode(mode_);
@@ -282,27 +309,6 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
}
lastMode_ = mode_;
-
- /* Store the lens shading table pointer and handle if available. */
- if (ipaConfig.operation & RPI_IPA_CONFIG_LS_TABLE) {
- /* Remove any previous table, if there was one. */
- if (lsTable_) {
- munmap(lsTable_, MAX_LS_GRID_SIZE);
- lsTable_ = nullptr;
- }
-
- /* Map the LS table buffer into user space. */
- lsTableHandle_ = FileDescriptor(ipaConfig.data[0]);
- if (lsTableHandle_.isValid()) {
- lsTable_ = mmap(nullptr, MAX_LS_GRID_SIZE, PROT_READ | PROT_WRITE,
- MAP_SHARED, lsTableHandle_.fd(), 0);
-
- if (lsTable_ == MAP_FAILED) {
- LOG(IPARPI, Error) << "dmaHeap mmap failure for LS table.";
- lsTable_ = nullptr;
- }
- }
- }
}
void IPARPi::mapBuffers(const std::vector<IPABuffer> &buffers)