| /* |
| * handler_interface.cpp - handler interface |
| * |
| * Copyright (c) 2014-2015 Intel Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * Author: Wind Yuan <[email protected]> |
| */ |
| |
| #include "handler_interface.h" |
| |
| namespace XCam { |
| |
| AeHandler::AeHandler() |
| { |
| reset_parameters (); |
| } |
| |
| void |
| AeHandler::reset_parameters () |
| { |
| // in case missing any parameters |
| xcam_mem_clear (_params); |
| |
| _params.mode = XCAM_AE_MODE_AUTO; |
| _params.metering_mode = XCAM_AE_METERING_MODE_AUTO; |
| _params.flicker_mode = XCAM_AE_FLICKER_MODE_AUTO; |
| _params.speed = 1.0; |
| _params.exposure_time_min = UINT64_C(0); |
| _params.exposure_time_max = UINT64_C(0); |
| _params.max_analog_gain = 0.0; |
| _params.manual_exposure_time = UINT64_C (0); |
| _params.manual_analog_gain = 0.0; |
| _params.aperture_fn = 0.0; |
| _params.ev_shift = 0.0; |
| |
| _params.window.x_start = 0; |
| _params.window.y_start = 0; |
| _params.window.x_end = 0; |
| _params.window.y_end = 0; |
| _params.window.weight = 0; |
| |
| xcam_mem_clear (_params.window_list); |
| } |
| |
| bool |
| AeHandler::set_mode (XCamAeMode mode) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.mode = mode; |
| |
| XCAM_LOG_DEBUG ("ae set mode [%d]", mode); |
| return true; |
| } |
| |
| bool |
| AeHandler::set_metering_mode (XCamAeMeteringMode mode) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.metering_mode = mode; |
| |
| XCAM_LOG_DEBUG ("ae set metering mode [%d]", mode); |
| return true; |
| } |
| |
| bool |
| AeHandler::set_window (XCam3AWindow *window) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.window = *window; |
| |
| XCAM_LOG_DEBUG ("ae set metering mode window [x:%d, y:%d, x_end:%d, y_end:%d, weight:%d]", |
| window->x_start, |
| window->y_start, |
| window->x_end, |
| window->y_end, |
| window->weight); |
| return true; |
| } |
| |
| bool |
| AeHandler::set_window (XCam3AWindow *window, uint8_t count) |
| { |
| if (0 == count) { |
| XCAM_LOG_WARNING ("invalid input parameter, window count = %d, reset to default value", count); |
| XCam3AWindow defaultWindow = {0, 0, 1000, 1000, 15}; |
| set_window(&defaultWindow); |
| _params.window_list[0] = defaultWindow; |
| return true; |
| } |
| |
| if (XCAM_AE_MAX_METERING_WINDOW_COUNT < count) { |
| XCAM_LOG_WARNING ("invalid input parameter, window count = %d, reset count to maximum", count); |
| count = XCAM_AE_MAX_METERING_WINDOW_COUNT; |
| } |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| |
| _params.window = *window; |
| |
| for (int i = 0; i < count; i++) { |
| XCAM_LOG_DEBUG ("window start point(%d, %d), end point(%d, %d), weight = %d", |
| window[i].x_start, window[i].y_start, window[i].x_end, window[i].y_end, window[i].weight); |
| |
| _params.window_list[i] = window[i]; |
| if (_params.window.weight < window[i].weight) { |
| _params.window.weight = window[i].weight; |
| _params.window.x_start = window[i].x_start; |
| _params.window.y_start = window[i].y_start; |
| _params.window.x_end = window[i].x_end; |
| _params.window.y_end = window[i].y_end; |
| } |
| } |
| |
| XCAM_LOG_DEBUG ("ae set metering mode window [x:%d, y:%d, x_end:%d, y_end:%d, weight:%d]", |
| _params.window.x_start, |
| _params.window.y_start, |
| _params.window.x_end, |
| _params.window.y_end, |
| _params.window.weight); |
| |
| return true; |
| } |
| |
| bool |
| AeHandler::set_ev_shift (double ev_shift) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.ev_shift = ev_shift; |
| |
| XCAM_LOG_DEBUG ("ae set ev shift:%.03f", ev_shift); |
| return true; |
| } |
| |
| bool |
| AeHandler::set_speed (double speed) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.speed = speed; |
| |
| XCAM_LOG_DEBUG ("ae set speed:%.03f", speed); |
| return true; |
| } |
| |
| bool |
| AeHandler::set_flicker_mode (XCamFlickerMode flicker) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.flicker_mode = flicker; |
| |
| XCAM_LOG_DEBUG ("ae set flicker:%d", flicker); |
| return true; |
| } |
| |
| XCamFlickerMode |
| AeHandler::get_flicker_mode () |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| return _params.flicker_mode; |
| } |
| |
| int64_t |
| AeHandler::get_current_exposure_time () |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| if (_params.mode == XCAM_AE_MODE_MANUAL) |
| return _params.manual_exposure_time; |
| return INT64_C(-1); |
| } |
| |
| double |
| AeHandler::get_current_analog_gain () |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| if (_params.mode == XCAM_AE_MODE_MANUAL) |
| return _params.manual_analog_gain; |
| return 0.0; |
| } |
| |
| bool |
| AeHandler::set_manual_exposure_time (int64_t time_in_us) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.manual_exposure_time = time_in_us; |
| |
| XCAM_LOG_DEBUG ("ae set manual exposure time: %" PRId64 "us", time_in_us); |
| return true; |
| } |
| |
| bool |
| AeHandler::set_manual_analog_gain (double gain) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.manual_analog_gain = gain; |
| |
| XCAM_LOG_DEBUG ("ae set manual analog gain: %.03f", gain); |
| return true; |
| } |
| |
| bool |
| AeHandler::set_aperture (double fn) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.aperture_fn = fn; |
| |
| XCAM_LOG_DEBUG ("ae set aperture fn: %.03f", fn); |
| return true; |
| } |
| |
| bool |
| AeHandler::set_max_analog_gain (double max_gain) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.max_analog_gain = max_gain; |
| |
| XCAM_LOG_DEBUG ("ae set max analog_gain: %.03f", max_gain); |
| return true; |
| } |
| |
| double AeHandler::get_max_analog_gain () |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| return _params.max_analog_gain; |
| } |
| |
| bool AeHandler::set_exposure_time_range (int64_t min_time_in_us, int64_t max_time_in_us) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.exposure_time_min = min_time_in_us; |
| _params.exposure_time_max = max_time_in_us; |
| |
| XCAM_LOG_DEBUG ("ae set exposrue range[%" PRId64 "us, %" PRId64 "us]", min_time_in_us, max_time_in_us); |
| return true; |
| } |
| |
| bool |
| AeHandler::update_parameters (const XCamAeParam ¶ms) |
| { |
| { |
| AnalyzerHandler::HandlerLock lock (this); |
| _params = params; |
| } |
| XCAM_LOG_DEBUG ("ae parameters updated"); |
| return true; |
| } |
| |
| bool |
| AeHandler::get_exposure_time_range (int64_t *min_time_in_us, int64_t *max_time_in_us) |
| { |
| XCAM_ASSERT (min_time_in_us && max_time_in_us); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| *min_time_in_us = _params.exposure_time_min; |
| *max_time_in_us = _params.exposure_time_max; |
| |
| return true; |
| } |
| |
| AwbHandler::AwbHandler() |
| { |
| reset_parameters (); |
| } |
| |
| void |
| AwbHandler::reset_parameters () |
| { |
| xcam_mem_clear (_params); |
| _params.mode = XCAM_AWB_MODE_AUTO; |
| _params.speed = 1.0; |
| _params.cct_min = 0; |
| _params.cct_max = 0; |
| _params.gr_gain = 0.0; |
| _params.r_gain = 0.0; |
| _params.b_gain = 0.0; |
| _params.gb_gain = 0.0; |
| |
| _params.window.x_start = 0; |
| _params.window.y_start = 0; |
| _params.window.x_end = 0; |
| _params.window.y_end = 0; |
| _params.window.weight = 0; |
| } |
| |
| bool |
| AwbHandler::set_mode (XCamAwbMode mode) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.mode = mode; |
| |
| XCAM_LOG_DEBUG ("awb set mode [%d]", mode); |
| return true; |
| } |
| |
| bool |
| AwbHandler::set_speed (double speed) |
| { |
| XCAM_FAIL_RETURN ( |
| ERROR, |
| (0.0 < speed) && (speed <= 1.0), |
| false, |
| "awb speed(%f) is out of range, suggest (0.0, 1.0]", speed); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.speed = speed; |
| |
| XCAM_LOG_DEBUG ("awb set speed [%f]", speed); |
| return true; |
| } |
| |
| bool |
| AwbHandler::set_color_temperature_range (uint32_t cct_min, uint32_t cct_max) |
| { |
| XCAM_FAIL_RETURN ( |
| ERROR, |
| (cct_min <= cct_max), |
| false, |
| "awb set wrong cct(%u, %u) parameters", cct_min, cct_max); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.cct_min = cct_min; |
| _params.cct_max = cct_max; |
| |
| XCAM_LOG_DEBUG ("awb set cct range [%u, %u]", cct_min, cct_max); |
| return true; |
| } |
| |
| bool |
| AwbHandler::set_manual_gain (double gr, double r, double b, double gb) |
| { |
| XCAM_FAIL_RETURN ( |
| ERROR, |
| gr >= 0.0 && r >= 0.0 && b >= 0.0 && gb >= 0.0, |
| false, |
| "awb manual gain value must >= 0.0"); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.gr_gain = gr; |
| _params.r_gain = r; |
| _params.b_gain = b; |
| _params.gb_gain = gb; |
| XCAM_LOG_DEBUG ("awb set manual gain value(gr:%.03f, r:%.03f, b:%.03f, gb:%.03f)", gr, r, b, gb); |
| return true; |
| } |
| |
| bool |
| AwbHandler::update_parameters (const XCamAwbParam ¶ms) |
| { |
| { |
| AnalyzerHandler::HandlerLock lock (this); |
| _params = params; |
| } |
| XCAM_LOG_DEBUG ("awb parameters updated"); |
| return true; |
| } |
| |
| uint32_t |
| AwbHandler::get_current_estimate_cct () |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| if (_params.mode == XCAM_AWB_MODE_MANUAL) |
| return (_params.cct_max + _params.cct_min) / 2; |
| return 0.0; |
| } |
| |
| bool |
| AfHandler::update_parameters (const XCamAfParam ¶ms) |
| { |
| { |
| AnalyzerHandler::HandlerLock lock (this); |
| _params = params; |
| } |
| XCAM_LOG_DEBUG ("af parameters updated"); |
| return true; |
| } |
| |
| CommonHandler::CommonHandler() |
| { |
| reset_parameters (); |
| } |
| |
| void |
| CommonHandler::reset_parameters () |
| { |
| xcam_mem_clear (_params); |
| |
| _params.is_manual_gamma = false; |
| _params.nr_level = 0.0; |
| _params.tnr_level = 0.0; |
| _params.brightness = 0.0; |
| _params.contrast = 0.0; |
| _params.hue = 0.0; |
| _params.saturation = 0.0; |
| _params.sharpness = 0.0; |
| _params.enable_dvs = false; |
| _params.enable_gbce = false; |
| _params.enable_night_mode = false; |
| } |
| |
| bool CommonHandler::set_dvs (bool enable) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.enable_dvs = enable; |
| |
| XCAM_LOG_DEBUG ("common 3A enable dvs:%s", XCAM_BOOL2STR(enable)); |
| return true; |
| } |
| |
| bool |
| CommonHandler::set_gbce (bool enable) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.enable_gbce = enable; |
| |
| XCAM_LOG_DEBUG ("common 3A enable gbce:%s", XCAM_BOOL2STR(enable)); |
| return true; |
| } |
| |
| bool |
| CommonHandler::set_night_mode (bool enable) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.enable_night_mode = enable; |
| |
| XCAM_LOG_DEBUG ("common 3A enable night mode:%s", XCAM_BOOL2STR(enable)); |
| return true; |
| } |
| |
| /* Picture quality */ |
| bool |
| CommonHandler::set_noise_reduction_level (double level) |
| { |
| XCAM_FAIL_RETURN ( |
| ERROR, |
| level >= -1.0 && level < 1.0, |
| false, |
| "set NR levlel(%.03f) out of range[-1.0, 1.0]", level); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.nr_level = level; |
| |
| XCAM_LOG_DEBUG ("common 3A set NR level:%.03f", level); |
| return true; |
| } |
| |
| bool |
| CommonHandler::set_temporal_noise_reduction_level (double level) |
| { |
| XCAM_FAIL_RETURN ( |
| ERROR, |
| level >= -1.0 && level < 1.0, |
| false, |
| "set TNR levlel(%.03f) out of range[-1.0, 1.0]", level); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.tnr_level = level; |
| |
| XCAM_LOG_DEBUG ("common 3A set TNR level:%.03f", level); |
| return true; |
| } |
| |
| bool |
| CommonHandler::set_manual_brightness (double level) |
| { |
| XCAM_FAIL_RETURN ( |
| ERROR, |
| level >= -1.0 && level < 1.0, |
| false, |
| "set brightness levlel(%.03f) out of range[-1.0, 1.0]", level); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.brightness = level; |
| |
| XCAM_LOG_DEBUG ("common 3A set brightness level:%.03f", level); |
| return true; |
| } |
| |
| bool CommonHandler::set_manual_contrast (double level) |
| { |
| XCAM_FAIL_RETURN ( |
| ERROR, |
| level >= -1.0 && level < 1.0, |
| false, |
| "set contrast levlel(%.03f) out of range[-1.0, 1.0]", level); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.contrast = level; |
| |
| XCAM_LOG_DEBUG ("common 3A set contrast level:%.03f", level); |
| return true; |
| } |
| |
| bool CommonHandler::set_manual_hue (double level) |
| { |
| XCAM_FAIL_RETURN ( |
| ERROR, |
| level >= -1.0 && level < 1.0, |
| false, |
| "set hue levlel(%.03f) out of range[-1.0, 1.0]", level); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.hue = level; |
| |
| XCAM_LOG_DEBUG ("common 3A set hue level:%.03f", level); |
| return true; |
| } |
| |
| bool |
| CommonHandler::set_manual_saturation (double level) |
| { |
| XCAM_FAIL_RETURN ( |
| ERROR, |
| level >= -1.0 && level < 1.0, |
| false, |
| "set saturation levlel(%.03f) out of range[-1.0, 1.0]", level); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.saturation = level; |
| |
| XCAM_LOG_DEBUG ("common 3A set saturation level:%.03f", level); |
| return true; |
| } |
| |
| bool CommonHandler::set_manual_sharpness (double level) |
| { |
| XCAM_FAIL_RETURN ( |
| ERROR, |
| level >= -1.0 && level < 1.0, |
| false, |
| "set sharpness levlel(%.03f) out of range[-1.0, 1.0]", level); |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| _params.sharpness = level; |
| |
| XCAM_LOG_DEBUG ("common 3A set sharpness level:%.03f", level); |
| return true; |
| } |
| |
| bool |
| CommonHandler::set_gamma_table (double *r_table, double *g_table, double *b_table) |
| { |
| AnalyzerHandler::HandlerLock lock(this); |
| if (!r_table && ! g_table && !b_table) { |
| _params.is_manual_gamma = false; |
| XCAM_LOG_DEBUG ("common 3A disabled gamma"); |
| return true; |
| } |
| |
| if (!r_table || !g_table || !b_table) { |
| XCAM_LOG_ERROR ("common 3A gamma table parameters wrong"); |
| return false; |
| } |
| |
| for (uint32_t i = 0; i < XCAM_GAMMA_TABLE_SIZE; ++i) { |
| _params.r_gamma [i] = r_table [i]; |
| _params.g_gamma [i] = g_table [i]; |
| _params.b_gamma [i] = b_table [i]; |
| } |
| _params.is_manual_gamma = true; |
| |
| XCAM_LOG_DEBUG ("common 3A enabled RGB gamma"); |
| return true; |
| } |
| |
| bool |
| CommonHandler::set_color_effect (XCamColorEffect effect) |
| { |
| // TODO validate the input |
| |
| AnalyzerHandler::HandlerLock lock(this); |
| |
| _params.color_effect = effect; |
| |
| XCAM_LOG_DEBUG ("common 3A set color effect"); |
| return true; |
| } |
| |
| bool |
| CommonHandler::update_parameters (const XCamCommonParam ¶ms) |
| { |
| { |
| AnalyzerHandler::HandlerLock lock (this); |
| _params = params; |
| } |
| XCAM_LOG_DEBUG ("common parameters updated"); |
| return true; |
| } |
| |
| }; |