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