Close the AAA loop
This commit is contained in:
@@ -103,28 +103,6 @@ update_process_pipeline()
|
|||||||
.balance = { balance_red, 1.0f, balance_blue },
|
.balance = { balance_red, 1.0f, balance_blue },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mp_process_pipeline_state pipeline_state = {
|
|
||||||
.camera = state_io.camera,
|
|
||||||
.configuration = state_io.configuration,
|
|
||||||
.burst_length = state_io.burst_length,
|
|
||||||
.preview_width = state_io.preview_width,
|
|
||||||
.preview_height = state_io.preview_height,
|
|
||||||
.device_rotation = state_io.device_rotation,
|
|
||||||
.gain_is_manual = state_io.gain.manual,
|
|
||||||
.gain = state_io.gain.value,
|
|
||||||
.gain_max = state_io.gain.max,
|
|
||||||
.balance_red = balance_red,
|
|
||||||
.balance_blue = balance_blue,
|
|
||||||
.exposure_is_manual = state_io.exposure.manual,
|
|
||||||
.exposure = state_io.exposure.value,
|
|
||||||
.has_auto_focus_continuous = state_io.focus.control != 0,
|
|
||||||
.has_auto_focus_start = state_io.can_af_trigger,
|
|
||||||
.flash_enabled = state_io.flash_enabled,
|
|
||||||
.control_gain = state_io.gain.control != 0,
|
|
||||||
.control_exposure = state_io.exposure.control != 0,
|
|
||||||
.control_focus = state_io.focus.control != 0,
|
|
||||||
.control_flash = true,
|
|
||||||
};
|
|
||||||
mp_process_pipeline_update_state(&new_state);
|
mp_process_pipeline_update_state(&new_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,7 +220,9 @@ update_controls()
|
|||||||
state_io.gain.manual = state_io.gain.manual_req;
|
state_io.gain.manual = state_io.gain.manual_req;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state_io.gain.manual && state_io.gain.value != state_io.gain.value_req) {
|
if ((state_io.gain.manual ||
|
||||||
|
(!state_io.gain.manual && state_io.gain.auto_control == 0)) &&
|
||||||
|
state_io.gain.value != state_io.gain.value_req) {
|
||||||
mp_camera_control_set_int32_bg(state_io.camera,
|
mp_camera_control_set_int32_bg(state_io.camera,
|
||||||
state_io.gain.control,
|
state_io.gain.control,
|
||||||
state_io.gain.value_req);
|
state_io.gain.value_req);
|
||||||
@@ -267,6 +247,19 @@ update_controls()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_aaa()
|
||||||
|
{
|
||||||
|
if (!state_io.exposure.manual && state_io.exposure.auto_control == 0) {
|
||||||
|
int step = state_io.gain.value / 16;
|
||||||
|
if (step < 1) {
|
||||||
|
step = 1;
|
||||||
|
}
|
||||||
|
state_io.gain.value_req = state_io.gain.value;
|
||||||
|
state_io.gain.value_req += step * state_io.stats.exposure;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_frame(MPBuffer buffer, void *_data)
|
on_frame(MPBuffer buffer, void *_data)
|
||||||
{
|
{
|
||||||
@@ -276,6 +269,7 @@ on_frame(MPBuffer buffer, void *_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Only update controls right after a frame was captured
|
// Only update controls right after a frame was captured
|
||||||
|
do_aaa();
|
||||||
update_controls();
|
update_controls();
|
||||||
|
|
||||||
// When the mode is switched while capturing we get a couple blank frames,
|
// When the mode is switched while capturing we get a couple blank frames,
|
||||||
@@ -536,6 +530,10 @@ update_state(MPPipeline *pipeline, const mp_state_io *new_state)
|
|||||||
state_io.focus.manual_req = new_state->focus.manual_req;
|
state_io.focus.manual_req = new_state->focus.manual_req;
|
||||||
|
|
||||||
state_io.flash_enabled = new_state->flash_enabled;
|
state_io.flash_enabled = new_state->flash_enabled;
|
||||||
|
|
||||||
|
state_io.stats.exposure = new_state->stats.exposure;
|
||||||
|
state_io.stats.whitebalance = new_state->stats.whitebalance;
|
||||||
|
state_io.stats.focus = new_state->stats.focus;
|
||||||
}
|
}
|
||||||
|
|
||||||
update_process_pipeline();
|
update_process_pipeline();
|
||||||
|
58
src/main.c
58
src/main.c
@@ -131,13 +131,12 @@ update_io_pipeline()
|
|||||||
.focus.max = state.focus.max,
|
.focus.max = state.focus.max,
|
||||||
.focus.manual = state.focus.manual,
|
.focus.manual = state.focus.manual,
|
||||||
.focus.manual_req = state.focus.manual_req,
|
.focus.manual_req = state.focus.manual_req,
|
||||||
|
|
||||||
|
.stats.exposure = state.stats.exposure,
|
||||||
|
.stats.whitebalance = state.stats.whitebalance,
|
||||||
|
.stats.focus = state.stats.focus,
|
||||||
};
|
};
|
||||||
mp_io_pipeline_update_state(&new_state);
|
mp_io_pipeline_update_state(&new_state);
|
||||||
|
|
||||||
// Make the right settings available for the camera
|
|
||||||
gtk_widget_set_visible(flash_button, state.control_flash);
|
|
||||||
gtk_widget_set_visible(iso_button, state.gain.control != 0);
|
|
||||||
gtk_widget_set_visible(shutter_button, state.exposure.control != 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -146,33 +145,42 @@ update_io_pipeline()
|
|||||||
static bool
|
static bool
|
||||||
update_state(const mp_state_main *new_state)
|
update_state(const mp_state_main *new_state)
|
||||||
{
|
{
|
||||||
if (state.camera == new_state->camera) {
|
state.gain.control = new_state->gain.control;
|
||||||
state.gain.control = new_state->gain.control;
|
state.gain.auto_control = new_state->gain.auto_control;
|
||||||
state.gain.auto_control = new_state->gain.auto_control;
|
state.gain.value = new_state->gain.value;
|
||||||
state.gain.value = new_state->gain.value;
|
state.gain.max = new_state->gain.max;
|
||||||
state.gain.max = new_state->gain.max;
|
state.gain.manual = new_state->gain.manual;
|
||||||
state.gain.manual = new_state->gain.manual;
|
|
||||||
|
|
||||||
state.exposure.control = new_state->exposure.control;
|
state.exposure.control = new_state->exposure.control;
|
||||||
state.exposure.auto_control = new_state->exposure.auto_control;
|
state.exposure.auto_control = new_state->exposure.auto_control;
|
||||||
state.exposure.value = new_state->exposure.value;
|
state.exposure.value = new_state->exposure.value;
|
||||||
state.exposure.max = new_state->exposure.max;
|
state.exposure.max = new_state->exposure.max;
|
||||||
state.exposure.manual = new_state->exposure.manual;
|
state.exposure.manual = new_state->exposure.manual;
|
||||||
|
|
||||||
state.focus.control = new_state->focus.control;
|
state.focus.control = new_state->focus.control;
|
||||||
state.focus.auto_control = new_state->focus.auto_control;
|
state.focus.auto_control = new_state->focus.auto_control;
|
||||||
state.focus.value = new_state->focus.value;
|
state.focus.value = new_state->focus.value;
|
||||||
state.focus.max = new_state->focus.max;
|
state.focus.max = new_state->focus.max;
|
||||||
state.focus.manual = new_state->focus.manual;
|
state.focus.manual = new_state->focus.manual;
|
||||||
|
|
||||||
state.has_auto_focus_continuous =
|
state.has_auto_focus_continuous =
|
||||||
new_state->has_auto_focus_continuous;
|
new_state->has_auto_focus_continuous;
|
||||||
state.has_auto_focus_start = new_state->has_auto_focus_start;
|
state.has_auto_focus_start = new_state->has_auto_focus_start;
|
||||||
}
|
|
||||||
|
|
||||||
state.preview_buffer_width = new_state->preview_buffer_width;
|
state.preview_buffer_width = new_state->preview_buffer_width;
|
||||||
state.preview_buffer_height = new_state->preview_buffer_height;
|
state.preview_buffer_height = new_state->preview_buffer_height;
|
||||||
|
|
||||||
|
state.stats.exposure = new_state->stats.exposure;
|
||||||
|
state.stats.whitebalance = new_state->stats.whitebalance;
|
||||||
|
state.stats.focus = new_state->stats.focus;
|
||||||
|
|
||||||
|
// Make the right settings available for the camera
|
||||||
|
gtk_widget_set_visible(flash_button, state.control_flash);
|
||||||
|
gtk_widget_set_visible(iso_button, state.gain.control != 0);
|
||||||
|
gtk_widget_set_visible(shutter_button, state.exposure.control != 0);
|
||||||
|
|
||||||
|
update_io_pipeline();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1033,6 +1033,10 @@ update_state(MPPipeline *pipeline, const mp_state_proc *new_state)
|
|||||||
.focus.value = state_proc.focus.value,
|
.focus.value = state_proc.focus.value,
|
||||||
.focus.max = state_proc.focus.max,
|
.focus.max = state_proc.focus.max,
|
||||||
.focus.manual = state_proc.focus.manual,
|
.focus.manual = state_proc.focus.manual,
|
||||||
|
|
||||||
|
.stats.exposure = state_proc.stats.exposure,
|
||||||
|
.stats.whitebalance = state_proc.stats.whitebalance,
|
||||||
|
.stats.focus = state_proc.stats.focus,
|
||||||
};
|
};
|
||||||
mp_main_update_state(&new_main);
|
mp_main_update_state(&new_main);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user