• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 = &ee;
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