diff options
Diffstat (limited to 'modules/isp/isp_config_translator.cpp')
-rw-r--r-- | modules/isp/isp_config_translator.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/modules/isp/isp_config_translator.cpp b/modules/isp/isp_config_translator.cpp new file mode 100644 index 0000000..d370579 --- /dev/null +++ b/modules/isp/isp_config_translator.cpp @@ -0,0 +1,144 @@ +/* + * isp_config_translator.cpp - isp config translator + * + * 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 <feng.yuan@intel.com> + */ + +#include "isp_config_translator.h" +#include <math.h> + +namespace XCam { + +static uint32_t +_get_max_bits (double value) +{ + uint32_t max_int = 0; + uint32_t interger_bits = 0; + + max_int = (uint32_t)value; + while (max_int) { + ++interger_bits; + max_int = (max_int >> 1); + } + return interger_bits; +} + +IspConfigTranslator::IspConfigTranslator (SmartPtr<SensorDescriptor> &sensor) + : _sensor (sensor) +{ + XCAM_ASSERT (_sensor.ptr()); +} + +IspConfigTranslator::~IspConfigTranslator () +{ +} + +XCamReturn +IspConfigTranslator::translate_white_balance ( + const XCam3aResultWhiteBalance &from, + struct atomisp_wb_config &to) +{ + uint32_t interger_bits = 0; + double multiplier = 0.0; + double max_gain = XCAM_MAX (from.b_gain, from.r_gain); + max_gain = XCAM_MAX (max_gain, from.gr_gain); + max_gain = XCAM_MAX (max_gain, from.gb_gain); + + interger_bits = _get_max_bits (max_gain); + multiplier = (double)(1 << (16 - interger_bits)); + to.integer_bits = interger_bits; + to.gr = (uint32_t)(from.gr_gain * multiplier + 0.5); + to.r = (uint32_t)(from.r_gain * multiplier + 0.5); + to.b = (uint32_t)(from.b_gain * multiplier + 0.5); + to.gb = (uint32_t)(from.gb_gain * multiplier + 0.5); + + return XCAM_RETURN_NO_ERROR; +} + +XCamReturn +IspConfigTranslator::translate_black_level ( + const XCam3aResultBlackLevel &from, struct atomisp_ob_config &to) +{ + double multiplier = (double)(1 << 16); + + to.mode = atomisp_ob_mode_fixed; + to.level_gr = (uint32_t)(from.gr_level * multiplier + 0.5); + to.level_r = (uint32_t)(from.r_level * multiplier + 0.5); + to.level_b = (uint32_t)(from.b_level * multiplier + 0.5); + to.level_gb = (uint32_t)(from.gb_level * multiplier + 0.5); + + return XCAM_RETURN_NO_ERROR; +} + +XCamReturn +IspConfigTranslator::translate_color_matrix ( + const XCam3aResultColorMatrix &from, struct atomisp_cc_config &to) +{ + double max_value = 0.0; + uint32_t interger_bits = 0; + double multiplier = 0.0; + bool have_minus = false; + uint32_t i = 0; + + for (i = 0; i < XCAM_COLOR_MATRIX_SIZE; ++i) { + if (fabs(from.matrix [i]) > max_value) + max_value = fabs(from.matrix [i]); + if (from.matrix [i] < 0) + have_minus = true; + } + interger_bits = _get_max_bits (max_value); + if (have_minus) + ++interger_bits; + + XCAM_ASSERT (interger_bits < 13); + to.fraction_bits = 13 - interger_bits; + multiplier = (double)(1 << (13 - interger_bits)); + for (i = 0; i < XCAM_COLOR_MATRIX_SIZE; ++i) { + to.matrix[i] = (int32_t)(from.matrix [i] * multiplier); + } + return XCAM_RETURN_NO_ERROR; +} + + +XCamReturn +IspConfigTranslator::translate_exposure ( + const XCam3aResultExposure &from, + struct atomisp_exposure &to) +{ + uint32_t coarse_time = 0, fine_time = 0; + int32_t analog_code = 0, digital_code = 0; + if (!_sensor->is_ready ()) { + XCAM_LOG_WARNING ("translate exposure failed since sensor not ready"); + return XCAM_RETURN_ERROR_SENSOR; + } + if (!_sensor->exposure_time_to_integration (from.exposure_time, coarse_time, fine_time)) { + XCAM_LOG_WARNING ("translate exposure time failed"); + return XCAM_RETURN_ERROR_SENSOR; + } + to.integration_time[0] = coarse_time; + to.integration_time[1] = fine_time; + + if (!_sensor->exposure_gain_to_code (from.analog_gain, from.digital_gain, analog_code, digital_code)) { + XCAM_LOG_WARNING ("translate exposure gain failed"); + return XCAM_RETURN_ERROR_SENSOR; + } + to.gain[0] = analog_code; + to.gain[1] = digital_code; + return XCAM_RETURN_NO_ERROR; +} + +}; |