/* * 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 () { memset (this, 0, sizeof (AtomIspConfigContent)); } 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) { if (result.ptr() == NULL) return false; 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; } };