Home | History | Annotate | Download | only in xcore
      1 /*
      2  * x3a_analyzer.cpp - 3a analyzer
      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 (at) intel.com>
     19  */
     20 
     21 #include "xcam_analyzer.h"
     22 #include "x3a_analyzer.h"
     23 #include "x3a_stats_pool.h"
     24 
     25 namespace XCam {
     26 
     27 X3aAnalyzer::X3aAnalyzer (const char *name)
     28     : XAnalyzer (name)
     29     , _brightness_level_param (0.0)
     30     , _ae_handler (NULL)
     31     , _awb_handler (NULL)
     32     , _af_handler (NULL)
     33     , _common_handler (NULL)
     34 {
     35 }
     36 
     37 X3aAnalyzer::~X3aAnalyzer()
     38 {
     39 }
     40 
     41 XCamReturn
     42 X3aAnalyzer::create_handlers ()
     43 {
     44     SmartPtr<AeHandler> ae_handler;
     45     SmartPtr<AwbHandler> awb_handler;
     46     SmartPtr<AfHandler> af_handler;
     47     SmartPtr<CommonHandler> common_handler;
     48 
     49     if (_ae_handler.ptr() && _awb_handler.ptr() &&
     50             _af_handler.ptr() && _common_handler.ptr())
     51         return XCAM_RETURN_NO_ERROR;
     52 
     53     ae_handler = create_ae_handler ();
     54     awb_handler = create_awb_handler ();
     55     af_handler = create_af_handler ();
     56     common_handler = create_common_handler ();
     57 
     58     if (!ae_handler.ptr() || !awb_handler.ptr() || !af_handler.ptr() || !common_handler.ptr()) {
     59         XCAM_LOG_WARNING ("create handlers failed");
     60         return XCAM_RETURN_ERROR_MEM;
     61     }
     62 
     63     _ae_handler = ae_handler;
     64     _awb_handler = awb_handler;
     65     _af_handler = af_handler;
     66     _common_handler = common_handler;
     67 
     68     return XCAM_RETURN_NO_ERROR;
     69 }
     70 
     71 XCamReturn
     72 X3aAnalyzer::release_handlers ()
     73 {
     74     _ae_handler.release ();
     75     _awb_handler.release ();
     76     _af_handler.release ();
     77     _common_handler.release ();
     78 
     79     return XCAM_RETURN_NO_ERROR;
     80 }
     81 
     82 XCamReturn
     83 X3aAnalyzer::configure ()
     84 {
     85     return configure_3a ();
     86 }
     87 
     88 XCamReturn
     89 X3aAnalyzer::analyze (const SmartPtr<VideoBuffer> &buffer)
     90 {
     91     SmartPtr<X3aStats> stats = buffer.dynamic_cast_ptr<X3aStats> ();
     92 
     93     return analyze_3a_statistics (stats);
     94 }
     95 
     96 XCamReturn
     97 X3aAnalyzer::push_3a_stats (const SmartPtr<X3aStats> &stats)
     98 {
     99     return XAnalyzer::push_buffer (stats);
    100 }
    101 
    102 
    103 XCamReturn
    104 X3aAnalyzer::analyze_3a_statistics (SmartPtr<X3aStats> &stats)
    105 {
    106     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    107     X3aResultList results;
    108 
    109     ret = pre_3a_analyze (stats);
    110     if (ret != XCAM_RETURN_NO_ERROR) {
    111         notify_calculation_failed(
    112             NULL, stats->get_timestamp (), "pre 3a analyze failed");
    113         return ret;
    114     }
    115 
    116     ret = _ae_handler->analyze (results);
    117     if (ret != XCAM_RETURN_NO_ERROR) {
    118         notify_calculation_failed(
    119             _ae_handler.ptr(), stats->get_timestamp (), "ae calculation failed");
    120         return ret;
    121     }
    122 
    123     ret = _awb_handler->analyze (results);
    124     if (ret != XCAM_RETURN_NO_ERROR) {
    125         notify_calculation_failed(
    126             _awb_handler.ptr(), stats->get_timestamp (), "awb calculation failed");
    127         return ret;
    128     }
    129 
    130     ret = _af_handler->analyze (results);
    131     if (ret != XCAM_RETURN_NO_ERROR) {
    132         notify_calculation_failed(
    133             _af_handler.ptr(), stats->get_timestamp (), "af calculation failed");
    134         return ret;
    135     }
    136 
    137     ret = _common_handler->analyze (results);
    138     if (ret != XCAM_RETURN_NO_ERROR) {
    139         notify_calculation_failed(
    140             _common_handler.ptr(), stats->get_timestamp (), "3a other calculation failed");
    141         return ret;
    142     }
    143 
    144     ret = post_3a_analyze (results);
    145     if (ret != XCAM_RETURN_NO_ERROR) {
    146         notify_calculation_failed(
    147             NULL, stats->get_timestamp (), "3a collect results failed");
    148         return ret;
    149     }
    150 
    151     if (!results.empty ()) {
    152         set_results_timestamp(results, stats->get_timestamp ());
    153         notify_calculation_done (results);
    154     }
    155 
    156     return ret;
    157 }
    158 
    159 /* AWB */
    160 bool
    161 X3aAnalyzer::set_awb_mode (XCamAwbMode mode)
    162 {
    163     XCAM_ASSERT (_awb_handler.ptr());
    164     return _awb_handler->set_mode (mode);
    165 }
    166 
    167 bool
    168 X3aAnalyzer::set_awb_speed (double speed)
    169 {
    170     XCAM_ASSERT (_awb_handler.ptr());
    171     return _awb_handler->set_speed (speed);
    172 }
    173 
    174 bool
    175 X3aAnalyzer::set_awb_color_temperature_range (uint32_t cct_min, uint32_t cct_max)
    176 {
    177     XCAM_ASSERT (_awb_handler.ptr());
    178     return _awb_handler->set_color_temperature_range (cct_min, cct_max);
    179 }
    180 
    181 bool
    182 X3aAnalyzer::set_awb_manual_gain (double gr, double r, double b, double gb)
    183 {
    184     XCAM_ASSERT (_awb_handler.ptr());
    185     return _awb_handler->set_manual_gain (gr, r, b, gb);
    186 }
    187 
    188 /* AE */
    189 bool
    190 X3aAnalyzer::set_ae_mode (XCamAeMode mode)
    191 {
    192     XCAM_ASSERT (_ae_handler.ptr());
    193     return _ae_handler->set_mode (mode);
    194 }
    195 
    196 bool
    197 X3aAnalyzer::set_ae_metering_mode (XCamAeMeteringMode mode)
    198 {
    199     XCAM_ASSERT (_ae_handler.ptr());
    200     return _ae_handler->set_metering_mode (mode);
    201 }
    202 
    203 bool
    204 X3aAnalyzer::set_ae_window (XCam3AWindow *window, uint8_t count)
    205 {
    206     XCAM_ASSERT (_ae_handler.ptr());
    207     return _ae_handler->set_window (window, count);
    208 }
    209 
    210 bool
    211 X3aAnalyzer::set_ae_ev_shift (double ev_shift)
    212 {
    213     XCAM_ASSERT (_ae_handler.ptr());
    214     return _ae_handler->set_ev_shift (ev_shift);
    215 }
    216 
    217 bool
    218 X3aAnalyzer::set_ae_speed (double speed)
    219 {
    220     XCAM_ASSERT (_ae_handler.ptr());
    221     return _ae_handler->set_speed (speed);
    222 }
    223 
    224 bool
    225 X3aAnalyzer::set_ae_flicker_mode (XCamFlickerMode flicker)
    226 {
    227     XCAM_ASSERT (_ae_handler.ptr());
    228     return _ae_handler->set_flicker_mode (flicker);
    229 }
    230 
    231 XCamFlickerMode
    232 X3aAnalyzer::get_ae_flicker_mode ()
    233 {
    234     XCAM_ASSERT (_ae_handler.ptr());
    235     return _ae_handler->get_flicker_mode ();
    236 }
    237 
    238 uint64_t
    239 X3aAnalyzer::get_ae_current_exposure_time ()
    240 {
    241     XCAM_ASSERT (_ae_handler.ptr());
    242     return _ae_handler->get_current_exposure_time();
    243 }
    244 
    245 double
    246 X3aAnalyzer::get_ae_current_analog_gain ()
    247 {
    248     XCAM_ASSERT (_ae_handler.ptr());
    249     return _ae_handler->get_current_analog_gain ();
    250 }
    251 
    252 bool
    253 X3aAnalyzer::set_ae_manual_exposure_time (int64_t time_in_us)
    254 {
    255     XCAM_ASSERT (_ae_handler.ptr());
    256     return _ae_handler->set_manual_exposure_time (time_in_us);
    257 }
    258 
    259 bool
    260 X3aAnalyzer::set_ae_manual_analog_gain (double gain)
    261 {
    262     XCAM_ASSERT (_ae_handler.ptr());
    263     return _ae_handler->set_manual_analog_gain (gain);
    264 }
    265 
    266 bool
    267 X3aAnalyzer::set_ae_aperture (double fn)
    268 {
    269     XCAM_ASSERT (_ae_handler.ptr());
    270     return _ae_handler->set_aperture (fn);
    271 }
    272 
    273 bool
    274 X3aAnalyzer::set_ae_max_analog_gain (double max_gain)
    275 {
    276     XCAM_ASSERT (_ae_handler.ptr());
    277     return _ae_handler->set_max_analog_gain (max_gain);
    278 }
    279 
    280 double
    281 X3aAnalyzer::get_ae_max_analog_gain ()
    282 {
    283     XCAM_ASSERT (_ae_handler.ptr());
    284     return _ae_handler->get_max_analog_gain();
    285 }
    286 
    287 bool
    288 X3aAnalyzer::set_ae_exposure_time_range (int64_t min_time_in_us, int64_t max_time_in_us)
    289 {
    290     XCAM_ASSERT (_ae_handler.ptr());
    291     return _ae_handler->set_exposure_time_range (min_time_in_us, max_time_in_us);
    292 }
    293 
    294 bool
    295 X3aAnalyzer::get_ae_exposure_time_range (int64_t *min_time_in_us, int64_t *max_time_in_us)
    296 {
    297     XCAM_ASSERT (_ae_handler.ptr());
    298     return _ae_handler->get_exposure_time_range (min_time_in_us, max_time_in_us);
    299 }
    300 
    301 /* DVS */
    302 bool
    303 X3aAnalyzer::set_dvs (bool enable)
    304 {
    305     XCAM_ASSERT (_common_handler.ptr());
    306     return _common_handler->set_dvs (enable);
    307 }
    308 
    309 bool
    310 X3aAnalyzer::set_gbce (bool enable)
    311 {
    312     XCAM_ASSERT (_common_handler.ptr());
    313     return _common_handler->set_gbce (enable);
    314 }
    315 
    316 bool
    317 X3aAnalyzer::set_night_mode (bool enable)
    318 {
    319     XCAM_ASSERT (_common_handler.ptr());
    320     return _common_handler->set_night_mode (enable);
    321 }
    322 
    323 bool
    324 X3aAnalyzer::set_color_effect (XCamColorEffect type)
    325 {
    326 
    327     XCAM_ASSERT (_common_handler.ptr());
    328     return _common_handler->set_color_effect (type);
    329 }
    330 
    331 /* Picture quality */
    332 bool
    333 X3aAnalyzer::set_noise_reduction_level (double level)
    334 {
    335     XCAM_ASSERT (_common_handler.ptr());
    336     return _common_handler->set_noise_reduction_level (level);
    337 }
    338 
    339 bool
    340 X3aAnalyzer::set_temporal_noise_reduction_level (double level)
    341 {
    342     XCAM_ASSERT (_common_handler.ptr());
    343     return _common_handler->set_temporal_noise_reduction_level (level);
    344 }
    345 
    346 bool
    347 X3aAnalyzer::set_manual_brightness (double level)
    348 {
    349     XCAM_ASSERT (_common_handler.ptr());
    350     return _common_handler->set_manual_brightness (level);
    351 }
    352 
    353 bool
    354 X3aAnalyzer::set_manual_contrast (double level)
    355 {
    356     XCAM_ASSERT (_common_handler.ptr());
    357     return _common_handler->set_manual_contrast (level);
    358 }
    359 
    360 bool
    361 X3aAnalyzer::set_manual_hue (double level)
    362 {
    363     XCAM_ASSERT (_common_handler.ptr());
    364     return _common_handler->set_manual_hue (level);
    365 }
    366 
    367 bool
    368 X3aAnalyzer::set_manual_saturation (double level)
    369 {
    370     XCAM_ASSERT (_common_handler.ptr());
    371     return _common_handler->set_manual_saturation (level);
    372 }
    373 
    374 bool
    375 X3aAnalyzer::set_manual_sharpness (double level)
    376 {
    377     XCAM_ASSERT (_common_handler.ptr());
    378     return _common_handler->set_manual_sharpness (level);
    379 }
    380 
    381 bool
    382 X3aAnalyzer::set_gamma_table (double *r_table, double *g_table, double *b_table)
    383 {
    384     XCAM_ASSERT (_common_handler.ptr());
    385     return _common_handler->set_gamma_table (r_table, g_table, b_table);
    386 }
    387 
    388 bool
    389 X3aAnalyzer::set_parameter_brightness(double level)
    390 {
    391     _brightness_level_param = level;
    392     return true;
    393 }
    394 
    395 bool
    396 X3aAnalyzer::update_awb_parameters (const XCamAwbParam &params)
    397 {
    398     XCAM_ASSERT (_awb_handler.ptr());
    399     return _awb_handler->update_parameters (params);
    400 }
    401 
    402 bool
    403 X3aAnalyzer::update_common_parameters (const XCamCommonParam &params)
    404 {
    405     XCAM_ASSERT (_common_handler.ptr());
    406     return _common_handler->update_parameters (params);
    407 }
    408 
    409 bool
    410 X3aAnalyzer::update_ae_parameters (const XCamAeParam &params)
    411 {
    412     XCAM_ASSERT (_ae_handler.ptr());
    413     return _ae_handler->update_parameters (params);
    414 }
    415 
    416 bool
    417 X3aAnalyzer::update_af_parameters (const XCamAfParam &params)
    418 {
    419     XCAM_ASSERT (_af_handler.ptr());
    420     return _af_handler->update_parameters (params);
    421 }
    422 
    423 };
    424