1 /*
2  * rk_aiq_algo_camgroup_alsc_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 "alsc/rk_aiq_algo_alsc_itf.h"
23 #include "alsc/rk_aiq_alsc_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_ALSC( "%s: (enter)\n", __FUNCTION__);
32     XCamReturn ret = XCAM_RETURN_NO_ERROR;
33 
34     AlgoCtxInstanceCfgCamGroup *cfgInt = (AlgoCtxInstanceCfgCamGroup*)cfg;
35     RkAiqAlgoContext *ctx = new RkAiqAlgoContext();
36     if (ctx == NULL) {
37         LOGE_ALSC( "%s: create camgroup alsc context fail!\n", __FUNCTION__);
38         return XCAM_RETURN_ERROR_MEM;
39     }
40     AlscInit(&ctx->alsc_para, cfgInt->s_calibv2);
41     *context = ctx;
42     LOG1_ALSC( "%s: (exit)\n", __FUNCTION__);
43     return XCAM_RETURN_NO_ERROR;
44 }
45 
46 static XCamReturn
destroy_context(RkAiqAlgoContext * context)47 destroy_context(RkAiqAlgoContext *context)
48 {
49     LOG1_ALSC( "%s: (enter)\n", __FUNCTION__);
50 
51     AlscRelease((alsc_handle_t)context->alsc_para);
52     delete context;
53     context = NULL;
54     LOG1_ALSC( "%s: (exit)\n", __FUNCTION__);
55     return XCAM_RETURN_NO_ERROR;
56 }
57 
58 static XCamReturn
prepare(RkAiqAlgoCom * params)59 prepare(RkAiqAlgoCom* params)
60 {
61     LOG1_ALSC( "%s: (enter)\n", __FUNCTION__);
62     alsc_handle_t hAlsc = (alsc_handle_t)(params->ctx->alsc_para);
63 
64     RkAiqAlgoCamGroupPrepare* para = (RkAiqAlgoCamGroupPrepare*)params;
65 
66     sprintf(hAlsc->cur_res.name, "%dx%d", para->gcom.com.u.prepare.sns_op_width,
67             para->gcom.com.u.prepare.sns_op_height );
68     hAlsc->alscSwInfo.prepare_type = params->u.prepare.conf_type;
69    if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )){
70        hAlsc->calibLscV2 =
71             (CalibDbV2_LSC_t*)(CALIBDBV2_GET_MODULE_PTR((CamCalibDbV2Context_t*)(para->s_calibv2), lsc_v2));
72    }
73     AlscPrepare((alsc_handle_t)(params->ctx->alsc_para));
74 
75     LOG1_ALSC( "%s: (exit)\n", __FUNCTION__);
76     return XCAM_RETURN_NO_ERROR;
77 }
78 
79 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)80 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
81 {
82     LOG1_ALSC( "%s: (enter)\n", __FUNCTION__);
83 
84     RkAiqAlgoCamGroupProcIn* procParaGroup = (RkAiqAlgoCamGroupProcIn*)inparams;
85     RkAiqAlgoCamGroupProcOut* procResParaGroup = (RkAiqAlgoCamGroupProcOut*)outparams;
86     alsc_handle_t hAlsc = (alsc_handle_t)(inparams->ctx->alsc_para);
87 
88     hAlsc->alscSwInfo.grayMode = procParaGroup->_gray_mode;
89 
90     if (!procParaGroup->arraySize) {
91         LOG1_ALSC( "%s: do nothing \n", __FUNCTION__);
92         return XCAM_RETURN_NO_ERROR;
93     }
94 
95     rk_aiq_singlecam_3a_result_t* scam_3a_res = procParaGroup->camgroupParmasArray[0];
96     XCamVideoBuffer* awb_proc_res = scam_3a_res->awb._awbProcRes;
97     if (awb_proc_res) {
98         RkAiqAlgoProcResAwbShared_t* awb_res = (RkAiqAlgoProcResAwbShared_t*)awb_proc_res->map(awb_proc_res);
99         if(awb_res) {
100             if(awb_res->awb_gain_algo.grgain < DIVMIN ||
101                     awb_res->awb_gain_algo.gbgain < DIVMIN ) {
102                 LOGW("get wrong awb gain from AWB module ,use default value ");
103             } else {
104                 hAlsc->alscSwInfo.awbGain[0] =
105                     awb_res->awb_gain_algo.rgain / awb_res->awb_gain_algo.grgain;
106 
107                 hAlsc->alscSwInfo.awbGain[1] =
108                     awb_res->awb_gain_algo.bgain / awb_res->awb_gain_algo.gbgain;
109             }
110             hAlsc->alscSwInfo.awbIIRDampCoef = awb_res->awb_smooth_factor;
111             hAlsc->alscSwInfo.varianceLuma = awb_res->varianceLuma;
112             hAlsc->alscSwInfo.awbConverged = awb_res->awbConverged;
113         } else {
114             LOGW("fail to get awb gain form AWB module,use default value ");
115         }
116     } else {
117         LOGW("fail to get awb gain form AWB module,use default value ");
118     }
119 
120     if(scam_3a_res->aec._bEffAecExpValid) {
121         RKAiqAecExpInfo_t* pCurExp = &scam_3a_res->aec._effAecExpInfo;
122         if((rk_aiq_working_mode_t)procParaGroup->working_mode == RK_AIQ_WORKING_MODE_NORMAL) {
123             hAlsc->alscSwInfo.sensorGain = pCurExp->LinearExp.exp_real_params.analog_gain
124                     * pCurExp->LinearExp.exp_real_params.digital_gain
125                     * pCurExp->LinearExp.exp_real_params.isp_dgain;
126         } else if((rk_aiq_working_mode_t)procParaGroup->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2
127                   && (rk_aiq_working_mode_t)procParaGroup->working_mode < RK_AIQ_WORKING_MODE_ISP_HDR3)  {
128             LOGD("sensor gain choose from second hdr frame for alsc");
129             hAlsc->alscSwInfo.sensorGain = pCurExp->HdrExp[1].exp_real_params.analog_gain
130                     * pCurExp->HdrExp[1].exp_real_params.digital_gain
131                     * pCurExp->HdrExp[1].exp_real_params.isp_dgain;
132         } else if((rk_aiq_working_mode_t)procParaGroup->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR2
133                   && (rk_aiq_working_mode_t)procParaGroup->working_mode >= RK_AIQ_WORKING_MODE_ISP_HDR3)  {
134             LOGD("sensor gain choose from third hdr frame for alsc");
135             hAlsc->alscSwInfo.sensorGain = pCurExp->HdrExp[2].exp_real_params.analog_gain
136                     * pCurExp->HdrExp[2].exp_real_params.digital_gain
137                     * pCurExp->HdrExp[2].exp_real_params.isp_dgain;
138         } else {
139             LOGW("working_mode (%d) is invaild ,fail to get sensor gain form AE module,use default value ",
140                  procParaGroup->working_mode);
141         }
142     } else {
143         LOGW("fail to get sensor gain form AE module,use default value ");
144     }
145 
146     //LOGI_ALSC( "%s alsc_proc_com.u.init:%d \n", __FUNCTION__, inparams->u.proc.init);
147     LOGD_ALSC( "%s: sensorGain:%f, awbGain:%f,%f, resName:%s, awbIIRDampCoef:%f\n", __FUNCTION__,
148                hAlsc->alscSwInfo.sensorGain,
149                hAlsc->alscSwInfo.awbGain[0], hAlsc->alscSwInfo.awbGain[1],
150                hAlsc->cur_res.name, hAlsc->alscSwInfo.awbIIRDampCoef);
151 
152     AlscConfig(hAlsc);
153 
154     for (int i = 0; i < procResParaGroup->arraySize; i++) {
155         if (hAlsc->isReCal_) {
156             *(procResParaGroup->camgroupParmasArray[i]->_lscConfig) =
157                 hAlsc->lscHwConf;
158             outparams->cfg_update = true;
159             hAlsc->isReCal_ = false;
160         } else {
161             outparams->cfg_update = false;
162         }
163         // TODO
164         IS_UPDATE_MEM((procResParaGroup->camgroupParmasArray[i]->_lscConfig), procParaGroup->_offset_is_update) =
165             outparams->cfg_update;
166     }
167 
168     LOG1_ALSC( "%s: (exit)\n", __FUNCTION__);
169     return XCAM_RETURN_NO_ERROR;
170 }
171 
172 RkAiqAlgoDescription g_RkIspAlgoDescCamgroupAlsc = {
173     .common = {
174         .version = RKISP_ALGO_ALSC_VERSION,
175         .vendor  = RKISP_ALGO_ALSC_VENDOR,
176         .description = RKISP_ALGO_ALSC_DESCRIPTION,
177         .type    = RK_AIQ_ALGO_TYPE_ALSC,
178         .id      = 0,
179         .create_context  = create_context,
180         .destroy_context = destroy_context,
181     },
182     .prepare = prepare,
183     .pre_process = NULL,
184     .processing = processing,
185     .post_process = NULL,
186 };
187 
188 RKAIQ_END_DECLARE
189