/* * rk_aiq_algo_aie_itf.c * * Copyright (c) 2019 Rockchip 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. * */ #include "aie/rk_aiq_algo_aie_itf.h" #include "rk_aiq_types_algo_aie_prvt.h" RKAIQ_BEGIN_DECLARE static XCamReturn create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg) { RkAiqAlgoContext *ctx = new RkAiqAlgoContext(); if (ctx == NULL) { LOGE_AIE( "%s: create aie context fail!\n", __FUNCTION__); return XCAM_RETURN_ERROR_MEM; } memset(ctx, 0, sizeof(RkAiqAlgoContext)); AlgoCtxInstanceCfgInt *cfgInt = (AlgoCtxInstanceCfgInt*)cfg; ctx->calib = cfgInt->calib; ctx->calibv2 = cfgInt->calibv2; if (ctx->calib) { CalibDb_IE_t *calib_ie = (CalibDb_IE_t*)(CALIBDB_GET_MODULE_PTR(ctx->calib, ie)); ctx->params.mode = (rk_aiq_ie_effect_t)calib_ie->mode; } else if (ctx->calibv2) { CalibDbV2_IE_t* calibv2_ie = (CalibDbV2_IE_t*)(CALIBDBV2_GET_MODULE_PTR(ctx->calibv2, ie)); ctx->params.mode = (rk_aiq_ie_effect_t)calibv2_ie->param.mode; } // default value ctx->emboss_params.mode_coeffs[0] = 0x9;// 2 ctx->emboss_params.mode_coeffs[1] = 0x0;// 0 ctx->emboss_params.mode_coeffs[2] = 0x0;// 0 ctx->emboss_params.mode_coeffs[3] = 0x8;// 1 ctx->emboss_params.mode_coeffs[4] = 0x0;// 0 ctx->emboss_params.mode_coeffs[5] = 0xc;// -1 ctx->emboss_params.mode_coeffs[6] = 0x0;// 0x0 ctx->emboss_params.mode_coeffs[7] = 0xc;// -1 ctx->emboss_params.mode_coeffs[8] = 0x9;// 2 ctx->sketch_params.mode_coeffs[0] = 0xc;//-1 ctx->sketch_params.mode_coeffs[1] = 0xc;//-1 ctx->sketch_params.mode_coeffs[2] = 0xc;//-1 ctx->sketch_params.mode_coeffs[3] = 0xc;//-1 ctx->sketch_params.mode_coeffs[4] = 0xb;// 0x8 ctx->sketch_params.mode_coeffs[5] = 0xc;//-1 ctx->sketch_params.mode_coeffs[6] = 0xc;//-1 ctx->sketch_params.mode_coeffs[7] = 0xc;//-1 ctx->sketch_params.mode_coeffs[8] = 0xc;//-1 ctx->sharp_params.mode_coeffs[0] = 0xc;//-1 ctx->sharp_params.mode_coeffs[1] = 0xc;//-1 ctx->sharp_params.mode_coeffs[2] = 0xc;//-1 ctx->sharp_params.mode_coeffs[3] = 0xc;//-1 ctx->sharp_params.mode_coeffs[4] = 0xb;// 0x8 ctx->sharp_params.mode_coeffs[5] = 0xc;//-1 ctx->sharp_params.mode_coeffs[6] = 0xc;//-1 ctx->sharp_params.mode_coeffs[7] = 0xc;//-1 ctx->sharp_params.mode_coeffs[8] = 0xc;//-1 ctx->sharp_params.sharp_factor = 8.0; ctx->sharp_params.sharp_thres = 128; *context = ctx; return XCAM_RETURN_NO_ERROR; } static XCamReturn destroy_context(RkAiqAlgoContext *context) { delete context; context = NULL; return XCAM_RETURN_NO_ERROR; } static XCamReturn prepare(RkAiqAlgoCom* params) { if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)){ RkAiqAlgoConfigAieInt* confPara = (RkAiqAlgoConfigAieInt*)params; RkAiqAlgoContext *ctx = params->ctx; ctx->calib = confPara->rk_com.u.prepare.calib; ctx->calibv2 = confPara->rk_com.u.prepare.calibv2; if (ctx->calib) { CalibDb_IE_t *calib_ie = (CalibDb_IE_t*)(CALIBDB_GET_MODULE_PTR(ctx->calib, ie)); ctx->params.mode = (rk_aiq_ie_effect_t)calib_ie->mode; } else if (ctx->calibv2) { CalibDbV2_IE_t* calibv2_ie = (CalibDbV2_IE_t*)(CALIBDBV2_GET_MODULE_PTR(ctx->calibv2, ie)); ctx->params.mode = (rk_aiq_ie_effect_t)calibv2_ie->param.mode; } } return XCAM_RETURN_NO_ERROR; } static XCamReturn pre_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) { RkAiqAlgoContext *ctx = inparams->ctx; RkAiqAlgoPreAieInt* pAiePreParams = (RkAiqAlgoPreAieInt*)inparams; // force gray_mode by aiq framework if (pAiePreParams->rk_com.u.proc.gray_mode && ctx->params.mode != RK_AIQ_IE_EFFECT_BW) { ctx->last_params = ctx->params; ctx->params.mode = RK_AIQ_IE_EFFECT_BW; ctx->skip_frame = 10; } else if (!pAiePreParams->rk_com.u.proc.gray_mode && ctx->params.mode == RK_AIQ_IE_EFFECT_BW) { // force non gray_mode by aiq framework if (ctx->skip_frame && --ctx->skip_frame == 0) ctx->params = ctx->last_params; } return XCAM_RETURN_NO_ERROR; } static XCamReturn processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) { RkAiqAlgoContext *ctx = inparams->ctx; RkAiqAlgoProcResAieInt* res_int = (RkAiqAlgoProcResAieInt*)outparams; RkAiqAlgoProcResAie* res = (RkAiqAlgoProcResAie*)outparams; res->params = ctx->params; rk_aiq_aie_params_int_t* int_params = NULL; switch (ctx->params.mode) { case RK_AIQ_IE_EFFECT_EMBOSS : int_params = &ctx->emboss_params; break; case RK_AIQ_IE_EFFECT_SKETCH : int_params = &ctx->sketch_params; break; case RK_AIQ_IE_EFFECT_SHARPEN : /*!< deprecated */ int_params = &ctx->sharp_params; break; default: break; } if (int_params) res_int->params = *int_params; return XCAM_RETURN_NO_ERROR; } static XCamReturn post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams) { return XCAM_RETURN_NO_ERROR; } RkAiqAlgoDescription g_RkIspAlgoDescAie = { .common = { .version = RKISP_ALGO_AIE_VERSION, .vendor = RKISP_ALGO_AIE_VENDOR, .description = RKISP_ALGO_AIE_DESCRIPTION, .type = RK_AIQ_ALGO_TYPE_AIE, .id = 0, .create_context = create_context, .destroy_context = destroy_context, }, .prepare = prepare, .pre_process = pre_process, .processing = processing, .post_process = post_process, }; RKAIQ_END_DECLARE