/* SPDX-License-Identifier: BSD-2-Clause */ /* * Copyright (C) 2019, Raspberry Pi (Trading) Limited * * alsc.hpp - ALSC (auto lens shading correction) control algorithm */ #pragma once #include #include #include #include "../algorithm.hpp" #include "../alsc_status.h" namespace RPi { // Algorithm to generate automagic LSC (Lens Shading Correction) tables. struct AlscCalibration { double ct; double table[ALSC_CELLS_X * ALSC_CELLS_Y]; }; struct AlscConfig { // Only repeat the ALSC calculation every "this many" frames uint16_t frame_period; // number of initial frames for which speed taken as 1.0 (maximum) uint16_t startup_frames; // IIR filter speed applied to algorithm results double speed; double sigma_Cr; double sigma_Cb; double min_count; uint16_t min_G; double omega; uint32_t n_iter; double luminance_lut[ALSC_CELLS_X * ALSC_CELLS_Y]; double luminance_strength; std::vector calibrations_Cr; std::vector calibrations_Cb; double default_ct; // colour temperature if no metadata found double threshold; // iteration termination threshold }; class Alsc : public Algorithm { public: Alsc(Controller *controller = NULL); ~Alsc(); char const *Name() const override; void Initialise() override; void SwitchMode(CameraMode const &camera_mode, Metadata *metadata) override; void Read(boost::property_tree::ptree const ¶ms) override; void Prepare(Metadata *image_metadata) override; void Process(StatisticsPtr &stats, Metadata *image_metadata) override; private: // configuration is read-only, and available to both threads AlscConfig config_; bool first_time_; std::atomic camera_mode_; std::thread async_thread_; void asyncFunc(); // asynchronous thread function std::mutex mutex_; CameraMode async_camera_mode_; // condvar for async thread to wait on std::condition_variable async_signal_; // condvar for synchronous thread to wait on std::condition_variable sync_signal_; // for sync thread to check if async thread finished (requires mutex) bool async_finished_; // for async thread to check if it's been told to run (requires mutex) bool async_start_; // for async thread to check if it's been told to quit (requires mutex) bool async_abort_; // The following are only for the synchronous thread to use: // for sync thread to note its has asked async thread to run bool async_started_; // counts up to frame_period before restarting the async thread int frame_phase_; // counts up to startup_frames int frame_count_; // counts up to startup_frames for Process method int frame_count2_; double sync_results_[3][ALSC_CELLS_Y][ALSC_CELLS_X]; double prev_sync_results_[3][ALSC_CELLS_Y][ALSC_CELLS_X]; // 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 *image_metadata); // copy out the results from the async thread so that it can be restarted void fetchAsyncResults(); double ct_; bcm2835_isp_stats_region statistics_[ALSC_CELLS_Y * ALSC_CELLS_X]; double async_results_[3][ALSC_CELLS_Y][ALSC_CELLS_X]; double async_lambda_r_[ALSC_CELLS_X * ALSC_CELLS_Y]; double async_lambda_b_[ALSC_CELLS_X * ALSC_CELLS_Y]; void doAlsc(); double lambda_r_[ALSC_CELLS_X * ALSC_CELLS_Y]; double lambda_b_[ALSC_CELLS_X * ALSC_CELLS_Y]; }; } // namespace RPi a id='n11' href='#n11'>11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2020, Google Inc.
 *
 * camera_stream.h - Camera HAL stream
 */

#pragma once

#include <memory>
#include <queue>
#include <vector>

#include <hardware/camera3.h>

#include <libcamera/base/mutex.h>
#include <libcamera/base/thread.h>

#include <libcamera/camera.h>
#include <libcamera/framebuffer.h>
#include <libcamera/geometry.h>
#include <libcamera/pixel_format.h>