blob: 09da32398091511f0d146b174c2d21b6aa819ad7 [file] [log] [blame]
Wind Yuan75564b12015-01-15 06:51:15 -05001/*
2 * handler_interface.cpp - handler interface
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 "handler_interface.h"
22
23namespace XCam {
24
25AeHandler::AeHandler()
Wind Yuan75564b12015-01-15 06:51:15 -050026{
Wind Yuan27db7512015-01-26 15:53:26 +080027 reset_parameters ();
28}
29
30void
31AeHandler::reset_parameters ()
32{
33 // in case missing any parameters
34 xcam_mem_clear (&_params);
35
36 _params.mode = XCAM_AE_MODE_AUTO;
37 _params.metering_mode = XCAM_AE_METERING_MODE_AUTO;
38 _params.flicker_mode = XCAM_AE_FLICKER_MODE_AUTO;
39 _params.speed = 1.0;
40 _params.exposure_time_min = UINT64_C(0);
41 _params.exposure_time_max = UINT64_C(0);
42 _params.max_analog_gain = 0.0;
43 _params.manual_exposure_time = UINT64_C (0);
44 _params.manual_analog_gain = 0.0;
45 _params.aperture_fn = 0.0;
46 _params.ev_shift = 0.0;
47
48 _params.window.x_start = 0;
49 _params.window.y_start = 0;
50 _params.window.x_end = 0;
51 _params.window.y_end = 0;
52 _params.window.weight = 0;
Wind Yuan75564b12015-01-15 06:51:15 -050053}
54
55bool
56AeHandler::set_mode (XCamAeMode mode)
57{
58 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +080059 _params.mode = mode;
Wind Yuan75564b12015-01-15 06:51:15 -050060
61 XCAM_LOG_DEBUG ("ae set mode [%d]", mode);
62 return true;
63}
64
65bool
66AeHandler::set_metering_mode (XCamAeMeteringMode mode)
67{
68 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +080069 _params.metering_mode = mode;
Wind Yuan75564b12015-01-15 06:51:15 -050070
71 XCAM_LOG_DEBUG ("ae set metering mode [%d]", mode);
72 return true;
73}
74
75bool
76AeHandler::set_window (XCam3AWindow *window)
77{
78 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +080079 _params.window = *window;
Wind Yuan75564b12015-01-15 06:51:15 -050080
81 XCAM_LOG_DEBUG ("ae set metering mode window [x:%d, y:%d, x_end:%d, y_end:%d, weight:%d]",
82 window->x_start,
83 window->y_start,
84 window->x_end,
85 window->y_end,
86 window->weight);
87 return true;
88}
89
90bool
91AeHandler::set_ev_shift (double ev_shift)
92{
93 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +080094 _params.ev_shift = ev_shift;
Wind Yuan75564b12015-01-15 06:51:15 -050095
96 XCAM_LOG_DEBUG ("ae set ev shift:%.03f", ev_shift);
97 return true;
98}
99
100bool
101AeHandler::set_speed (double speed)
102{
103 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800104 _params.speed = speed;
Wind Yuan75564b12015-01-15 06:51:15 -0500105
106 XCAM_LOG_DEBUG ("ae set speed:%.03f", speed);
107 return true;
108}
109
110bool
111AeHandler::set_flicker_mode (XCamFlickerMode flicker)
112{
113 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800114 _params.flicker_mode = flicker;
Wind Yuan75564b12015-01-15 06:51:15 -0500115
116 XCAM_LOG_DEBUG ("ae set flicker:%d", flicker);
117 return true;
118}
119
120XCamFlickerMode
121AeHandler::get_flicker_mode ()
122{
123 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800124 return _params.flicker_mode;
Wind Yuan75564b12015-01-15 06:51:15 -0500125}
126
127int64_t
128AeHandler::get_current_exposure_time ()
129{
130 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800131 if (_params.mode == XCAM_AE_MODE_MANUAL)
132 return _params.manual_exposure_time;
Wind Yuan75564b12015-01-15 06:51:15 -0500133 return INT64_C(-1);
134}
135
136double
137AeHandler::get_current_analog_gain ()
138{
139 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800140 if (_params.mode == XCAM_AE_MODE_MANUAL)
141 return _params.manual_analog_gain;
Wind Yuan75564b12015-01-15 06:51:15 -0500142 return 0.0;
143}
144
145bool
146AeHandler::set_manual_exposure_time (int64_t time_in_us)
147{
148 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800149 _params.manual_exposure_time = time_in_us;
Wind Yuan75564b12015-01-15 06:51:15 -0500150
151 XCAM_LOG_DEBUG ("ae set manual exposure time: %lldus", time_in_us);
152 return true;
153}
154
155bool
156AeHandler::set_manual_analog_gain (double gain)
157{
158 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800159 _params.manual_analog_gain = gain;
Wind Yuan75564b12015-01-15 06:51:15 -0500160
161 XCAM_LOG_DEBUG ("ae set manual analog gain: %.03f", gain);
162 return true;
163}
164
165bool
166AeHandler::set_aperture (double fn)
167{
168 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800169 _params.aperture_fn = fn;
Wind Yuan75564b12015-01-15 06:51:15 -0500170
171 XCAM_LOG_DEBUG ("ae set aperture fn: %.03f", fn);
172 return true;
173}
174
175bool
176AeHandler::set_max_analog_gain (double max_gain)
177{
178 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800179 _params.max_analog_gain = max_gain;
Wind Yuan75564b12015-01-15 06:51:15 -0500180
181 XCAM_LOG_DEBUG ("ae set max analog_gain: %.03f", max_gain);
182 return true;
183}
184
185double AeHandler::get_max_analog_gain ()
186{
187 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800188 return _params.max_analog_gain;
Wind Yuan75564b12015-01-15 06:51:15 -0500189}
190
191bool AeHandler::set_exposure_time_range (int64_t min_time_in_us, int64_t max_time_in_us)
192{
193 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800194 _params.exposure_time_min = min_time_in_us;
195 _params.exposure_time_max = max_time_in_us;
Wind Yuan75564b12015-01-15 06:51:15 -0500196
197 XCAM_LOG_DEBUG ("ae set exposrue range[%lldus, %lldus]", min_time_in_us, max_time_in_us);
198 return true;
199}
200
201bool
202AeHandler::get_exposure_time_range (int64_t *min_time_in_us, int64_t *max_time_in_us)
203{
204 XCAM_ASSERT (min_time_in_us && max_time_in_us);
205
206 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800207 *min_time_in_us = _params.exposure_time_min;
208 *max_time_in_us = _params.exposure_time_max;
Wind Yuan75564b12015-01-15 06:51:15 -0500209
210 return true;
211}
212
213AwbHandler::AwbHandler()
Wind Yuan27db7512015-01-26 15:53:26 +0800214{
215 reset_parameters ();
216}
217
218void
219AwbHandler::reset_parameters ()
220{
221 xcam_mem_clear (&_params);
222 _params.mode = XCAM_AWB_MODE_AUTO;
223 _params.speed = 1.0;
224 _params.cct_min = 0;
225 _params.cct_max = 0;
226 _params.gr_gain = 0.0;
227 _params.r_gain = 0.0;
228 _params.b_gain = 0.0;
229 _params.gb_gain = 0.0;
230
231 _params.window.x_start = 0;
232 _params.window.y_start = 0;
233 _params.window.x_end = 0;
234 _params.window.y_end = 0;
235 _params.window.weight = 0;
236}
Wind Yuan75564b12015-01-15 06:51:15 -0500237
238bool
239AwbHandler::set_mode (XCamAwbMode mode)
240{
241 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800242 _params.mode = mode;
Wind Yuan75564b12015-01-15 06:51:15 -0500243
244 XCAM_LOG_DEBUG ("awb set mode [%d]", mode);
245 return true;
246}
247
248bool
249AwbHandler::set_speed (double speed)
250{
251 XCAM_FAIL_RETURN (
252 ERROR,
253 (0.0 < speed) && (speed <= 1.0),
254 false,
255 "awb speed(%f) is out of range, suggest (0.0, 1.0]", speed);
256
257 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800258 _params.speed = speed;
Wind Yuan75564b12015-01-15 06:51:15 -0500259
260 XCAM_LOG_DEBUG ("awb set speed [%f]", speed);
261 return true;
262}
263
264bool
265AwbHandler::set_color_temperature_range (uint32_t cct_min, uint32_t cct_max)
266{
267 XCAM_FAIL_RETURN (
268 ERROR,
269 (cct_min <= cct_max),
270 false,
271 "awb set wrong cct(%u, %u) parameters", cct_min, cct_max);
272
273 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800274 _params.cct_min = cct_min;
275 _params.cct_max = cct_max;
Wind Yuan75564b12015-01-15 06:51:15 -0500276
277 XCAM_LOG_DEBUG ("awb set cct range [%u, %u]", cct_min, cct_max);
278 return true;
279}
280
281bool
282AwbHandler::set_manual_gain (double gr, double r, double b, double gb)
283{
284 XCAM_FAIL_RETURN (
285 ERROR,
286 gr >= 0.0 && r >= 0.0 && b >= 0.0 && gb >= 0.0,
287 false,
288 "awb manual gain value must >= 0.0");
289
290 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800291 _params.gr_gain = gr;
292 _params.r_gain = r;
293 _params.b_gain = b;
294 _params.gb_gain = gb;
Wind Yuan75564b12015-01-15 06:51:15 -0500295 XCAM_LOG_DEBUG ("awb set manual gain value(gr:%.03f, r:%.03f, b:%.03f, gb:%.03f)", gr, r, b, gb);
296 return true;
297}
298
299CommonHandler::CommonHandler()
Wind Yuan27db7512015-01-26 15:53:26 +0800300{
301 reset_parameters ();
302}
303
304void
305CommonHandler::reset_parameters ()
306{
307 xcam_mem_clear (&_params);
308
309 _params.is_manual_gamma = false;
310 _params.nr_level = 0.0;
311 _params.tnr_level = 0.0;
312 _params.brightness = 0.0;
313 _params.contrast = 0.0;
314 _params.hue = 0.0;
315 _params.saturation = 0.0;
316 _params.sharpness = 0.0;
317 _params.enable_dvs = false;
318 _params.enable_gbce = false;
319 _params.enable_night_mode = false;
320}
Wind Yuan75564b12015-01-15 06:51:15 -0500321
322bool CommonHandler::set_dvs (bool enable)
323{
324 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800325 _params.enable_dvs = enable;
Wind Yuan75564b12015-01-15 06:51:15 -0500326
327 XCAM_LOG_DEBUG ("common 3A enable dvs:%s", XCAM_BOOL2STR(enable));
328 return true;
329}
330
331bool
332CommonHandler::set_gbce (bool enable)
333{
334 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800335 _params.enable_gbce = enable;
Wind Yuan75564b12015-01-15 06:51:15 -0500336
337 XCAM_LOG_DEBUG ("common 3A enable gbce:%s", XCAM_BOOL2STR(enable));
338 return true;
339}
340
341bool
342CommonHandler::set_night_mode (bool enable)
343{
344 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800345 _params.enable_night_mode = enable;
Wind Yuan75564b12015-01-15 06:51:15 -0500346
347 XCAM_LOG_DEBUG ("common 3A enable night mode:%s", XCAM_BOOL2STR(enable));
348 return true;
349}
350
351/* Picture quality */
352bool
353CommonHandler::set_noise_reduction_level (double level)
354{
355 XCAM_FAIL_RETURN (
356 ERROR,
357 level >= -1.0 && level < 1.0,
358 false,
359 "set NR levlel(%.03f) out of range[-1.0, 1.0]", level);
360
361 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800362 _params.nr_level = level;
Wind Yuan75564b12015-01-15 06:51:15 -0500363
364 XCAM_LOG_DEBUG ("common 3A set NR level:%.03f", level);
365 return true;
366}
367
368bool
369CommonHandler::set_temporal_noise_reduction_level (double level)
370{
371 XCAM_FAIL_RETURN (
372 ERROR,
373 level >= -1.0 && level < 1.0,
374 false,
375 "set TNR levlel(%.03f) out of range[-1.0, 1.0]", level);
376
377 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800378 _params.tnr_level = level;
Wind Yuan75564b12015-01-15 06:51:15 -0500379
380 XCAM_LOG_DEBUG ("common 3A set TNR level:%.03f", level);
381 return true;
382}
383
384bool
385CommonHandler::set_manual_brightness (double level)
386{
387 XCAM_FAIL_RETURN (
388 ERROR,
389 level >= -1.0 && level < 1.0,
390 false,
391 "set brightness levlel(%.03f) out of range[-1.0, 1.0]", level);
392
393 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800394 _params.brightness = level;
Wind Yuan75564b12015-01-15 06:51:15 -0500395
396 XCAM_LOG_DEBUG ("common 3A set brightness level:%.03f", level);
397 return true;
398}
399
400bool CommonHandler::set_manual_contrast (double level)
401{
402 XCAM_FAIL_RETURN (
403 ERROR,
404 level >= -1.0 && level < 1.0,
405 false,
406 "set contrast levlel(%.03f) out of range[-1.0, 1.0]", level);
407
408 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800409 _params.contrast = level;
Wind Yuan75564b12015-01-15 06:51:15 -0500410
411 XCAM_LOG_DEBUG ("common 3A set contrast level:%.03f", level);
412 return true;
413}
414
415bool CommonHandler::set_manual_hue (double level)
416{
417 XCAM_FAIL_RETURN (
418 ERROR,
419 level >= -1.0 && level < 1.0,
420 false,
421 "set hue levlel(%.03f) out of range[-1.0, 1.0]", level);
422
423 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800424 _params.hue = level;
Wind Yuan75564b12015-01-15 06:51:15 -0500425
426 XCAM_LOG_DEBUG ("common 3A set hue level:%.03f", level);
427 return true;
428}
429
430bool
431CommonHandler::set_manual_saturation (double level)
432{
433 XCAM_FAIL_RETURN (
434 ERROR,
435 level >= -1.0 && level < 1.0,
436 false,
437 "set saturation levlel(%.03f) out of range[-1.0, 1.0]", level);
438
439 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800440 _params.saturation = level;
Wind Yuan75564b12015-01-15 06:51:15 -0500441
442 XCAM_LOG_DEBUG ("common 3A set saturation level:%.03f", level);
443 return true;
444}
445
446bool CommonHandler::set_manual_sharpness (double level)
447{
448 XCAM_FAIL_RETURN (
449 ERROR,
450 level >= -1.0 && level < 1.0,
451 false,
452 "set sharpness levlel(%.03f) out of range[-1.0, 1.0]", level);
453
454 AnalyzerHandler::HanlderLock lock(this);
Wind Yuan27db7512015-01-26 15:53:26 +0800455 _params.sharpness = level;
Wind Yuan75564b12015-01-15 06:51:15 -0500456
457 XCAM_LOG_DEBUG ("common 3A set sharpness level:%.03f", level);
458 return true;
459}
460
461bool
462CommonHandler::set_gamma_table (double *r_table, double *g_table, double *b_table)
463{
464 AnalyzerHandler::HanlderLock lock(this);
465 if (!r_table && ! g_table && !b_table) {
Wind Yuan27db7512015-01-26 15:53:26 +0800466 _params.is_manual_gamma = false;
Wind Yuan75564b12015-01-15 06:51:15 -0500467 XCAM_LOG_DEBUG ("common 3A disabled gamma");
468 return true;
469 }
470
471 if (!r_table || !g_table || !b_table) {
472 XCAM_LOG_ERROR ("common 3A gamma table parameters wrong");
473 return false;
474 }
475
476 for (uint32_t i = 0; i < XCAM_GAMMA_TABLE_SIZE; ++i) {
Wind Yuan27db7512015-01-26 15:53:26 +0800477 _params.r_gamma [i] = r_table [i];
478 _params.g_gamma [i] = g_table [i];
479 _params.b_gamma [i] = b_table [i];
Wind Yuan75564b12015-01-15 06:51:15 -0500480 }
Wind Yuan27db7512015-01-26 15:53:26 +0800481 _params.is_manual_gamma = true;
Wind Yuan75564b12015-01-15 06:51:15 -0500482
483 XCAM_LOG_DEBUG ("common 3A enabled RGB gamma");
484 return true;
485}
486
487};