1 /*
2 * x3a_isp_config.h - 3A ISP config
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 "x3a_isp_config.h"
22 #include "isp_config_translator.h"
23
24 namespace XCam {
25
clear()26 void AtomIspConfigContent::clear ()
27 {
28 memset (this, 0, sizeof (AtomIspConfigContent));
29 }
30
31 void
copy(const struct atomisp_parameters & config)32 AtomIspConfigContent::copy (const struct atomisp_parameters &config)
33 {
34 xcam_mem_clear (isp_config);
35 if (config.wb_config) {
36 wb = *config.wb_config;
37 isp_config.wb_config = &wb;
38 }
39 if (config.cc_config) {
40 cc = *config.cc_config;
41 isp_config.cc_config = &cc;
42 }
43 if (config.tnr_config) {
44 tnr = *config.tnr_config;
45 isp_config.tnr_config = &tnr;
46 }
47 if (config.ecd_config) {
48 ecd_config = *config.ecd_config;
49 isp_config.ecd_config = &ecd_config;
50 }
51 if (config.ynr_config) {
52 ynr = *config.ynr_config;
53 isp_config.ynr_config = &ynr;
54 }
55 if (config.fc_config) {
56 fc_config = *config.fc_config;
57 isp_config.fc_config = &fc_config;
58 }
59 if (config.cnr_config) {
60 cnr = *config.cnr_config;
61 isp_config.cnr_config = &cnr;
62 }
63 if (config.macc_config) {
64 macc_config = *config.macc_config;
65 isp_config.macc_config = &macc_config;
66 }
67 if (config.ctc_config) {
68 ctc_config = *config.ctc_config;
69 isp_config.ctc_config = &ctc_config;
70 }
71 if (config.formats_config) {
72 formats = *config.formats_config;
73 isp_config.formats_config = &formats;
74 }
75 if (config.aa_config) {
76 aa = *config.aa_config;
77 isp_config.aa_config = &aa;
78 }
79 if (config.baa_config) {
80 baa = *config.baa_config;
81 isp_config.baa_config = &baa;
82 }
83 if (config.ce_config) {
84 ce = *config.ce_config;
85 isp_config.ce_config = &ce;
86 }
87 if (config.dvs_6axis_config) {
88 dvs_6axis = *config.dvs_6axis_config;
89 isp_config.dvs_6axis_config = &dvs_6axis;
90 }
91 if (config.ob_config) {
92 ob = *config.ob_config;
93 isp_config.ob_config = &ob;
94 }
95 if (config.nr_config) {
96 nr = *config.nr_config;
97 isp_config.nr_config = &nr;
98 }
99 if (config.dp_config) {
100 dp = *config.dp_config;
101 isp_config.dp_config = &dp;
102 }
103 if (config.ee_config) {
104 ee = *config.ee_config;
105 isp_config.ee_config = ⅇ
106 }
107 if (config.de_config) {
108 de = *config.de_config;
109 isp_config.de_config = &de;
110 }
111 if (config.ctc_table) {
112 ctc_table = *config.ctc_table;
113 isp_config.ctc_table = &ctc_table;
114 }
115 if (config.gc_config) {
116 gc_config = *config.gc_config;
117 isp_config.gc_config = &gc_config;
118 }
119 if (config.anr_config) {
120 anr = *config.anr_config;
121 isp_config.anr_config = &anr;
122 }
123 if (config.a3a_config) {
124 a3a = *config.a3a_config;
125 isp_config.a3a_config = &a3a;
126 }
127 if (config.xnr_config) {
128 xnr = *config.xnr_config;
129 isp_config.xnr_config = &xnr;
130 }
131 if (config.dz_config) {
132 dz_config = *config.dz_config;
133 isp_config.dz_config = &dz_config;
134 }
135 if (config.yuv2rgb_cc_config) {
136 yuv2rgb_cc = *config.yuv2rgb_cc_config;
137 isp_config.yuv2rgb_cc_config = &yuv2rgb_cc;
138 }
139 if (config.rgb2yuv_cc_config) {
140 rgb2yuv_cc = *config.rgb2yuv_cc_config;
141 isp_config.rgb2yuv_cc_config = &rgb2yuv_cc;
142 }
143 if (config.macc_table) {
144 macc_table = *config.macc_table;
145 isp_config.macc_table = &macc_table;
146 }
147 if (config.gamma_table) {
148 gamma_table = *config.gamma_table;
149 isp_config.gamma_table = &gamma_table;
150 }
151 if (config.r_gamma_table) {
152 r_gamma_table = *config.r_gamma_table;
153 isp_config.r_gamma_table = &r_gamma_table;
154 }
155 if (config.g_gamma_table) {
156 g_gamma_table = *config.g_gamma_table;
157 isp_config.g_gamma_table = &g_gamma_table;
158 }
159 if (config.b_gamma_table) {
160 b_gamma_table = *config.b_gamma_table;
161 isp_config.b_gamma_table = &b_gamma_table;
162 }
163 if (config.shading_table) {
164 shading_table = *config.shading_table;
165 isp_config.shading_table = &shading_table;
166 }
167 if (config.morph_table) {
168 morph_table = *config.morph_table;
169 isp_config.morph_table = &morph_table;
170 }
171 if (config.xnr_table) {
172 xnr_table = *config.xnr_table;
173 isp_config.xnr_table = &xnr_table;
174 }
175 if (config.anr_thres) {
176 anr_thres = *config.anr_thres;
177 isp_config.anr_thres = &anr_thres;
178 }
179 if (config.motion_vector) {
180 motion_vector = *config.motion_vector;
181 isp_config.motion_vector = &motion_vector;
182 }
183 }
184
X3aIspConfig()185 X3aIspConfig::X3aIspConfig ()
186 {
187 }
188
~X3aIspConfig()189 X3aIspConfig::~X3aIspConfig()
190 {
191 clear ();
192 }
193
194
clear()195 bool X3aIspConfig::clear()
196 {
197 _isp_content.clear ();
198 _3a_results.clear ();
199 return true;
200 }
201
202 bool
attach(SmartPtr<X3aResult> & result,IspConfigTranslator * translator)203 X3aIspConfig::attach (SmartPtr<X3aResult> &result, IspConfigTranslator *translator)
204 {
205 if (result.ptr() == NULL)
206 return false;
207
208 uint32_t type = result->get_type ();
209
210 XCAM_ASSERT (translator);
211
212 if (!result.ptr() || !result->get_ptr ()) {
213 XCAM_LOG_ERROR ("3A result empty");
214 return false;
215 }
216 switch (type) {
217 case X3aIspConfig::IspAllParameters: {
218 SmartPtr<X3aAtomIspParametersResult> isp_3a =
219 result.dynamic_cast_ptr<X3aAtomIspParametersResult> ();
220 XCAM_ASSERT (isp_3a.ptr ());
221 _isp_content.copy (isp_3a->get_isp_config());
222 }
223 break;
224
225 case XCAM_3A_RESULT_WHITE_BALANCE: {
226 struct atomisp_wb_config wb;
227 SmartPtr<X3aWhiteBalanceResult> wb_res =
228 result.dynamic_cast_ptr<X3aWhiteBalanceResult> ();
229 XCAM_ASSERT (wb_res.ptr ());
230 xcam_mem_clear (wb);
231 if (translator->translate_white_balance (wb_res->get_standard_result(), wb)
232 != XCAM_RETURN_NO_ERROR) {
233 XCAM_LOG_WARNING ("translate white balance failed");
234 return false;
235 }
236 _isp_content.wb = wb;
237 _isp_content.isp_config.wb_config = &_isp_content.wb;
238 }
239 break;
240 case XCAM_3A_RESULT_BLACK_LEVEL: {
241 struct atomisp_ob_config ob;
242 SmartPtr<X3aBlackLevelResult> bl_res =
243 result.dynamic_cast_ptr<X3aBlackLevelResult> ();
244 XCAM_ASSERT (bl_res.ptr ());
245 xcam_mem_clear (ob);
246 if (translator->translate_black_level (bl_res->get_standard_result(), ob)
247 != XCAM_RETURN_NO_ERROR) {
248 XCAM_LOG_WARNING ("translate black level failed");
249 return false;
250 }
251 _isp_content.ob = ob;
252 _isp_content.isp_config.ob_config = &_isp_content.ob;
253 }
254 break;
255 case XCAM_3A_RESULT_YUV2RGB_MATRIX:
256 case XCAM_3A_RESULT_RGB2YUV_MATRIX:
257 {
258 struct atomisp_cc_config cc;
259 SmartPtr<X3aColorMatrixResult> cc_res =
260 result.dynamic_cast_ptr<X3aColorMatrixResult> ();
261 XCAM_ASSERT (cc_res.ptr ());
262 xcam_mem_clear (cc);
263 if (translator->translate_color_matrix (cc_res->get_standard_result(), cc)
264 != XCAM_RETURN_NO_ERROR) {
265 XCAM_LOG_WARNING ("translate color matrix failed");
266 return false;
267 }
268 if (type == XCAM_3A_RESULT_YUV2RGB_MATRIX) {
269 _isp_content.yuv2rgb_cc = cc;
270 _isp_content.isp_config.yuv2rgb_cc_config = &_isp_content.yuv2rgb_cc;
271 } else {
272 _isp_content.rgb2yuv_cc = cc;
273 _isp_content.isp_config.rgb2yuv_cc_config = &_isp_content.rgb2yuv_cc;
274 }
275 }
276 break;
277 default:
278 return false;
279 }
280
281 _3a_results.push_back (result);
282 return true;
283 }
284
285 };
286
287