camerad: add helper function get_gain_factor (#33594)

pull/33595/head
Dean Lee 12 months ago committed by GitHub
parent b852aba670
commit 943aa616b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 13
      system/camerad/cameras/camera_qcom2.cc

@ -60,20 +60,23 @@ public:
void set_exposure_rect(); void set_exposure_rect();
void run(); void run();
float get_gain_factor() const {
return (1 + dc_gain_weight * (sensor->dc_gain_factor-1) / sensor->dc_gain_max_weight);
}
void init() { void init() {
fl_pix = cc.focal_len / sensor->pixel_size_mm; fl_pix = cc.focal_len / sensor->pixel_size_mm;
set_exposure_rect(); set_exposure_rect();
dc_gain_weight = sensor->dc_gain_min_weight; dc_gain_weight = sensor->dc_gain_min_weight;
gain_idx = sensor->analog_gain_rec_idx; gain_idx = sensor->analog_gain_rec_idx;
cur_ev[0] = cur_ev[1] = cur_ev[2] = (1 + dc_gain_weight * (sensor->dc_gain_factor-1) / sensor->dc_gain_max_weight) * sensor->sensor_analog_gains[gain_idx] * exposure_time; cur_ev[0] = cur_ev[1] = cur_ev[2] = get_gain_factor() * sensor->sensor_analog_gains[gain_idx] * exposure_time;
}; };
// TODO: this should move to SpectraCamera // TODO: this should move to SpectraCamera
void handle_camera_event(void *evdat); void handle_camera_event(void *evdat);
}; };
void CameraState::handle_camera_event(void *evdat) { void CameraState::handle_camera_event(void *evdat) {
if (!enabled) return; if (!enabled) return;
struct cam_req_mgr_message *event_data = (struct cam_req_mgr_message *)evdat; struct cam_req_mgr_message *event_data = (struct cam_req_mgr_message *)evdat;
@ -113,7 +116,7 @@ void CameraState::handle_camera_event(void *evdat) {
meta_data.request_id = real_id; meta_data.request_id = real_id;
meta_data.timestamp_sof = timestamp; meta_data.timestamp_sof = timestamp;
exp_lock.lock(); exp_lock.lock();
meta_data.gain = analog_gain_frac * (1 + dc_gain_weight * (sensor->dc_gain_factor-1) / sensor->dc_gain_max_weight); meta_data.gain = analog_gain_frac * get_gain_factor();
meta_data.high_conversion_gain = dc_gain_enabled; meta_data.high_conversion_gain = dc_gain_enabled;
meta_data.integ_lines = exposure_time; meta_data.integ_lines = exposure_time;
meta_data.measured_grey_fraction = measured_grey_fraction; meta_data.measured_grey_fraction = measured_grey_fraction;
@ -233,7 +236,7 @@ void CameraState::set_camera_exposure(float grey_frac) {
// Simple brute force optimizer to choose sensor parameters // Simple brute force optimizer to choose sensor parameters
// to reach desired EV // to reach desired EV
for (int g = std::max((int)sensor->analog_gain_min_idx, gain_idx - 1); g <= std::min((int)sensor->analog_gain_max_idx, gain_idx + 1); g++) { for (int g = std::max((int)sensor->analog_gain_min_idx, gain_idx - 1); g <= std::min((int)sensor->analog_gain_max_idx, gain_idx + 1); g++) {
float gain = sensor->sensor_analog_gains[g] * (1 + dc_gain_weight * (sensor->dc_gain_factor-1) / sensor->dc_gain_max_weight); float gain = sensor->sensor_analog_gains[g] * get_gain_factor();
// Compute optimal time for given gain // Compute optimal time for given gain
int t = std::clamp(int(std::round(desired_ev / gain)), sensor->exposure_time_min, sensor->exposure_time_max); int t = std::clamp(int(std::round(desired_ev / gain)), sensor->exposure_time_min, sensor->exposure_time_max);
@ -257,7 +260,7 @@ void CameraState::set_camera_exposure(float grey_frac) {
exposure_time = new_exp_t; exposure_time = new_exp_t;
dc_gain_enabled = enable_dc_gain; dc_gain_enabled = enable_dc_gain;
float gain = analog_gain_frac * (1 + dc_gain_weight * (sensor->dc_gain_factor-1) / sensor->dc_gain_max_weight); float gain = analog_gain_frac * get_gain_factor();
cur_ev[buf.cur_frame_data.frame_id % 3] = exposure_time * gain; cur_ev[buf.cur_frame_data.frame_id % 3] = exposure_time * gain;
exp_lock.unlock(); exp_lock.unlock();

Loading…
Cancel
Save