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