• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * aiq_handler.h - AIQ handler
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  #ifndef XCAM_AIQ_HANDLER_H
22  #define XCAM_AIQ_HANDLER_H
23  
24  #include <xcam_std.h>
25  #include "handler_interface.h"
26  #include "x3a_statistics_queue.h"
27  #include "ia_types.h"
28  #include "ia_aiq_types.h"
29  #include "ia_cmc_parser.h"
30  #include "ia_mkn_encoder.h"
31  #include "ia_aiq.h"
32  #include "ia_coordinate.h"
33  
34  typedef struct ia_isp_t ia_isp;
35  
36  namespace XCam {
37  
38  class AiqCompositor;
39  struct IspInputParameters;
40  
41  class IaIspAdaptor {
42  public:
IaIspAdaptor()43      explicit IaIspAdaptor()
44          : _handle (NULL)
45      {}
~IaIspAdaptor()46      virtual ~IaIspAdaptor() {}
47  
48      virtual bool init (
49          const ia_binary_data *cpf,
50          unsigned int max_width,
51          unsigned int max_height,
52          ia_cmc_t *cmc,
53          ia_mkn *mkn) = 0;
54      virtual bool convert_statistics (
55          void *statistics,
56          ia_aiq_rgbs_grid **out_rgbs_grid,
57          ia_aiq_af_grid **out_af_grid) = 0;
58      virtual bool run (
59          const IspInputParameters *isp_input_params,
60          ia_binary_data *output_data) = 0;
61  
62  private:
63      XCAM_DEAD_COPY (IaIspAdaptor);
64  
65  protected:
66      ia_isp *_handle;
67  };
68  
69  class AiqAeHandler
70      : public AeHandler
71  {
72      friend class AiqCompositor;
73  private:
74      struct AiqAeResult {
75          ia_aiq_ae_results                 ae_result;
76          ia_aiq_ae_exposure_result         ae_exp_ret;
77          ia_aiq_exposure_parameters        aiq_exp_param;
78          ia_aiq_exposure_sensor_parameters sensor_exp_param;
79          ia_aiq_hist_weight_grid           weight_grid;
80          ia_aiq_flash_parameters           flash_param;
81  
82          AiqAeResult();
83          void copy (ia_aiq_ae_results *result);
84  
85          XCAM_DEAD_COPY (AiqAeResult);
86      };
87  
88  public:
89      explicit AiqAeHandler (SmartPtr<AiqCompositor> &aiq_compositor);
~AiqAeHandler()90      ~AiqAeHandler () {}
91  
is_started()92      bool is_started () const {
93          return _started;
94      }
95  
96      bool set_description (struct atomisp_sensor_mode_data *sensor_mode_data);
97  
get_result()98      ia_aiq_ae_results *get_result () {
99          return &_result.ae_result;
100      }
101  
102      //virtual functions from AnalyzerHandler
103      virtual XCamReturn analyze (X3aResultList &output);
104  
105      // virtual functions from AeHandler
106      virtual XCamFlickerMode get_flicker_mode ();
107      virtual int64_t get_current_exposure_time ();
108      virtual double get_current_analog_gain ();
109      virtual double get_max_analog_gain ();
110  
111      XCamReturn set_RGBS_weight_grid (ia_aiq_rgbs_grid **out_rgbs_grid);
112      XCamReturn set_hist_weight_grid (ia_aiq_hist_weight_grid **out_weight_grid);
113      XCamReturn dump_hist_weight_grid (const ia_aiq_hist_weight_grid *weight_grid);
114      XCamReturn dump_RGBS_grid (const ia_aiq_rgbs_grid *rgbs_grid);
115  
116  private:
117      bool ensure_ia_parameters ();
118      bool ensure_ae_mode ();
119      bool ensure_ae_metering_mode ();
120      bool ensure_ae_priority_mode ();
121      bool ensure_ae_flicker_mode ();
122      bool ensure_ae_manual ();
123      bool ensure_ae_ev_shift ();
124  
125      void adjust_ae_speed (
126          ia_aiq_exposure_sensor_parameters &cur_res,
127          ia_aiq_exposure_parameters &cur_aiq_exp,
128          const ia_aiq_exposure_sensor_parameters &last_res, double ae_speed);
129      void adjust_ae_limitation (ia_aiq_exposure_sensor_parameters &cur_res,
130                                 ia_aiq_exposure_parameters &cur_aiq_exp);
131      bool manual_control_result (
132          ia_aiq_exposure_sensor_parameters &cur_res,
133          ia_aiq_exposure_parameters &cur_aiq_exp,
134          const ia_aiq_exposure_sensor_parameters &last_res);
135  
136      SmartPtr<X3aResult> pop_result ();
137  
138      static void convert_xcam_window_to_ia (const XCam3AWindow &window, ia_rectangle &ia_window);
139  
140  private:
141      XCAM_DEAD_COPY (AiqAeHandler);
142  
143  protected:
144      SmartPtr<AiqCompositor>           _aiq_compositor;
145      /* AIQ */
146      ia_rectangle                      _ia_ae_window;
147      ia_aiq_exposure_sensor_descriptor _sensor_descriptor;
148      ia_aiq_ae_manual_limits           _manual_limits;
149  
150      ia_aiq_ae_input_params            _input;
151  
152      /* result */
153      AiqAeResult                       _result;
154      uint32_t                          _calculate_period;
155      bool                              _started;
156  };
157  
158  class AiqAwbHandler
159      : public AwbHandler
160  {
161      friend class AiqCompositor;
162  public:
163      explicit AiqAwbHandler (SmartPtr<AiqCompositor> &aiq_compositor);
~AiqAwbHandler()164      ~AiqAwbHandler () {}
165  
166      virtual XCamReturn analyze (X3aResultList &output);
167  
168      // virtual functions from AwbHandler
169      virtual uint32_t get_current_estimate_cct ();
170  
get_result()171      ia_aiq_awb_results *get_result () {
172          return &_result;
173      }
is_started()174      bool is_started () const {
175          return _started;
176      }
177  
178  private:
179      bool ensure_ia_parameters ();
180      bool ensure_awb_mode ();
181      void adjust_speed (const ia_aiq_awb_results &last_ret);
182  
183      XCAM_DEAD_COPY (AiqAwbHandler);
184  
185  protected:
186      SmartPtr<AiqCompositor>     _aiq_compositor;
187      /*aiq*/
188      ia_aiq_awb_input_params     _input;
189      ia_aiq_awb_manual_cct_range _cct_range;
190  
191      ia_aiq_awb_results          _result;
192      ia_aiq_awb_results          _history_result;
193      bool                        _started;
194  };
195  
196  class AiqAfHandler
197      : public AfHandler
198  {
199  public:
AiqAfHandler(SmartPtr<AiqCompositor> & aiq_compositor)200      explicit AiqAfHandler (SmartPtr<AiqCompositor> &aiq_compositor)
201          : _aiq_compositor (aiq_compositor)
202      {}
~AiqAfHandler()203      ~AiqAfHandler () {}
204  
205      virtual XCamReturn analyze (X3aResultList &output);
206  
207  private:
208      XCAM_DEAD_COPY (AiqAfHandler);
209  
210  protected:
211      SmartPtr<AiqCompositor>        _aiq_compositor;
212  };
213  
214  class AiqCommonHandler
215      : public CommonHandler
216  {
217      friend class AiqCompositor;
218  public:
219      explicit AiqCommonHandler (SmartPtr<AiqCompositor> &aiq_compositor);
~AiqCommonHandler()220      ~AiqCommonHandler () {}
221  
222      virtual XCamReturn analyze (X3aResultList &output);
get_gbce_result()223      ia_aiq_gbce_results *get_gbce_result () {
224          return _gbce_result;
225      }
get_color_effect()226      XCamColorEffect get_color_effect() {
227          return _params.color_effect;
228      }
229  
230  private:
231      XCAM_DEAD_COPY (AiqCommonHandler);
232  
233  protected:
234      SmartPtr<AiqCompositor>     _aiq_compositor;
235      ia_aiq_gbce_results        *_gbce_result;
236  };
237  
238  class AiqCompositor {
239  public:
240      explicit AiqCompositor ();
241      ~AiqCompositor ();
242  
243      void set_ae_handler (SmartPtr<AiqAeHandler> &handler);
244      void set_awb_handler (SmartPtr<AiqAwbHandler> &handler);
245      void set_af_handler (SmartPtr<AiqAfHandler> &handler);
246      void set_common_handler (SmartPtr<AiqCommonHandler> &handler);
247  
set_frame_use(ia_aiq_frame_use value)248      void set_frame_use (ia_aiq_frame_use value) {
249          _frame_use = value;
250      }
set_size(uint32_t width,uint32_t height)251      void set_size (uint32_t width, uint32_t height) {
252          _width = width;
253          _height = height;
254      }
get_size(uint32_t & out_width,uint32_t & out_height)255      void get_size (uint32_t &out_width, uint32_t &out_height) const {
256          out_width = _width;
257          out_height = _height;
258      }
set_framerate(double framerate)259      void set_framerate (double framerate) {
260          _framerate = framerate;
261      }
get_framerate()262      double get_framerate () {
263          return _framerate;
264      }
265      bool open (ia_binary_data &cpf);
266      void close ();
267  
268      bool set_sensor_mode_data (struct atomisp_sensor_mode_data *sensor_mode);
269      bool set_3a_stats (SmartPtr<X3aIspStatistics> &stats);
270  
get_handle()271      ia_aiq  * get_handle () {
272          return _ia_handle;
273      }
get_frame_use()274      ia_aiq_frame_use get_frame_use () const {
275          return _frame_use;
276      }
277  
278      XCamReturn integrate (  X3aResultList &results);
279  
280      SmartPtr<X3aResult> generate_3a_configs (struct atomisp_parameters *parameters);
281      void convert_window_to_ia (const XCam3AWindow &window, ia_rectangle &ia_window);
282      XCamReturn convert_color_effect (IspInputParameters &isp_input);
283  
get_ae_ev_shift_unlock()284      double get_ae_ev_shift_unlock () {
285          return _ae_handler->get_ev_shift_unlock();
286      }
287  
288  private:
289      XCamReturn apply_gamma_table (struct atomisp_parameters *isp_param);
290      XCamReturn apply_night_mode (struct atomisp_parameters *isp_param);
291      XCamReturn limit_nr_levels (struct atomisp_parameters *isp_param);
292      double calculate_value_by_factor (double factor, double min, double mid, double max);
293  
294      XCAM_DEAD_COPY (AiqCompositor);
295  
296  private:
297      SmartPtr<IaIspAdaptor>     _adaptor;
298      SmartPtr<AiqAeHandler>     _ae_handler;
299      SmartPtr<AiqAwbHandler>    _awb_handler;
300      SmartPtr<AiqAfHandler>     _af_handler;
301      SmartPtr<AiqCommonHandler> _common_handler;
302      ia_aiq                    *_ia_handle;
303      ia_mkn                    *_ia_mkn;
304      ia_aiq_pa_results         *_pa_result;
305  #ifdef HAVE_AIQ_2_7
306      ia_aiq_sa_results         *_sa_result;
307  #endif
308      ia_aiq_frame_use           _frame_use;
309      ia_aiq_frame_params        _frame_params;
310  
311      /*grids*/
312      ;
313  
314      uint32_t                   _width;
315      uint32_t                   _height;
316      double                     _framerate;
317  };
318  
319  };
320  
321  #endif //XCAM_AIQ_HANDLER_H
322