summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ipa/raspberrypi/controller/rpi/alsc.cpp39
-rw-r--r--src/ipa/raspberrypi/controller/rpi/alsc.hpp3
2 files changed, 28 insertions, 14 deletions
diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.cpp b/src/ipa/raspberrypi/controller/rpi/alsc.cpp
index 12359dc5..4df99347 100644
--- a/src/ipa/raspberrypi/controller/rpi/alsc.cpp
+++ b/src/ipa/raspberrypi/controller/rpi/alsc.cpp
@@ -173,19 +173,34 @@ void Alsc::Initialise()
lambda_r_[i] = lambda_b_[i] = 1.0;
}
+void Alsc::waitForAysncThread()
+{
+ if (async_started_) {
+ async_started_ = false;
+ std::unique_lock<std::mutex> lock(mutex_);
+ sync_signal_.wait(lock, [&] {
+ return async_finished_;
+ });
+ async_finished_ = false;
+ }
+}
+
void Alsc::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
{
(void)metadata;
+ // Ensure the other thread isn't running while we do this.
+ waitForAysncThread();
+
// There's a bit of a question what we should do if the "crop" of the
- // camera mode has changed. Any calculation currently in flight would
- // not be useful to the new mode, so arguably we should abort it, and
- // generate a new table (like the "first_time" code already here). When
- // the crop doesn't change, we can presumably just leave things
- // alone. For now, I think we'll just wait and see. When the crop does
- // change, any effects should be transient, and if they're not transient
- // enough, we'll revisit the question then.
+ // camera mode has changed. Should we effectively reset the algorithm
+ // and start over?
camera_mode_ = camera_mode;
+
+ // We must resample the luminance table like we do the others, but it's
+ // fixed so we can simply do it up front here.
+ resample_cal_table(config_.luminance_lut, camera_mode_, luminance_table_);
+
if (first_time_) {
// On the first time, arrange for something sensible in the
// initial tables. Construct the tables for some default colour
@@ -201,7 +216,7 @@ void Alsc::SwitchMode(CameraMode const &camera_mode, Metadata *metadata)
compensate_lambdas_for_cal(cal_table_b, lambda_b_,
async_lambda_b_);
add_luminance_to_tables(sync_results_, async_lambda_r_, 1.0,
- async_lambda_b_, config_.luminance_lut,
+ async_lambda_b_, luminance_table_,
config_.luminance_strength);
memcpy(prev_sync_results_, sync_results_,
sizeof(prev_sync_results_));
@@ -266,8 +281,6 @@ void Alsc::restartAsync(StatisticsPtr &stats, Metadata *image_metadata)
}
copy_stats(statistics_, stats, alsc_status);
frame_phase_ = 0;
- // copy the camera mode so it won't change during the calculations
- async_camera_mode_ = camera_mode_;
async_started_ = true;
{
std::lock_guard<std::mutex> lock(mutex_);
@@ -672,9 +685,9 @@ void Alsc::doAlsc()
// Fetch the new calibrations (if any) for this CT. Resample them in
// case the camera mode is not full-frame.
get_cal_table(ct_, config_.calibrations_Cr, cal_table_tmp);
- resample_cal_table(cal_table_tmp, async_camera_mode_, cal_table_r);
+ resample_cal_table(cal_table_tmp, camera_mode_, cal_table_r);
get_cal_table(ct_, config_.calibrations_Cb, cal_table_tmp);
- resample_cal_table(cal_table_tmp, async_camera_mode_, cal_table_b);
+ resample_cal_table(cal_table_tmp, camera_mode_, cal_table_b);
// You could print out the cal tables for this image here, if you're
// tuning the algorithm...
(void)print_cal_table;
@@ -697,7 +710,7 @@ void Alsc::doAlsc()
compensate_lambdas_for_cal(cal_table_b, lambda_b_, async_lambda_b_);
// Fold in the luminance table at the appropriate strength.
add_luminance_to_tables(async_results_, async_lambda_r_, 1.0,
- async_lambda_b_, config_.luminance_lut,
+ async_lambda_b_, luminance_table_,
config_.luminance_strength);
}
diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.hpp b/src/ipa/raspberrypi/controller/rpi/alsc.hpp
index e895913b..95572af0 100644
--- a/src/ipa/raspberrypi/controller/rpi/alsc.hpp
+++ b/src/ipa/raspberrypi/controller/rpi/alsc.hpp
@@ -60,10 +60,10 @@ private:
AlscConfig config_;
bool first_time_;
CameraMode camera_mode_;
+ double luminance_table_[ALSC_CELLS_X * ALSC_CELLS_Y];
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
@@ -86,6 +86,7 @@ private:
int frame_count2_;
double sync_results_[3][ALSC_CELLS_Y][ALSC_CELLS_X];
double prev_sync_results_[3][ALSC_CELLS_Y][ALSC_CELLS_X];
+ 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 *image_metadata);