1 /*
2 * x3a_analyzer_aiq.h - 3a analyzer from AIQ
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_analyzer_aiq.h"
22 #include "aiq_handler.h"
23 #include "isp_controller.h"
24 #include "xcam_cpf_reader.h"
25 #include "ia_types.h"
26
27 namespace XCam {
28
29 class CpfReader {
30 public:
31 explicit CpfReader (const char *name);
32 ~CpfReader();
33 bool read (ia_binary_data &binary);
34 private:
35 XCAM_DEAD_COPY (CpfReader);
36
37 private:
38 XCamCpfBlob *_aiq_cpf;
39 char *_name;
40 };
41
CpfReader(const char * name)42 CpfReader::CpfReader (const char *name)
43 : _name (strndup(name, XCAM_MAX_STR_SIZE))
44 {
45 _aiq_cpf = xcam_cpf_blob_new ();
46 XCAM_ASSERT (name);
47 }
~CpfReader()48 CpfReader::~CpfReader()
49 {
50 if (_aiq_cpf)
51 xcam_cpf_blob_free (_aiq_cpf);
52 if (_name)
53 xcam_free (_name);
54 }
55
read(ia_binary_data & binary)56 bool CpfReader::read (ia_binary_data &binary)
57 {
58 if (!xcam_cpf_read (_name, _aiq_cpf, NULL)) {
59 XCAM_LOG_ERROR ("parse CPF(%s) failed", XCAM_STR (_name));
60 return false;
61 }
62 binary.data = _aiq_cpf->data;
63 binary.size = _aiq_cpf->size;
64 XCAM_LOG_INFO ("read cpf(%s) ok", XCAM_STR (_name));
65 return true;
66 }
67
X3aAnalyzerAiq(SmartPtr<IspController> & isp,const char * cpf_path)68 X3aAnalyzerAiq::X3aAnalyzerAiq (SmartPtr<IspController> &isp, const char *cpf_path)
69 : X3aAnalyzer ("X3aAnalyzerAiq")
70 , _isp (isp)
71 , _sensor_data_ready (false)
72 , _cpf_path (NULL)
73 {
74 if (cpf_path)
75 _cpf_path = strndup (cpf_path, XCAM_MAX_STR_SIZE);
76
77 _aiq_compositor = new AiqCompositor ();
78 XCAM_ASSERT (_aiq_compositor.ptr());
79 xcam_mem_clear (_sensor_mode_data);
80
81 XCAM_LOG_DEBUG ("X3aAnalyzerAiq constructed");
82 }
83
X3aAnalyzerAiq(struct atomisp_sensor_mode_data & sensor_data,const char * cpf_path)84 X3aAnalyzerAiq::X3aAnalyzerAiq (struct atomisp_sensor_mode_data &sensor_data, const char *cpf_path)
85 : X3aAnalyzer ("X3aAnalyzerAiq")
86 , _sensor_mode_data (sensor_data)
87 , _sensor_data_ready (true)
88 , _cpf_path (NULL)
89 {
90 if (cpf_path)
91 _cpf_path = strndup (cpf_path, XCAM_MAX_STR_SIZE);
92
93 _aiq_compositor = new AiqCompositor ();
94 XCAM_ASSERT (_aiq_compositor.ptr());
95
96 XCAM_LOG_DEBUG ("X3aAnalyzerAiq constructed");
97 }
98
~X3aAnalyzerAiq()99 X3aAnalyzerAiq::~X3aAnalyzerAiq()
100 {
101 if (_cpf_path)
102 xcam_free (_cpf_path);
103
104 XCAM_LOG_DEBUG ("~X3aAnalyzerAiq destructed");
105 }
106
107 SmartPtr<AeHandler>
create_ae_handler()108 X3aAnalyzerAiq::create_ae_handler ()
109 {
110 SmartPtr<AiqAeHandler> ae_handler = new AiqAeHandler (_aiq_compositor);
111 _aiq_compositor->set_ae_handler (ae_handler);
112 return ae_handler;
113 }
114
115 SmartPtr<AwbHandler>
create_awb_handler()116 X3aAnalyzerAiq::create_awb_handler ()
117 {
118 SmartPtr<AiqAwbHandler> awb_handler = new AiqAwbHandler (_aiq_compositor);
119 _aiq_compositor->set_awb_handler (awb_handler);
120 return awb_handler;
121 }
122
123 SmartPtr<AfHandler>
create_af_handler()124 X3aAnalyzerAiq::create_af_handler ()
125 {
126
127 SmartPtr<AiqAfHandler> af_handler = new AiqAfHandler (_aiq_compositor);
128 _aiq_compositor->set_af_handler (af_handler);
129 return af_handler;
130 }
131
132 SmartPtr<CommonHandler>
create_common_handler()133 X3aAnalyzerAiq::create_common_handler ()
134 {
135 SmartPtr<AiqCommonHandler> common_handler = new AiqCommonHandler (_aiq_compositor);
136 _aiq_compositor->set_common_handler (common_handler);
137 return common_handler;
138 }
139
140 XCamReturn
internal_init(uint32_t width,uint32_t height,double framerate)141 X3aAnalyzerAiq::internal_init (uint32_t width, uint32_t height, double framerate)
142 {
143 XCAM_ASSERT (_cpf_path);
144 CpfReader reader (_cpf_path);
145 ia_binary_data binary;
146
147 XCAM_ASSERT (_aiq_compositor.ptr ());
148
149 _aiq_compositor->set_framerate (framerate);
150
151 xcam_mem_clear (binary);
152 XCAM_FAIL_RETURN (
153 ERROR,
154 reader.read(binary),
155 XCAM_RETURN_ERROR_AIQ,
156 "read cpf file(%s) failed", _cpf_path);
157
158 _aiq_compositor->set_size (width, height);
159 XCAM_FAIL_RETURN (
160 ERROR,
161 _aiq_compositor->open (binary),
162 XCAM_RETURN_ERROR_AIQ,
163 "AIQ open failed");
164
165 return XCAM_RETURN_NO_ERROR;
166 }
167
168 XCamReturn
internal_deinit()169 X3aAnalyzerAiq::internal_deinit ()
170 {
171 if (_aiq_compositor.ptr ())
172 _aiq_compositor->close ();
173
174 return XCAM_RETURN_NO_ERROR;
175 }
176
177 XCamReturn
configure_3a()178 X3aAnalyzerAiq::configure_3a ()
179 {
180 XCamReturn ret = XCAM_RETURN_NO_ERROR;
181 X3aResultList first_results;
182
183 if (!_sensor_data_ready) {
184 struct atomisp_sensor_mode_data sensor_mode_data;
185 xcam_mem_clear (sensor_mode_data);
186 XCAM_ASSERT (_isp.ptr());
187
188 ret = _isp->get_sensor_mode_data (sensor_mode_data);
189 XCAM_FAIL_RETURN (WARNING, ret == XCAM_RETURN_NO_ERROR, ret, "get sensor mode data failed");
190 _sensor_mode_data = sensor_mode_data;
191 _sensor_data_ready = true;
192 }
193
194 if (!_aiq_compositor->set_sensor_mode_data (&_sensor_mode_data)) {
195 XCAM_LOG_WARNING ("AIQ configure 3a failed");
196 return XCAM_RETURN_ERROR_AIQ;
197 }
198
199 XCAM_LOG_DEBUG ("X3aAnalyzerAiq got sensor mode data, coarse_time_min:%u, "
200 "coarse_time_max_margin:%u, "
201 "fine_time_min:%u, fine_time_max_margin:%u, "
202 "fine_time_def:%u, "
203 "frame_length_lines:%u, line_length_pck:%u, "
204 "vt_pix_clk_freq_mhz:%u, "
205 "crop_horizontal_start:%u, crop_vertical_start:%u, "
206 "crop_horizontal_end:%u, crop_vertical_end:%u, "
207 "output_width:%u, output_height:%u, "
208 "binning_factor_x:%u, binning_factor_y:%u",
209 _sensor_mode_data.coarse_integration_time_min,
210 _sensor_mode_data.coarse_integration_time_max_margin,
211 _sensor_mode_data.fine_integration_time_min,
212 _sensor_mode_data.fine_integration_time_max_margin,
213 _sensor_mode_data.fine_integration_time_def,
214 _sensor_mode_data.frame_length_lines,
215 _sensor_mode_data.line_length_pck,
216 _sensor_mode_data.vt_pix_clk_freq_mhz,
217 _sensor_mode_data.crop_horizontal_start,
218 _sensor_mode_data.crop_vertical_start,
219 _sensor_mode_data.crop_horizontal_end,
220 _sensor_mode_data.crop_vertical_end,
221 _sensor_mode_data.output_width,
222 _sensor_mode_data.output_height,
223 (uint32_t)_sensor_mode_data.binning_factor_x,
224 (uint32_t)_sensor_mode_data.binning_factor_y);
225
226 // initialize ae and awb
227 get_ae_handler ()->analyze (first_results);
228 get_awb_handler ()->analyze (first_results);
229
230 ret = _aiq_compositor->integrate (first_results);
231 XCAM_FAIL_RETURN (WARNING, ret == XCAM_RETURN_NO_ERROR, ret, "AIQ configure_3a failed on integrate results");
232
233 if (!first_results.empty()) {
234 notify_calculation_done (first_results);
235 }
236
237 return XCAM_RETURN_NO_ERROR;
238 }
239
240 XCamReturn
pre_3a_analyze(SmartPtr<X3aStats> & stats)241 X3aAnalyzerAiq::pre_3a_analyze (SmartPtr<X3aStats> &stats)
242 {
243 SmartPtr<X3aIspStatistics> isp_stats = stats.dynamic_cast_ptr<X3aIspStatistics> ();
244
245 XCAM_ASSERT (isp_stats.ptr ());
246 if (!_aiq_compositor->set_3a_stats (isp_stats)) {
247 XCAM_LOG_WARNING ("Aiq compositor set 3a stats failed");
248 return XCAM_RETURN_ERROR_UNKNOWN;
249 }
250
251 return XCAM_RETURN_NO_ERROR;
252 }
253
254 XCamReturn
post_3a_analyze(X3aResultList & results)255 X3aAnalyzerAiq::post_3a_analyze (X3aResultList &results)
256 {
257 XCamReturn ret = XCAM_RETURN_NO_ERROR;
258
259 ret = _aiq_compositor->integrate (results);
260 XCAM_FAIL_RETURN (WARNING, ret == XCAM_RETURN_NO_ERROR, ret, "AIQ integrate 3A results failed");
261
262 return XCAM_RETURN_NO_ERROR;
263 }
264
265 };
266