1 /*
2 * rk_aiq_algo_camgroup_a3dlut_itf.c
3 *
4 * Copyright (c) 2021 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 "rk_aiq_algo_camgroup_types.h"
21 #include "misc/rk_aiq_algo_camgroup_misc_itf.h"
22 #include "a3dlut/rk_aiq_algo_a3dlut_itf.h"
23 #include "a3dlut/rk_aiq_a3dlut_algo.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 LOG1_A3DLUT( "%s: (enter)\n", __FUNCTION__);
32
33 AlgoCtxInstanceCfgCamGroup *cfgInt = (AlgoCtxInstanceCfgCamGroup*)cfg;
34 RkAiqAlgoContext *ctx = new RkAiqAlgoContext();
35 if (ctx == NULL) {
36 LOGE_A3DLUT( "%s: create camgroup a3dlut context fail!\n", __FUNCTION__);
37 return XCAM_RETURN_ERROR_MEM;
38 }
39 Alut3dInit(&ctx->a3dlut_para, cfgInt->s_calibv2);
40 *context = ctx;
41 LOG1_A3DLUT( "%s: (exit)\n", __FUNCTION__);
42 return XCAM_RETURN_NO_ERROR;
43 }
44
45 static XCamReturn
destroy_context(RkAiqAlgoContext * context)46 destroy_context(RkAiqAlgoContext *context)
47 {
48 LOG1_A3DLUT( "%s: (enter)\n", __FUNCTION__);
49
50 Alut3dRelease((alut3d_handle_t)context->a3dlut_para);
51 delete context;
52 context = NULL;
53 LOG1_A3DLUT( "%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_A3DLUT( "%s: (enter)\n", __FUNCTION__);
61 alut3d_handle_t hAlut3d = (alut3d_handle_t)(params->ctx->a3dlut_para);
62
63 RkAiqAlgoCamGroupPrepare *para = (RkAiqAlgoCamGroupPrepare *)params;
64 hAlut3d->prepare_type = params->u.prepare.conf_type;
65 if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )){
66 hAlut3d->calibV2_lut3d =
67 (CalibDbV2_Lut3D_Para_V2_t*)(CALIBDBV2_GET_MODULE_PTR((CamCalibDbV2Context_t*)(para->s_calibv2), lut3d_calib));
68 }
69 Alut3dPrepare((alut3d_handle_t)(params->ctx->a3dlut_para));
70
71 LOG1_A3DLUT( "%s: (exit)\n", __FUNCTION__);
72 return XCAM_RETURN_NO_ERROR;
73 }
74
75 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)76 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
77 {
78 LOG1_A3DLUT( "%s: (enter)\n", __FUNCTION__);
79
80 RkAiqAlgoCamGroupProcIn* procParaGroup = (RkAiqAlgoCamGroupProcIn*)inparams;
81 RkAiqAlgoCamGroupProcOut* procResParaGroup = (RkAiqAlgoCamGroupProcOut*)outparams;
82 alut3d_handle_t hAlut3d = (alut3d_handle_t)(inparams->ctx->a3dlut_para);
83
84 if (!procParaGroup->arraySize) {
85 LOG1_A3DLUT( "%s: do nothing \n", __FUNCTION__);
86 return XCAM_RETURN_NO_ERROR;
87 }
88
89 rk_aiq_singlecam_3a_result_t* scam_3a_res = procParaGroup->camgroupParmasArray[0];
90 XCamVideoBuffer* awb_proc_res = scam_3a_res->awb._awbProcRes;
91 if (awb_proc_res) {
92 RkAiqAlgoProcResAwbShared_t* awb_res = (RkAiqAlgoProcResAwbShared_t*)awb_proc_res->map(awb_proc_res);
93 if(awb_res) {
94 if(awb_res->awb_gain_algo.grgain < DIVMIN ||
95 awb_res->awb_gain_algo.gbgain < DIVMIN ) {
96 LOGW_A3DLUT("get wrong awb gain from AWB module ,use default value ");
97 } else {
98 hAlut3d->swinfo.awbGain[0] =
99 awb_res->awb_gain_algo.rgain / awb_res->awb_gain_algo.grgain;
100
101 hAlut3d->swinfo.awbGain[1] =
102 awb_res->awb_gain_algo.bgain / awb_res->awb_gain_algo.gbgain;
103 }
104 hAlut3d->swinfo.awbIIRDampCoef = awb_res->awb_smooth_factor;
105 hAlut3d->swinfo.awbConverged = awb_res->awbConverged;
106 } else {
107 LOGW_A3DLUT("fail to get awb gain form AWB module,use default value ");
108 }
109 } else {
110 LOGW_A3DLUT("fail to get awb gain form AWB module,use default value ");
111 }
112
113 if(scam_3a_res->aec._bEffAecExpValid) {
114 RKAiqAecExpInfo_t* pCurExp = &scam_3a_res->aec._effAecExpInfo;
115 if((rk_aiq_working_mode_t)procParaGroup->working_mode == RK_AIQ_WORKING_MODE_NORMAL) {
116 hAlut3d->swinfo.sensorGain = pCurExp->LinearExp.exp_real_params.analog_gain
117 * pCurExp->LinearExp.exp_real_params.digital_gain
118 * pCurExp->LinearExp.exp_real_params.isp_dgain;
119 } else if((rk_aiq_working_mode_t)procParaGroup->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2
120 && (rk_aiq_working_mode_t)procParaGroup->working_mode < RK_AIQ_WORKING_MODE_ISP_HDR3) {
121 LOGD_A3DLUT("sensor gain choose from second hdr frame for a3dlut");
122 hAlut3d->swinfo.sensorGain = pCurExp->HdrExp[1].exp_real_params.analog_gain
123 * pCurExp->HdrExp[1].exp_real_params.digital_gain
124 * pCurExp->HdrExp[1].exp_real_params.isp_dgain;
125 } else if((rk_aiq_working_mode_t)procParaGroup->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2
126 && (rk_aiq_working_mode_t)procParaGroup->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR3) {
127 LOGD_A3DLUT("sensor gain choose from third hdr frame for a3dlut");
128 hAlut3d->swinfo.sensorGain = pCurExp->HdrExp[2].exp_real_params.analog_gain
129 * pCurExp->HdrExp[2].exp_real_params.digital_gain
130 * pCurExp->HdrExp[2].exp_real_params.isp_dgain;
131 } else {
132 LOGW_A3DLUT("working_mode (%d) is invaild ,fail to get sensor gain form AE module,use default value ",
133 procParaGroup->working_mode);
134 }
135 } else {
136 LOGW_A3DLUT("fail to get sensor gain form AE module,use default value ");
137 }
138
139 //LOGI_A3DLUT( "%s a3dlut_proc_com.u.init:%d \n", __FUNCTION__, inparams->u.proc.init);
140 LOGD_A3DLUT( "%s: sensorGain:%f, awbGain:%f,%f, awbIIRDampCoef:%f\n", __FUNCTION__,
141 hAlut3d->swinfo.sensorGain,
142 hAlut3d->swinfo.awbGain[0], hAlut3d->swinfo.awbGain[1],
143 hAlut3d->swinfo.awbIIRDampCoef);
144
145 Alut3dConfig(hAlut3d);
146 if (hAlut3d->lut3d_hw_conf.enable || !hAlut3d->lut3d_hw_conf.bypass_en) {
147 LOGD_A3DLUT("update:%d, updateAtt: %d, converge: %d\n",
148 hAlut3d->update, hAlut3d->updateAtt, hAlut3d->swinfo.lut3dConverged);
149 outparams->cfg_update = hAlut3d->update || hAlut3d->updateAtt || (!hAlut3d->swinfo.lut3dConverged);
150 } else {
151 outparams->cfg_update = hAlut3d->updateAtt || hAlut3d->calib_update;
152 }
153
154 hAlut3d->calib_update = false;
155 hAlut3d->updateAtt = false;
156 for (int i = 0; i < procResParaGroup->arraySize; i++) {
157 if (outparams->cfg_update) {
158 *(procResParaGroup->camgroupParmasArray[i]->_lut3dCfg) =
159 hAlut3d->lut3d_hw_conf;
160 }
161 //TODO
162 IS_UPDATE_MEM((procResParaGroup->camgroupParmasArray[i]->_lut3dCfg), procParaGroup->_offset_is_update) =
163 outparams->cfg_update;
164 }
165
166 LOG1_A3DLUT( "%s: (exit)\n", __FUNCTION__);
167 return XCAM_RETURN_NO_ERROR;
168 }
169
170 RkAiqAlgoDescription g_RkIspAlgoDescCamgroupA3dlut = {
171 .common = {
172 .version = RKISP_ALGO_A3DLUT_VERSION,
173 .vendor = RKISP_ALGO_A3DLUT_VENDOR,
174 .description = RKISP_ALGO_A3DLUT_DESCRIPTION,
175 .type = RK_AIQ_ALGO_TYPE_A3DLUT,
176 .id = 0,
177 .create_context = create_context,
178 .destroy_context = destroy_context,
179 },
180 .prepare = prepare,
181 .pre_process = NULL,
182 .processing = processing,
183 .post_process = NULL,
184 };
185
186 RKAIQ_END_DECLARE
187