blob: d370579f28702c56c2aa09485454910d4be0d9af [file] [log] [blame]
Wind Yuan75564b12015-01-15 06:51:15 -05001/*
2 * isp_config_translator.cpp - isp config translator
3 *
4 * Copyright (c) 2014-2015 Intel Corporation
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 * Author: Wind Yuan <feng.yuan@intel.com>
19 */
20
21#include "isp_config_translator.h"
22#include <math.h>
23
24namespace XCam {
25
26static uint32_t
27_get_max_bits (double value)
28{
29 uint32_t max_int = 0;
30 uint32_t interger_bits = 0;
31
32 max_int = (uint32_t)value;
33 while (max_int) {
34 ++interger_bits;
35 max_int = (max_int >> 1);
36 }
37 return interger_bits;
38}
39
40IspConfigTranslator::IspConfigTranslator (SmartPtr<SensorDescriptor> &sensor)
41 : _sensor (sensor)
42{
43 XCAM_ASSERT (_sensor.ptr());
44}
45
46IspConfigTranslator::~IspConfigTranslator ()
47{
48}
49
50XCamReturn
51IspConfigTranslator::translate_white_balance (
52 const XCam3aResultWhiteBalance &from,
53 struct atomisp_wb_config &to)
54{
55 uint32_t interger_bits = 0;
56 double multiplier = 0.0;
57 double max_gain = XCAM_MAX (from.b_gain, from.r_gain);
58 max_gain = XCAM_MAX (max_gain, from.gr_gain);
59 max_gain = XCAM_MAX (max_gain, from.gb_gain);
60
61 interger_bits = _get_max_bits (max_gain);
62 multiplier = (double)(1 << (16 - interger_bits));
63 to.integer_bits = interger_bits;
64 to.gr = (uint32_t)(from.gr_gain * multiplier + 0.5);
65 to.r = (uint32_t)(from.r_gain * multiplier + 0.5);
66 to.b = (uint32_t)(from.b_gain * multiplier + 0.5);
67 to.gb = (uint32_t)(from.gb_gain * multiplier + 0.5);
68
69 return XCAM_RETURN_NO_ERROR;
70}
71
72XCamReturn
73IspConfigTranslator::translate_black_level (
74 const XCam3aResultBlackLevel &from, struct atomisp_ob_config &to)
75{
76 double multiplier = (double)(1 << 16);
77
78 to.mode = atomisp_ob_mode_fixed;
79 to.level_gr = (uint32_t)(from.gr_level * multiplier + 0.5);
80 to.level_r = (uint32_t)(from.r_level * multiplier + 0.5);
81 to.level_b = (uint32_t)(from.b_level * multiplier + 0.5);
82 to.level_gb = (uint32_t)(from.gb_level * multiplier + 0.5);
83
84 return XCAM_RETURN_NO_ERROR;
85}
86
87XCamReturn
88IspConfigTranslator::translate_color_matrix (
89 const XCam3aResultColorMatrix &from, struct atomisp_cc_config &to)
90{
91 double max_value = 0.0;
92 uint32_t interger_bits = 0;
93 double multiplier = 0.0;
94 bool have_minus = false;
95 uint32_t i = 0;
96
97 for (i = 0; i < XCAM_COLOR_MATRIX_SIZE; ++i) {
98 if (fabs(from.matrix [i]) > max_value)
99 max_value = fabs(from.matrix [i]);
100 if (from.matrix [i] < 0)
101 have_minus = true;
102 }
103 interger_bits = _get_max_bits (max_value);
104 if (have_minus)
105 ++interger_bits;
106
107 XCAM_ASSERT (interger_bits < 13);
108 to.fraction_bits = 13 - interger_bits;
109 multiplier = (double)(1 << (13 - interger_bits));
110 for (i = 0; i < XCAM_COLOR_MATRIX_SIZE; ++i) {
111 to.matrix[i] = (int32_t)(from.matrix [i] * multiplier);
112 }
113 return XCAM_RETURN_NO_ERROR;
114}
115
116
117XCamReturn
118IspConfigTranslator::translate_exposure (
119 const XCam3aResultExposure &from,
120 struct atomisp_exposure &to)
121{
122 uint32_t coarse_time = 0, fine_time = 0;
123 int32_t analog_code = 0, digital_code = 0;
124 if (!_sensor->is_ready ()) {
125 XCAM_LOG_WARNING ("translate exposure failed since sensor not ready");
126 return XCAM_RETURN_ERROR_SENSOR;
127 }
128 if (!_sensor->exposure_time_to_integration (from.exposure_time, coarse_time, fine_time)) {
129 XCAM_LOG_WARNING ("translate exposure time failed");
130 return XCAM_RETURN_ERROR_SENSOR;
131 }
132 to.integration_time[0] = coarse_time;
133 to.integration_time[1] = fine_time;
134
135 if (!_sensor->exposure_gain_to_code (from.analog_gain, from.digital_gain, analog_code, digital_code)) {
136 XCAM_LOG_WARNING ("translate exposure gain failed");
137 return XCAM_RETURN_ERROR_SENSOR;
138 }
139 to.gain[0] = analog_code;
140 to.gain[1] = digital_code;
141 return XCAM_RETURN_NO_ERROR;
142}
143
144};