Home | History | Annotate | Download | only in iq
      1 /*
      2  * x3a_analyze_tuner.cpp - x3a analyzer Common IQ tuning adaptor
      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: Zong Wei <wei.zong (at) intel.com>
     19  */
     20 
     21 #include "xcam_utils.h"
     22 #include "x3a_stats_pool.h"
     23 #include "x3a_analyzer.h"
     24 #include "x3a_analyze_tuner.h"
     25 #include "x3a_ciq_tuning_handler.h"
     26 #include "x3a_ciq_tnr_tuning_handler.h"
     27 #include "x3a_ciq_bnr_ee_tuning_handler.h"
     28 #include "x3a_ciq_wavelet_tuning_handler.h"
     29 
     30 namespace XCam {
     31 
     32 X3aAnalyzeTuner::X3aAnalyzeTuner ()
     33     : X3aAnalyzer ("X3aAnalyzeTuner")
     34 {
     35 }
     36 
     37 X3aAnalyzeTuner::~X3aAnalyzeTuner ()
     38 {
     39 }
     40 
     41 void
     42 X3aAnalyzeTuner::set_analyzer (SmartPtr<X3aAnalyzer> &analyzer)
     43 {
     44     XCAM_ASSERT (analyzer.ptr () && !_analyzer.ptr ());
     45     _analyzer = analyzer;
     46 
     47     _analyzer->set_results_callback (this);
     48     _analyzer->prepare_handlers ();
     49     _analyzer->set_sync_mode (true);
     50 }
     51 
     52 XCamReturn
     53 X3aAnalyzeTuner::create_tuning_handlers ()
     54 {
     55     XCamReturn ret = XCAM_RETURN_NO_ERROR;
     56 
     57     SmartPtr<AeHandler> ae_handler = _analyzer->get_ae_handler ();
     58     SmartPtr<AwbHandler> awb_handler = _analyzer->get_awb_handler();
     59 
     60     SmartPtr<X3aCiqTuningHandler> tnr_tuning = new X3aCiqTnrTuningHandler ();
     61     SmartPtr<X3aCiqTuningHandler> bnr_ee_tuning = new X3aCiqBnrEeTuningHandler ();
     62     SmartPtr<X3aCiqTuningHandler> wavelet_tuning = new X3aCiqWaveletTuningHandler ();
     63 
     64     if (tnr_tuning.ptr ()) {
     65         tnr_tuning->set_ae_handler (ae_handler);
     66         tnr_tuning->set_awb_handler (awb_handler);
     67         add_handler (tnr_tuning);
     68     } else {
     69         ret = XCAM_RETURN_ERROR_PARAM;
     70     }
     71 
     72     if (bnr_ee_tuning.ptr ()) {
     73         bnr_ee_tuning->set_ae_handler (ae_handler);
     74         bnr_ee_tuning->set_awb_handler (awb_handler);
     75         add_handler (bnr_ee_tuning);
     76     } else {
     77         ret = XCAM_RETURN_ERROR_PARAM;
     78     }
     79 
     80     if (wavelet_tuning.ptr ()) {
     81         wavelet_tuning->set_ae_handler (ae_handler);
     82         wavelet_tuning->set_awb_handler (awb_handler);
     83         add_handler (wavelet_tuning);
     84     } else {
     85         ret = XCAM_RETURN_ERROR_PARAM;
     86     }
     87 
     88     return ret;
     89 }
     90 
     91 bool
     92 X3aAnalyzeTuner::add_handler (SmartPtr<X3aCiqTuningHandler> &handler)
     93 {
     94     XCAM_ASSERT (handler.ptr ());
     95     _handlers.push_back (handler);
     96     return true;
     97 }
     98 
     99 XCamReturn
    100 X3aAnalyzeTuner::analyze_ae (XCamAeParam &param)
    101 {
    102     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    103 
    104     XCAM_ASSERT (_analyzer.ptr ());
    105     _analyzer->update_ae_parameters (param);
    106     return ret;
    107 }
    108 
    109 XCamReturn
    110 X3aAnalyzeTuner::analyze_awb (XCamAwbParam &param)
    111 {
    112     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    113 
    114     XCAM_ASSERT (_analyzer.ptr ());
    115     _analyzer->update_awb_parameters (param);
    116     return ret;
    117 }
    118 
    119 XCamReturn
    120 X3aAnalyzeTuner::analyze_af (XCamAfParam &param)
    121 {
    122     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    123 
    124     XCAM_ASSERT (_analyzer.ptr ());
    125     _analyzer->update_af_parameters (param);
    126     return ret;
    127 }
    128 
    129 XCamReturn
    130 X3aAnalyzeTuner::analyze_common (XCamCommonParam &param)
    131 {
    132     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    133 
    134     XCAM_ASSERT (_analyzer.ptr ());
    135     _analyzer->update_common_parameters (param);
    136     return ret;
    137 }
    138 
    139 SmartPtr<AeHandler>
    140 X3aAnalyzeTuner::create_ae_handler ()
    141 {
    142     SmartPtr<AeHandler> ae_handler = new X3aCiqTuningAeHandler (this);
    143     return ae_handler;
    144 }
    145 
    146 SmartPtr<AwbHandler>
    147 X3aAnalyzeTuner::create_awb_handler ()
    148 {
    149     SmartPtr<AwbHandler> awb_handler = new X3aCiqTuningAwbHandler (this);
    150     return awb_handler;
    151 }
    152 
    153 SmartPtr<AfHandler>
    154 X3aAnalyzeTuner::create_af_handler ()
    155 {
    156     SmartPtr<AfHandler> af_handler = new X3aCiqTuningAfHandler (this);
    157     return af_handler;
    158 }
    159 
    160 SmartPtr<CommonHandler>
    161 X3aAnalyzeTuner::create_common_handler ()
    162 {
    163     SmartPtr<CommonHandler> common_handler = new X3aCiqTuningCommonHandler (this);
    164     return common_handler;
    165 }
    166 
    167 XCamReturn
    168 X3aAnalyzeTuner::internal_init (uint32_t width, uint32_t height, double framerate)
    169 {
    170     XCAM_ASSERT (_analyzer.ptr ());
    171     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    172 
    173     _analyzer->init (width, height, framerate);
    174 
    175     if (XCAM_RETURN_NO_ERROR == ret) {
    176         ret = create_tuning_handlers ();
    177     }
    178     return ret;
    179 }
    180 
    181 XCamReturn
    182 X3aAnalyzeTuner::internal_deinit ()
    183 {
    184     XCAM_ASSERT (_analyzer.ptr ());
    185     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    186 
    187     ret = _analyzer->deinit ();
    188 
    189     return ret;
    190 }
    191 
    192 XCamReturn
    193 X3aAnalyzeTuner::configure_3a ()
    194 {
    195     XCAM_ASSERT (_analyzer.ptr ());
    196     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    197 
    198     ret = _analyzer->start ();
    199 
    200     return ret;
    201 }
    202 
    203 XCamReturn
    204 X3aAnalyzeTuner::pre_3a_analyze (SmartPtr<X3aStats> &stats)
    205 {
    206     // save stats for aiq analyzer
    207     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    208     if (stats.ptr ()) {
    209         _stats = stats;
    210     }
    211     return ret;
    212 }
    213 
    214 XCamReturn
    215 X3aAnalyzeTuner::post_3a_analyze (X3aResultList &results)
    216 {
    217     XCamReturn ret = XCAM_RETURN_NO_ERROR;
    218 
    219     XCAM_ASSERT (_analyzer.ptr ());
    220     ret = _analyzer->push_3a_stats (_stats);
    221     _stats.release ();
    222 
    223     results.insert (results.end (), _results.begin (), _results.end ());
    224     _results.clear ();
    225 
    226     X3aCiqTuningHandlerList::iterator i_handler = _handlers.begin ();
    227     for (; i_handler != _handlers.end ();  ++i_handler)
    228     {
    229         (*i_handler)->analyze (results);
    230     }
    231 
    232     return ret;
    233 }
    234 
    235 void
    236 X3aAnalyzeTuner::x3a_calculation_done (XAnalyzer *analyzer, X3aResultList &results)
    237 {
    238     XCAM_UNUSED (analyzer);
    239     _results.clear ();
    240     _results.assign (results.begin (), results.end ());
    241 }
    242 
    243 };
    244 
    245