1 /*
2 * rk_aiq_algo_accm_itf.c
3 *
4 * Copyright (c) 2019 Rockchip 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 */
19
20 #include "accm/rk_aiq_algo_accm_itf.h"
21
22 #include "accm/rk_aiq_accm_algo.h"
23 #include "rk_aiq_algo_types.h"
24 #include "xcam_log.h"
25
26 RKAIQ_BEGIN_DECLARE
27
28 static XCamReturn
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)29 create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
30 {
31 XCamReturn ret = XCAM_RETURN_NO_ERROR;
32 LOG1_ACCM( "%s: (enter)\n", __FUNCTION__);
33 RkAiqAlgoContext *ctx = new RkAiqAlgoContext();
34 if (ctx == NULL) {
35 LOGE_ACCM( "%s: create ccm context fail!\n", __FUNCTION__);
36 return XCAM_RETURN_ERROR_MEM;
37 }
38 ret = AccmInit(&ctx->accm_para, cfg->calibv2);
39
40 *context = ctx;
41
42 LOG1_ACCM( "%s: (exit)\n", __FUNCTION__);
43 return ret;
44 }
45
46 static XCamReturn
destroy_context(RkAiqAlgoContext * context)47 destroy_context(RkAiqAlgoContext *context)
48 {
49 LOG1_ACCM( "%s: (enter)\n", __FUNCTION__);
50
51 AccmRelease((accm_handle_t)context->accm_para);
52 delete context;
53 LOG1_ACCM( "%s: (exit)\n", __FUNCTION__);
54 return XCAM_RETURN_NO_ERROR;
55 }
56
57 static XCamReturn
prepare(RkAiqAlgoCom * params)58 prepare(RkAiqAlgoCom* params)
59 {
60 LOG1_ACCM( "%s: (enter)\n", __FUNCTION__);
61 accm_handle_t hAccm = (accm_handle_t)(params->ctx->accm_para);
62 //RkAiqAlgoConfigAccmInt *para = (RkAiqAlgoConfigAccmInt*)params;
63 hAccm->accmSwInfo.prepare_type = params->u.prepare.conf_type;
64 if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)){
65 RkAiqAlgoConfigAccm* confPara = (RkAiqAlgoConfigAccm*)params;
66 #if RKAIQ_HAVE_CCM_V1
67 hAccm->ccm_v1 = (CalibDbV2_Ccm_Para_V2_t*)(CALIBDBV2_GET_MODULE_PTR(
68 confPara->com.u.prepare.calibv2, ccm_calib));
69 #endif
70
71 #if RKAIQ_HAVE_CCM_V2
72 hAccm->ccm_v2 = (CalibDbV2_Ccm_Para_V32_t*)(CALIBDBV2_GET_MODULE_PTR(
73 confPara->com.u.prepare.calibv2, ccm_calib_v2));
74 #endif
75 }
76 AccmPrepare((accm_handle_t)(params->ctx->accm_para));
77
78 LOG1_ACCM( "%s: (exit)\n", __FUNCTION__);
79 return XCAM_RETURN_NO_ERROR;
80 }
81
82 static XCamReturn
pre_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)83 pre_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
84 {
85 LOG1_ACCM( "%s: (enter)\n", __FUNCTION__);
86 AccmPreProc((accm_handle_t)(inparams->ctx->accm_para));
87
88 LOG1_ACCM( "%s: (exit)\n", __FUNCTION__);
89 return XCAM_RETURN_NO_ERROR;
90 }
91
92 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)93 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
94 {
95 LOG1_ACCM( "%s: (enter)\n", __FUNCTION__);
96
97 RkAiqAlgoProcAccm *procAccm = (RkAiqAlgoProcAccm*)inparams;
98 RkAiqAlgoProcResAccm *proResAccm = (RkAiqAlgoProcResAccm*)outparams;
99 accm_handle_t hAccm = (accm_handle_t)(inparams->ctx->accm_para);
100
101 hAccm->isReCal_ = hAccm->isReCal_ ||
102 (procAccm->accm_sw_info.grayMode != procAccm->com.u.proc.gray_mode);
103 procAccm->accm_sw_info.grayMode = procAccm->com.u.proc.gray_mode;
104 procAccm->accm_sw_info.ccmConverged = hAccm->accmSwInfo.ccmConverged;
105 hAccm->accmSwInfo = procAccm->accm_sw_info;
106 //LOGI_ACCM( "%s accm_proc_com.u.init:%d \n", __FUNCTION__, inparams->u.proc.init);
107 LOGD_ACCM( "%s: awbIIRDampCoef:%f\n", __FUNCTION__, hAccm->accmSwInfo.awbIIRDampCoef);
108
109 AccmConfig(hAccm);
110 proResAccm->res_com.cfg_update = hAccm->isReCal_;
111 #if defined(ISP_HW_V32) || defined(ISP_HW_V32_LITE)
112 if (proResAccm->res_com.cfg_update)
113 memcpy(proResAccm->accm_hw_conf_v2, &hAccm->ccmHwConf_v2, sizeof(rk_aiq_ccm_cfg_v2_t));
114 #else
115 if (proResAccm->res_com.cfg_update)
116 memcpy(proResAccm->accm_hw_conf, &hAccm->ccmHwConf, sizeof(rk_aiq_ccm_cfg_t));
117 #endif
118 hAccm->isReCal_ = false;
119 LOG1_ACCM( "%s: (exit)\n", __FUNCTION__);
120 return XCAM_RETURN_NO_ERROR;
121 }
122
123 static XCamReturn
post_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)124 post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
125 {
126 LOG1_ACCM( "%s: (enter)\n", __FUNCTION__);
127
128 LOG1_ACCM( "%s: (exit)\n", __FUNCTION__);
129 return XCAM_RETURN_NO_ERROR;
130
131 }
132
133 RkAiqAlgoDescription g_RkIspAlgoDescAccm = {
134 .common = {
135 .version = RKISP_ALGO_ACCM_VERSION,
136 .vendor = RKISP_ALGO_ACCM_VENDOR,
137 .description = RKISP_ALGO_ACCM_DESCRIPTION,
138 .type = RK_AIQ_ALGO_TYPE_ACCM,
139 .id = 0,
140 .create_context = create_context,
141 .destroy_context = destroy_context,
142 },
143 .prepare = prepare,
144 .pre_process = NULL,
145 .processing = processing,
146 .post_process = NULL,
147 };
148
149 RKAIQ_END_DECLARE
150