| /* |
| * x3a_isp_config.h - 3A ISP config |
| * |
| * 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> |
| */ |
| |
| #include "x3a_isp_config.h" |
| #include "isp_config_translator.h" |
| |
| namespace XCam { |
| |
| void AtomIspConfigContent::clear () |
| { |
| xcam_mem_clear (this); |
| } |
| |
| void |
| AtomIspConfigContent::copy (const struct atomisp_parameters &config) |
| { |
| xcam_mem_clear (&isp_config); |
| if (config.wb_config) { |
| wb = *config.wb_config; |
| isp_config.wb_config = &wb; |
| } |
| if (config.cc_config) { |
| cc = *config.cc_config; |
| isp_config.cc_config = &cc; |
| } |
| if (config.tnr_config) { |
| tnr = *config.tnr_config; |
| isp_config.tnr_config = &tnr; |
| } |
| if (config.ecd_config) { |
| ecd_config = *config.ecd_config; |
| isp_config.ecd_config = &ecd_config; |
| } |
| if (config.ynr_config) { |
| ynr = *config.ynr_config; |
| isp_config.ynr_config = &ynr; |
| } |
| if (config.fc_config) { |
| fc_config = *config.fc_config; |
| isp_config.fc_config = &fc_config; |
| } |
| if (config.cnr_config) { |
| cnr = *config.cnr_config; |
| isp_config.cnr_config = &cnr; |
| } |
| if (config.macc_config) { |
| macc_config = *config.macc_config; |
| isp_config.macc_config = &macc_config; |
| } |
| if (config.ctc_config) { |
| ctc_config = *config.ctc_config; |
| isp_config.ctc_config = &ctc_config; |
| } |
| if (config.formats_config) { |
| formats = *config.formats_config; |
| isp_config.formats_config = &formats; |
| } |
| if (config.aa_config) { |
| aa = *config.aa_config; |
| isp_config.aa_config = &aa; |
| } |
| if (config.baa_config) { |
| baa = *config.baa_config; |
| isp_config.baa_config = &baa; |
| } |
| if (config.ce_config) { |
| ce = *config.ce_config; |
| isp_config.ce_config = &ce; |
| } |
| if (config.dvs_6axis_config) { |
| dvs_6axis = *config.dvs_6axis_config; |
| isp_config.dvs_6axis_config = &dvs_6axis; |
| } |
| if (config.ob_config) { |
| ob = *config.ob_config; |
| isp_config.ob_config = &ob; |
| } |
| if (config.nr_config) { |
| nr = *config.nr_config; |
| isp_config.nr_config = &nr; |
| } |
| if (config.dp_config) { |
| dp = *config.dp_config; |
| isp_config.dp_config = &dp; |
| } |
| if (config.ee_config) { |
| ee = *config.ee_config; |
| isp_config.ee_config = ⅇ |
| } |
| if (config.de_config) { |
| de = *config.de_config; |
| isp_config.de_config = &de; |
| } |
| if (config.ctc_table) { |
| ctc_table = *config.ctc_table; |
| isp_config.ctc_table = &ctc_table; |
| } |
| if (config.gc_config) { |
| gc_config = *config.gc_config; |
| isp_config.gc_config = &gc_config; |
| } |
| if (config.anr_config) { |
| anr = *config.anr_config; |
| isp_config.anr_config = &anr; |
| } |
| if (config.a3a_config) { |
| a3a = *config.a3a_config; |
| isp_config.a3a_config = &a3a; |
| } |
| if (config.xnr_config) { |
| xnr = *config.xnr_config; |
| isp_config.xnr_config = &xnr; |
| } |
| if (config.dz_config) { |
| dz_config = *config.dz_config; |
| isp_config.dz_config = &dz_config; |
| } |
| if (config.yuv2rgb_cc_config) { |
| yuv2rgb_cc = *config.yuv2rgb_cc_config; |
| isp_config.yuv2rgb_cc_config = &yuv2rgb_cc; |
| } |
| if (config.rgb2yuv_cc_config) { |
| rgb2yuv_cc = *config.rgb2yuv_cc_config; |
| isp_config.rgb2yuv_cc_config = &rgb2yuv_cc; |
| } |
| if (config.macc_table) { |
| macc_table = *config.macc_table; |
| isp_config.macc_table = &macc_table; |
| } |
| if (config.gamma_table) { |
| gamma_table = *config.gamma_table; |
| isp_config.gamma_table = &gamma_table; |
| } |
| if (config.r_gamma_table) { |
| r_gamma_table = *config.r_gamma_table; |
| isp_config.r_gamma_table = &r_gamma_table; |
| } |
| if (config.g_gamma_table) { |
| g_gamma_table = *config.g_gamma_table; |
| isp_config.g_gamma_table = &g_gamma_table; |
| } |
| if (config.b_gamma_table) { |
| b_gamma_table = *config.b_gamma_table; |
| isp_config.b_gamma_table = &b_gamma_table; |
| } |
| if (config.shading_table) { |
| shading_table = *config.shading_table; |
| isp_config.shading_table = &shading_table; |
| } |
| if (config.morph_table) { |
| morph_table = *config.morph_table; |
| isp_config.morph_table = &morph_table; |
| } |
| if (config.xnr_table) { |
| xnr_table = *config.xnr_table; |
| isp_config.xnr_table = &xnr_table; |
| } |
| if (config.anr_thres) { |
| anr_thres = *config.anr_thres; |
| isp_config.anr_thres = &anr_thres; |
| } |
| if (config.motion_vector) { |
| motion_vector = *config.motion_vector; |
| isp_config.motion_vector = &motion_vector; |
| } |
| } |
| |
| X3aIspConfig::X3aIspConfig () |
| { |
| } |
| |
| X3aIspConfig::~X3aIspConfig() |
| { |
| clear (); |
| } |
| |
| |
| bool X3aIspConfig::clear() |
| { |
| _isp_content.clear (); |
| _3a_results.clear (); |
| return true; |
| } |
| |
| bool |
| X3aIspConfig::attach (SmartPtr<X3aResult> &result, IspConfigTranslator *translator) |
| { |
| uint32_t type = result->get_type (); |
| |
| XCAM_ASSERT (translator); |
| |
| if (!result.ptr() || !result->get_ptr ()) { |
| XCAM_LOG_ERROR ("3A result empty"); |
| return false; |
| } |
| switch (type) { |
| case X3aIspConfig::IspAllParameters: { |
| SmartPtr<X3aAtomIspParametersResult> isp_3a = |
| result.dynamic_cast_ptr<X3aAtomIspParametersResult> (); |
| XCAM_ASSERT (isp_3a.ptr ()); |
| _isp_content.copy (isp_3a->get_isp_config()); |
| } |
| break; |
| |
| case XCAM_3A_RESULT_WHITE_BALANCE: { |
| struct atomisp_wb_config wb; |
| SmartPtr<X3aWhiteBalanceResult> wb_res = |
| result.dynamic_cast_ptr<X3aWhiteBalanceResult> (); |
| XCAM_ASSERT (wb_res.ptr ()); |
| xcam_mem_clear (&wb); |
| if (translator->translate_white_balance (wb_res->get_standard_result(), wb) |
| != XCAM_RETURN_NO_ERROR) { |
| XCAM_LOG_WARNING ("translate white balance failed"); |
| return false; |
| } |
| _isp_content.wb = wb; |
| _isp_content.isp_config.wb_config = &_isp_content.wb; |
| } |
| break; |
| case XCAM_3A_RESULT_BLACK_LEVEL: { |
| struct atomisp_ob_config ob; |
| SmartPtr<X3aBlackLevelResult> bl_res = |
| result.dynamic_cast_ptr<X3aBlackLevelResult> (); |
| XCAM_ASSERT (bl_res.ptr ()); |
| xcam_mem_clear (&ob); |
| if (translator->translate_black_level (bl_res->get_standard_result(), ob) |
| != XCAM_RETURN_NO_ERROR) { |
| XCAM_LOG_WARNING ("translate black level failed"); |
| return false; |
| } |
| _isp_content.ob = ob; |
| _isp_content.isp_config.ob_config = &_isp_content.ob; |
| } |
| break; |
| case XCAM_3A_RESULT_YUV2RGB_MATRIX: |
| case XCAM_3A_RESULT_RGB2YUV_MATRIX: |
| { |
| struct atomisp_cc_config cc; |
| SmartPtr<X3aColorMatrixResult> cc_res = |
| result.dynamic_cast_ptr<X3aColorMatrixResult> (); |
| XCAM_ASSERT (cc_res.ptr ()); |
| xcam_mem_clear (&cc); |
| if (translator->translate_color_matrix (cc_res->get_standard_result(), cc) |
| != XCAM_RETURN_NO_ERROR) { |
| XCAM_LOG_WARNING ("translate color matrix failed"); |
| return false; |
| } |
| if (type == XCAM_3A_RESULT_YUV2RGB_MATRIX) { |
| _isp_content.yuv2rgb_cc = cc; |
| _isp_content.isp_config.yuv2rgb_cc_config = &_isp_content.yuv2rgb_cc; |
| } else { |
| _isp_content.rgb2yuv_cc = cc; |
| _isp_content.isp_config.rgb2yuv_cc_config = &_isp_content.rgb2yuv_cc; |
| } |
| } |
| break; |
| default: |
| return false; |
| } |
| |
| _3a_results.push_back (result); |
| return true; |
| } |
| |
| }; |
| |