Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 1 | /* |
| 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 | |
| 23 | namespace XCam { |
| 24 | |
| 25 | AeHandler::AeHandler() |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 26 | { |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 27 | reset_parameters (); |
| 28 | } |
| 29 | |
| 30 | void |
| 31 | AeHandler::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 Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 53 | } |
| 54 | |
| 55 | bool |
| 56 | AeHandler::set_mode (XCamAeMode mode) |
| 57 | { |
| 58 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 59 | _params.mode = mode; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 60 | |
| 61 | XCAM_LOG_DEBUG ("ae set mode [%d]", mode); |
| 62 | return true; |
| 63 | } |
| 64 | |
| 65 | bool |
| 66 | AeHandler::set_metering_mode (XCamAeMeteringMode mode) |
| 67 | { |
| 68 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 69 | _params.metering_mode = mode; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 70 | |
| 71 | XCAM_LOG_DEBUG ("ae set metering mode [%d]", mode); |
| 72 | return true; |
| 73 | } |
| 74 | |
| 75 | bool |
| 76 | AeHandler::set_window (XCam3AWindow *window) |
| 77 | { |
| 78 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 79 | _params.window = *window; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 80 | |
| 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 | |
| 90 | bool |
| 91 | AeHandler::set_ev_shift (double ev_shift) |
| 92 | { |
| 93 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 94 | _params.ev_shift = ev_shift; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 95 | |
| 96 | XCAM_LOG_DEBUG ("ae set ev shift:%.03f", ev_shift); |
| 97 | return true; |
| 98 | } |
| 99 | |
| 100 | bool |
| 101 | AeHandler::set_speed (double speed) |
| 102 | { |
| 103 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 104 | _params.speed = speed; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 105 | |
| 106 | XCAM_LOG_DEBUG ("ae set speed:%.03f", speed); |
| 107 | return true; |
| 108 | } |
| 109 | |
| 110 | bool |
| 111 | AeHandler::set_flicker_mode (XCamFlickerMode flicker) |
| 112 | { |
| 113 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 114 | _params.flicker_mode = flicker; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 115 | |
| 116 | XCAM_LOG_DEBUG ("ae set flicker:%d", flicker); |
| 117 | return true; |
| 118 | } |
| 119 | |
| 120 | XCamFlickerMode |
| 121 | AeHandler::get_flicker_mode () |
| 122 | { |
| 123 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 124 | return _params.flicker_mode; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 125 | } |
| 126 | |
| 127 | int64_t |
| 128 | AeHandler::get_current_exposure_time () |
| 129 | { |
| 130 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 131 | if (_params.mode == XCAM_AE_MODE_MANUAL) |
| 132 | return _params.manual_exposure_time; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 133 | return INT64_C(-1); |
| 134 | } |
| 135 | |
| 136 | double |
| 137 | AeHandler::get_current_analog_gain () |
| 138 | { |
| 139 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 140 | if (_params.mode == XCAM_AE_MODE_MANUAL) |
| 141 | return _params.manual_analog_gain; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 142 | return 0.0; |
| 143 | } |
| 144 | |
| 145 | bool |
| 146 | AeHandler::set_manual_exposure_time (int64_t time_in_us) |
| 147 | { |
| 148 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 149 | _params.manual_exposure_time = time_in_us; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 150 | |
| 151 | XCAM_LOG_DEBUG ("ae set manual exposure time: %lldus", time_in_us); |
| 152 | return true; |
| 153 | } |
| 154 | |
| 155 | bool |
| 156 | AeHandler::set_manual_analog_gain (double gain) |
| 157 | { |
| 158 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 159 | _params.manual_analog_gain = gain; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 160 | |
| 161 | XCAM_LOG_DEBUG ("ae set manual analog gain: %.03f", gain); |
| 162 | return true; |
| 163 | } |
| 164 | |
| 165 | bool |
| 166 | AeHandler::set_aperture (double fn) |
| 167 | { |
| 168 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 169 | _params.aperture_fn = fn; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 170 | |
| 171 | XCAM_LOG_DEBUG ("ae set aperture fn: %.03f", fn); |
| 172 | return true; |
| 173 | } |
| 174 | |
| 175 | bool |
| 176 | AeHandler::set_max_analog_gain (double max_gain) |
| 177 | { |
| 178 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 179 | _params.max_analog_gain = max_gain; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 180 | |
| 181 | XCAM_LOG_DEBUG ("ae set max analog_gain: %.03f", max_gain); |
| 182 | return true; |
| 183 | } |
| 184 | |
| 185 | double AeHandler::get_max_analog_gain () |
| 186 | { |
| 187 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 188 | return _params.max_analog_gain; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 189 | } |
| 190 | |
| 191 | bool AeHandler::set_exposure_time_range (int64_t min_time_in_us, int64_t max_time_in_us) |
| 192 | { |
| 193 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 194 | _params.exposure_time_min = min_time_in_us; |
| 195 | _params.exposure_time_max = max_time_in_us; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 196 | |
| 197 | XCAM_LOG_DEBUG ("ae set exposrue range[%lldus, %lldus]", min_time_in_us, max_time_in_us); |
| 198 | return true; |
| 199 | } |
| 200 | |
| 201 | bool |
| 202 | AeHandler::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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 207 | *min_time_in_us = _params.exposure_time_min; |
| 208 | *max_time_in_us = _params.exposure_time_max; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 209 | |
| 210 | return true; |
| 211 | } |
| 212 | |
| 213 | AwbHandler::AwbHandler() |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 214 | { |
| 215 | reset_parameters (); |
| 216 | } |
| 217 | |
| 218 | void |
| 219 | AwbHandler::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 Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 237 | |
| 238 | bool |
| 239 | AwbHandler::set_mode (XCamAwbMode mode) |
| 240 | { |
| 241 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 242 | _params.mode = mode; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 243 | |
| 244 | XCAM_LOG_DEBUG ("awb set mode [%d]", mode); |
| 245 | return true; |
| 246 | } |
| 247 | |
| 248 | bool |
| 249 | AwbHandler::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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 258 | _params.speed = speed; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 259 | |
| 260 | XCAM_LOG_DEBUG ("awb set speed [%f]", speed); |
| 261 | return true; |
| 262 | } |
| 263 | |
| 264 | bool |
| 265 | AwbHandler::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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 274 | _params.cct_min = cct_min; |
| 275 | _params.cct_max = cct_max; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 276 | |
| 277 | XCAM_LOG_DEBUG ("awb set cct range [%u, %u]", cct_min, cct_max); |
| 278 | return true; |
| 279 | } |
| 280 | |
| 281 | bool |
| 282 | AwbHandler::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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 291 | _params.gr_gain = gr; |
| 292 | _params.r_gain = r; |
| 293 | _params.b_gain = b; |
| 294 | _params.gb_gain = gb; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 295 | 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 | |
| 299 | CommonHandler::CommonHandler() |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 300 | { |
| 301 | reset_parameters (); |
| 302 | } |
| 303 | |
| 304 | void |
| 305 | CommonHandler::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 Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 321 | |
| 322 | bool CommonHandler::set_dvs (bool enable) |
| 323 | { |
| 324 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 325 | _params.enable_dvs = enable; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 326 | |
| 327 | XCAM_LOG_DEBUG ("common 3A enable dvs:%s", XCAM_BOOL2STR(enable)); |
| 328 | return true; |
| 329 | } |
| 330 | |
| 331 | bool |
| 332 | CommonHandler::set_gbce (bool enable) |
| 333 | { |
| 334 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 335 | _params.enable_gbce = enable; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 336 | |
| 337 | XCAM_LOG_DEBUG ("common 3A enable gbce:%s", XCAM_BOOL2STR(enable)); |
| 338 | return true; |
| 339 | } |
| 340 | |
| 341 | bool |
| 342 | CommonHandler::set_night_mode (bool enable) |
| 343 | { |
| 344 | AnalyzerHandler::HanlderLock lock(this); |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 345 | _params.enable_night_mode = enable; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 346 | |
| 347 | XCAM_LOG_DEBUG ("common 3A enable night mode:%s", XCAM_BOOL2STR(enable)); |
| 348 | return true; |
| 349 | } |
| 350 | |
| 351 | /* Picture quality */ |
| 352 | bool |
| 353 | CommonHandler::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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 362 | _params.nr_level = level; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 363 | |
| 364 | XCAM_LOG_DEBUG ("common 3A set NR level:%.03f", level); |
| 365 | return true; |
| 366 | } |
| 367 | |
| 368 | bool |
| 369 | CommonHandler::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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 378 | _params.tnr_level = level; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 379 | |
| 380 | XCAM_LOG_DEBUG ("common 3A set TNR level:%.03f", level); |
| 381 | return true; |
| 382 | } |
| 383 | |
| 384 | bool |
| 385 | CommonHandler::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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 394 | _params.brightness = level; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 395 | |
| 396 | XCAM_LOG_DEBUG ("common 3A set brightness level:%.03f", level); |
| 397 | return true; |
| 398 | } |
| 399 | |
| 400 | bool 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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 409 | _params.contrast = level; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 410 | |
| 411 | XCAM_LOG_DEBUG ("common 3A set contrast level:%.03f", level); |
| 412 | return true; |
| 413 | } |
| 414 | |
| 415 | bool 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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 424 | _params.hue = level; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 425 | |
| 426 | XCAM_LOG_DEBUG ("common 3A set hue level:%.03f", level); |
| 427 | return true; |
| 428 | } |
| 429 | |
| 430 | bool |
| 431 | CommonHandler::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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 440 | _params.saturation = level; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 441 | |
| 442 | XCAM_LOG_DEBUG ("common 3A set saturation level:%.03f", level); |
| 443 | return true; |
| 444 | } |
| 445 | |
| 446 | bool 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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 455 | _params.sharpness = level; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 456 | |
| 457 | XCAM_LOG_DEBUG ("common 3A set sharpness level:%.03f", level); |
| 458 | return true; |
| 459 | } |
| 460 | |
| 461 | bool |
| 462 | CommonHandler::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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 466 | _params.is_manual_gamma = false; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 467 | 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 Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 477 | _params.r_gamma [i] = r_table [i]; |
| 478 | _params.g_gamma [i] = g_table [i]; |
| 479 | _params.b_gamma [i] = b_table [i]; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 480 | } |
Wind Yuan | 27db751 | 2015-01-26 15:53:26 +0800 | [diff] [blame] | 481 | _params.is_manual_gamma = true; |
Wind Yuan | 75564b1 | 2015-01-15 06:51:15 -0500 | [diff] [blame] | 482 | |
| 483 | XCAM_LOG_DEBUG ("common 3A enabled RGB gamma"); |
| 484 | return true; |
| 485 | } |
| 486 | |
| 487 | }; |