/* * aiq_handler.h - AIQ handler * * Copyright (c) 2014-2015 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Author: Wind Yuan <feng.yuan@intel.com> */ #ifndef XCAM_AIQ_HANDLER_H #define XCAM_AIQ_HANDLER_H #include <xcam_std.h> #include "handler_interface.h" #include "x3a_statistics_queue.h" #include "ia_types.h" #include "ia_aiq_types.h" #include "ia_cmc_parser.h" #include "ia_mkn_encoder.h" #include "ia_aiq.h" #include "ia_coordinate.h" typedef struct ia_isp_t ia_isp; namespace XCam { class AiqCompositor; struct IspInputParameters; class IaIspAdaptor { public: explicit IaIspAdaptor() : _handle (NULL) {} virtual ~IaIspAdaptor() {} virtual bool init ( const ia_binary_data *cpf, unsigned int max_width, unsigned int max_height, ia_cmc_t *cmc, ia_mkn *mkn) = 0; virtual bool convert_statistics ( void *statistics, ia_aiq_rgbs_grid **out_rgbs_grid, ia_aiq_af_grid **out_af_grid) = 0; virtual bool run ( const IspInputParameters *isp_input_params, ia_binary_data *output_data) = 0; private: XCAM_DEAD_COPY (IaIspAdaptor); protected: ia_isp *_handle; }; class AiqAeHandler : public AeHandler { friend class AiqCompositor; private: struct AiqAeResult { ia_aiq_ae_results ae_result; ia_aiq_ae_exposure_result ae_exp_ret; ia_aiq_exposure_parameters aiq_exp_param; ia_aiq_exposure_sensor_parameters sensor_exp_param; ia_aiq_hist_weight_grid weight_grid; ia_aiq_flash_parameters flash_param; AiqAeResult(); void copy (ia_aiq_ae_results *result); XCAM_DEAD_COPY (AiqAeResult); }; public: explicit AiqAeHandler (SmartPtr<AiqCompositor> &aiq_compositor); ~AiqAeHandler () {} bool is_started () const { return _started; } bool set_description (struct atomisp_sensor_mode_data *sensor_mode_data); ia_aiq_ae_results *get_result () { return &_result.ae_result; } //virtual functions from AnalyzerHandler virtual XCamReturn analyze (X3aResultList &output); // virtual functions from AeHandler virtual XCamFlickerMode get_flicker_mode (); virtual int64_t get_current_exposure_time (); virtual double get_current_analog_gain (); virtual double get_max_analog_gain (); XCamReturn set_RGBS_weight_grid (ia_aiq_rgbs_grid **out_rgbs_grid); XCamReturn set_hist_weight_grid (ia_aiq_hist_weight_grid **out_weight_grid); XCamReturn dump_hist_weight_grid (const ia_aiq_hist_weight_grid *weight_grid); XCamReturn dump_RGBS_grid (const ia_aiq_rgbs_grid *rgbs_grid); private: bool ensure_ia_parameters (); bool ensure_ae_mode (); bool ensure_ae_metering_mode (); bool ensure_ae_priority_mode (); bool ensure_ae_flicker_mode (); bool ensure_ae_manual (); bool ensure_ae_ev_shift (); void adjust_ae_speed ( ia_aiq_exposure_sensor_parameters &cur_res, ia_aiq_exposure_parameters &cur_aiq_exp, const ia_aiq_exposure_sensor_parameters &last_res, double ae_speed); void adjust_ae_limitation (ia_aiq_exposure_sensor_parameters &cur_res, ia_aiq_exposure_parameters &cur_aiq_exp); bool manual_control_result ( ia_aiq_exposure_sensor_parameters &cur_res, ia_aiq_exposure_parameters &cur_aiq_exp, const ia_aiq_exposure_sensor_parameters &last_res); SmartPtr<X3aResult> pop_result (); static void convert_xcam_window_to_ia (const XCam3AWindow &window, ia_rectangle &ia_window); private: XCAM_DEAD_COPY (AiqAeHandler); protected: SmartPtr<AiqCompositor> _aiq_compositor; /* AIQ */ ia_rectangle _ia_ae_window; ia_aiq_exposure_sensor_descriptor _sensor_descriptor; ia_aiq_ae_manual_limits _manual_limits; ia_aiq_ae_input_params _input; /* result */ AiqAeResult _result; uint32_t _calculate_period; bool _started; }; class AiqAwbHandler : public AwbHandler { friend class AiqCompositor; public: explicit AiqAwbHandler (SmartPtr<AiqCompositor> &aiq_compositor); ~AiqAwbHandler () {} virtual XCamReturn analyze (X3aResultList &output); // virtual functions from AwbHandler virtual uint32_t get_current_estimate_cct (); ia_aiq_awb_results *get_result () { return &_result; } bool is_started () const { return _started; } private: bool ensure_ia_parameters (); bool ensure_awb_mode (); void adjust_speed (const ia_aiq_awb_results &last_ret); XCAM_DEAD_COPY (AiqAwbHandler); protected: SmartPtr<AiqCompositor> _aiq_compositor; /*aiq*/ ia_aiq_awb_input_params _input; ia_aiq_awb_manual_cct_range _cct_range; ia_aiq_awb_results _result; ia_aiq_awb_results _history_result; bool _started; }; class AiqAfHandler : public AfHandler { public: explicit AiqAfHandler (SmartPtr<AiqCompositor> &aiq_compositor) : _aiq_compositor (aiq_compositor) {} ~AiqAfHandler () {} virtual XCamReturn analyze (X3aResultList &output); private: XCAM_DEAD_COPY (AiqAfHandler); protected: SmartPtr<AiqCompositor> _aiq_compositor; }; class AiqCommonHandler : public CommonHandler { friend class AiqCompositor; public: explicit AiqCommonHandler (SmartPtr<AiqCompositor> &aiq_compositor); ~AiqCommonHandler () {} virtual XCamReturn analyze (X3aResultList &output); ia_aiq_gbce_results *get_gbce_result () { return _gbce_result; } XCamColorEffect get_color_effect() { return _params.color_effect; } private: XCAM_DEAD_COPY (AiqCommonHandler); protected: SmartPtr<AiqCompositor> _aiq_compositor; ia_aiq_gbce_results *_gbce_result; }; class AiqCompositor { public: explicit AiqCompositor (); ~AiqCompositor (); void set_ae_handler (SmartPtr<AiqAeHandler> &handler); void set_awb_handler (SmartPtr<AiqAwbHandler> &handler); void set_af_handler (SmartPtr<AiqAfHandler> &handler); void set_common_handler (SmartPtr<AiqCommonHandler> &handler); void set_frame_use (ia_aiq_frame_use value) { _frame_use = value; } void set_size (uint32_t width, uint32_t height) { _width = width; _height = height; } void get_size (uint32_t &out_width, uint32_t &out_height) const { out_width = _width; out_height = _height; } void set_framerate (double framerate) { _framerate = framerate; } double get_framerate () { return _framerate; } bool open (ia_binary_data &cpf); void close (); bool set_sensor_mode_data (struct atomisp_sensor_mode_data *sensor_mode); bool set_3a_stats (SmartPtr<X3aIspStatistics> &stats); ia_aiq * get_handle () { return _ia_handle; } ia_aiq_frame_use get_frame_use () const { return _frame_use; } XCamReturn integrate ( X3aResultList &results); SmartPtr<X3aResult> generate_3a_configs (struct atomisp_parameters *parameters); void convert_window_to_ia (const XCam3AWindow &window, ia_rectangle &ia_window); XCamReturn convert_color_effect (IspInputParameters &isp_input); double get_ae_ev_shift_unlock () { return _ae_handler->get_ev_shift_unlock(); } private: XCamReturn apply_gamma_table (struct atomisp_parameters *isp_param); XCamReturn apply_night_mode (struct atomisp_parameters *isp_param); XCamReturn limit_nr_levels (struct atomisp_parameters *isp_param); double calculate_value_by_factor (double factor, double min, double mid, double max); XCAM_DEAD_COPY (AiqCompositor); private: SmartPtr<IaIspAdaptor> _adaptor; SmartPtr<AiqAeHandler> _ae_handler; SmartPtr<AiqAwbHandler> _awb_handler; SmartPtr<AiqAfHandler> _af_handler; SmartPtr<AiqCommonHandler> _common_handler; ia_aiq *_ia_handle; ia_mkn *_ia_mkn; ia_aiq_pa_results *_pa_result; #ifdef HAVE_AIQ_2_7 ia_aiq_sa_results *_sa_result; #endif ia_aiq_frame_use _frame_use; ia_aiq_frame_params _frame_params; /*grids*/ ; uint32_t _width; uint32_t _height; double _framerate; }; }; #endif //XCAM_AIQ_HANDLER_H