summaryrefslogtreecommitdiff
path: root/src/ipa/raspberrypi/controller/rpi/alsc.h
diff options
context:
space:
mode:
authorNaushir Patuck <naush@raspberrypi.com>2023-05-03 13:20:27 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2023-05-04 20:47:40 +0300
commit726e9274ea95fa46352556d340c5793a8da51fcd (patch)
tree80f6adcdbf744f9317e09eff3e80c602b384a753 /src/ipa/raspberrypi/controller/rpi/alsc.h
parent46aefed208fef4bc8d6f6e8882b92b9af710a60b (diff)
pipeline: ipa: raspberrypi: Refactor and move the Raspberry Pi code
Split the Raspberry Pi pipeline handler and IPA source code into common and VC4/BCM2835 specific file structures. For the pipeline handler, the common code files now live in src/libcamera/pipeline/rpi/common/ and the VC4-specific files in src/libcamera/pipeline/rpi/vc4/. For the IPA, the common code files now live in src/ipa/rpi/{cam_helper,controller}/ and the vc4 specific files in src/ipa/rpi/vc4/. With this change, the camera tuning files are now installed under share/libcamera/ipa/rpi/vc4/. To build the pipeline and IPA, the meson configuration options have now changed from "raspberrypi" to "rpi/vc4": meson setup build -Dipas=rpi/vc4 -Dpipelines=rpi/vc4 Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/ipa/raspberrypi/controller/rpi/alsc.h')
-rw-r--r--src/ipa/raspberrypi/controller/rpi/alsc.h174
1 files changed, 0 insertions, 174 deletions
diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.h b/src/ipa/raspberrypi/controller/rpi/alsc.h
deleted file mode 100644
index 0b6d9478..00000000
--- a/src/ipa/raspberrypi/controller/rpi/alsc.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/* SPDX-License-Identifier: BSD-2-Clause */
-/*
- * Copyright (C) 2019, Raspberry Pi Ltd
- *
- * alsc.h - ALSC (auto lens shading correction) control algorithm
- */
-#pragma once
-
-#include <array>
-#include <mutex>
-#include <condition_variable>
-#include <thread>
-#include <vector>
-
-#include <libcamera/geometry.h>
-
-#include "../algorithm.h"
-#include "../alsc_status.h"
-#include "../statistics.h"
-
-namespace RPiController {
-
-/* Algorithm to generate automagic LSC (Lens Shading Correction) tables. */
-
-/*
- * The Array2D class is a very thin wrapper round std::vector so that it can
- * be used in exactly the same way in the code but carries its correct width
- * and height ("dimensions") with it.
- */
-
-template<typename T>
-class Array2D
-{
-public:
- using Size = libcamera::Size;
-
- const Size &dimensions() const { return dimensions_; }
-
- size_t size() const { return data_.size(); }
-
- const std::vector<T> &data() const { return data_; }
-
- void resize(const Size &dims)
- {
- dimensions_ = dims;
- data_.resize(dims.width * dims.height);
- }
-
- void resize(const Size &dims, const T &value)
- {
- resize(dims);
- std::fill(data_.begin(), data_.end(), value);
- }
-
- T &operator[](int index) { return data_[index]; }
-
- const T &operator[](int index) const { return data_[index]; }
-
- T *ptr() { return data_.data(); }
-
- const T *ptr() const { return data_.data(); }
-
- auto begin() { return data_.begin(); }
- auto end() { return data_.end(); }
-
-private:
- Size dimensions_;
- std::vector<T> data_;
-};
-
-/*
- * We'll use the term SparseArray for the large sparse matrices that are
- * XY tall but have only 4 non-zero elements on each row.
- */
-
-template<typename T>
-using SparseArray = std::vector<std::array<T, 4>>;
-
-struct AlscCalibration {
- double ct;
- Array2D<double> table;
-};
-
-struct AlscConfig {
- /* Only repeat the ALSC calculation every "this many" frames */
- uint16_t framePeriod;
- /* number of initial frames for which speed taken as 1.0 (maximum) */
- uint16_t startupFrames;
- /* IIR filter speed applied to algorithm results */
- double speed;
- double sigmaCr;
- double sigmaCb;
- double minCount;
- uint16_t minG;
- double omega;
- uint32_t nIter;
- Array2D<double> luminanceLut;
- double luminanceStrength;
- std::vector<AlscCalibration> calibrationsCr;
- std::vector<AlscCalibration> calibrationsCb;
- double defaultCt; /* colour temperature if no metadata found */
- double threshold; /* iteration termination threshold */
- double lambdaBound; /* upper/lower bound for lambda from a value of 1 */
- libcamera::Size tableSize;
-};
-
-class Alsc : public Algorithm
-{
-public:
- Alsc(Controller *controller = NULL);
- ~Alsc();
- char const *name() const override;
- void initialise() override;
- void switchMode(CameraMode const &cameraMode, Metadata *metadata) override;
- int read(const libcamera::YamlObject &params) override;
- void prepare(Metadata *imageMetadata) override;
- void process(StatisticsPtr &stats, Metadata *imageMetadata) override;
-
-private:
- /* configuration is read-only, and available to both threads */
- AlscConfig config_;
- bool firstTime_;
- CameraMode cameraMode_;
- Array2D<double> luminanceTable_;
- std::thread asyncThread_;
- void asyncFunc(); /* asynchronous thread function */
- std::mutex mutex_;
- /* condvar for async thread to wait on */
- std::condition_variable asyncSignal_;
- /* condvar for synchronous thread to wait on */
- std::condition_variable syncSignal_;
- /* for sync thread to check if async thread finished (requires mutex) */
- bool asyncFinished_;
- /* for async thread to check if it's been told to run (requires mutex) */
- bool asyncStart_;
- /* for async thread to check if it's been told to quit (requires mutex) */
- bool asyncAbort_;
-
- /*
- * The following are only for the synchronous thread to use:
- * for sync thread to note its has asked async thread to run
- */
- bool asyncStarted_;
- /* counts up to framePeriod before restarting the async thread */
- int framePhase_;
- /* counts up to startupFrames */
- int frameCount_;
- /* counts up to startupFrames for Process function */
- int frameCount2_;
- std::array<Array2D<double>, 3> syncResults_;
- std::array<Array2D<double>, 3> prevSyncResults_;
- void waitForAysncThread();
- /*
- * The following are for the asynchronous thread to use, though the main
- * thread can set/reset them if the async thread is known to be idle:
- */
- void restartAsync(StatisticsPtr &stats, Metadata *imageMetadata);
- /* copy out the results from the async thread so that it can be restarted */
- void fetchAsyncResults();
- double ct_;
- RgbyRegions statistics_;
- std::array<Array2D<double>, 3> asyncResults_;
- Array2D<double> asyncLambdaR_;
- Array2D<double> asyncLambdaB_;
- void doAlsc();
- Array2D<double> lambdaR_;
- Array2D<double> lambdaB_;
-
- /* Temporaries for the computations */
- std::array<Array2D<double>, 5> tmpC_;
- std::array<SparseArray<double>, 3> tmpM_;
-};
-
-} /* namespace RPiController */