From 899748df4625b9456feff9c47eb9a07c4c84653c Mon Sep 17 00:00:00 2001 From: Martijn Braam Date: Tue, 15 Feb 2022 17:29:12 +0100 Subject: [PATCH] Change burst length depending on gain The burst_length is now calculated before taking the first picture by increasing the number of frames when the sensor gain is raised. --- src/io_pipeline.c | 13 +++++++++++-- src/main.c | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/io_pipeline.c b/src/io_pipeline.c index f9d428c..63adbbb 100644 --- a/src/io_pipeline.c +++ b/src/io_pipeline.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -343,14 +344,22 @@ static void capture(MPPipeline *pipeline, const void *data) { struct camera_info *info = &cameras[camera->index]; - - captures_remaining = burst_length; + uint32_t gain; + float gain_norm; // Disable the autogain/exposure while taking the burst mp_camera_control_set_int32(info->camera, V4L2_CID_AUTOGAIN, 0); mp_camera_control_set_int32( info->camera, V4L2_CID_EXPOSURE_AUTO, V4L2_EXPOSURE_MANUAL); + // Get current gain to calculate a burst length; + // with low gain there's 2, with the max automatic gain of the ov5640 + // the value seems to be 248 which creates a 5 frame burst + // for manual gain you can go up to 11 frames + gain = mp_camera_control_get_int32(info->camera, V4L2_CID_GAIN); + gain_norm = (float)gain / (float)info->gain_max; + burst_length = (int)(sqrt(gain_norm) * 10) + 1; + // Change camera mode for capturing mp_process_pipeline_sync(); mp_camera_stop_capture(info->camera); diff --git a/src/main.c b/src/main.c index 7b4c088..8ab745d 100644 --- a/src/main.c +++ b/src/main.c @@ -65,7 +65,7 @@ static char last_path[260] = ""; static MPZBarScanResult *zbar_result = NULL; -static int burst_length = 3; +static int burst_length = 0; // Widgets GtkWidget *preview;