1 /*
2 * rk_aiq_algo_anr_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 "arawnr/rk_aiq_abayernr_algo_itf_v1.h"
21 #include "arawnr/rk_aiq_abayernr_algo_v1.h"
22 #include "rk_aiq_algo_types.h"
23
24 RKAIQ_BEGIN_DECLARE
25
26 typedef struct _RkAiqAlgoContext {
27 void* place_holder[0];
28 } RkAiqAlgoContext;
29
30
31 static XCamReturn
create_context(RkAiqAlgoContext ** context,const AlgoCtxInstanceCfg * cfg)32 create_context(RkAiqAlgoContext **context, const AlgoCtxInstanceCfg* cfg)
33 {
34
35 XCamReturn result = XCAM_RETURN_NO_ERROR;
36 LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
37
38 #if 1
39 Abayernr_Context_V1_t* pAbayernrCtx = NULL;
40
41 #if ABAYERNR_USE_JSON_FILE_V1
42 Abayernr_result_v1_t ret = Abayernr_Init_Json_V1(&pAbayernrCtx, cfg->calibv2);
43 #else
44 Abayernr_result_v1_t ret = Abayernr_Init_V1(&pAbayernrCtx, cfg->calib);
45 #endif
46
47 if(ret != ABAYERNR_RET_V1_SUCCESS) {
48 result = XCAM_RETURN_ERROR_FAILED;
49 LOGE_ANR("%s: Initializaion ANR failed (%d)\n", __FUNCTION__, ret);
50 } else {
51 *context = (RkAiqAlgoContext *)(pAbayernrCtx);
52 }
53 #endif
54
55 LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
56 return result;
57 }
58
59 static XCamReturn
destroy_context(RkAiqAlgoContext * context)60 destroy_context(RkAiqAlgoContext *context)
61 {
62 XCamReturn result = XCAM_RETURN_NO_ERROR;
63
64 LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
65
66 #if 1
67 Abayernr_Context_V1_t* pAbayernrCtx = (Abayernr_Context_V1_t*)context;
68 Abayernr_result_v1_t ret = Abayernr_Release_V1(pAbayernrCtx);
69 if(ret != ABAYERNR_RET_V1_SUCCESS) {
70 result = XCAM_RETURN_ERROR_FAILED;
71 LOGE_ANR("%s: release ANR failed (%d)\n", __FUNCTION__, ret);
72 }
73 #endif
74
75 LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
76 return result;
77 }
78
79 static XCamReturn
prepare(RkAiqAlgoCom * params)80 prepare(RkAiqAlgoCom* params)
81 {
82 XCamReturn result = XCAM_RETURN_NO_ERROR;
83
84 LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
85
86 Abayernr_Context_V1_t* pAbayernrCtx = (Abayernr_Context_V1_t *)params->ctx;
87 RkAiqAlgoConfigArawnr* pCfgParam = (RkAiqAlgoConfigArawnr*)params;
88 pAbayernrCtx->prepare_type = params->u.prepare.conf_type;
89
90 if(!!(params->u.prepare.conf_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB )){
91 #if ABAYERNR_USE_JSON_FILE_V1
92 void *pCalibDbV2 = (void*)(pCfgParam->com.u.prepare.calibv2);
93 CalibDbV2_BayerNrV1_t *bayernr_v1 = (CalibDbV2_BayerNrV1_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibDbV2, bayernr_v1));
94 bayernrV1_calibdbV2_assign(&pAbayernrCtx->bayernr_v1, bayernr_v1);
95 #else
96 void *pCalibDb = (void*)(pCfgParam->com.u.prepare.calib);
97 pAbayernrCtx->stBayernrCalib =
98 *(CalibDb_BayerNr_2_t*)(CALIBDB_GET_MODULE_PTR((void*)pCalibDb, bayerNr));
99 #endif
100 pAbayernrCtx->isIQParaUpdate = true;
101 }
102
103 Abayernr_result_v1_t ret = Abayernr_Prepare_V1(pAbayernrCtx, &pCfgParam->stArawnrConfig);
104 if(ret != ABAYERNR_RET_V1_SUCCESS) {
105 result = XCAM_RETURN_ERROR_FAILED;
106 LOGE_ANR("%s: config ANR failed (%d)\n", __FUNCTION__, ret);
107 }
108
109 LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
110 return result;
111 }
112
113 static XCamReturn
pre_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)114 pre_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
115 {
116 XCamReturn result = XCAM_RETURN_NO_ERROR;
117
118 LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
119 Abayernr_Context_V1_t* pAbayernrCtx = (Abayernr_Context_V1_t *)inparams->ctx;
120
121 RkAiqAlgoPreArawnr* pAnrPreParams = (RkAiqAlgoPreArawnr*)inparams;
122
123 if (pAnrPreParams->com.u.proc.gray_mode) {
124 pAbayernrCtx->isGrayMode = true;
125 }else {
126 pAbayernrCtx->isGrayMode = false;
127 }
128
129 Abayernr_result_v1_t ret = Abayernr_PreProcess_V1(pAbayernrCtx);
130 if(ret != ABAYERNR_RET_V1_SUCCESS) {
131 result = XCAM_RETURN_ERROR_FAILED;
132 LOGE_ANR("%s: ANRPreProcess failed (%d)\n", __FUNCTION__, ret);
133 }
134
135 LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
136 return result;
137 }
138
139 static XCamReturn
processing(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)140 processing(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
141 {
142 XCamReturn result = XCAM_RETURN_NO_ERROR;
143
144 LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
145
146 #if 1
147 RkAiqAlgoProcAnr* pAnrProcParams = (RkAiqAlgoProcAnr*)inparams;
148 RkAiqAlgoProcResArawnr* pAnrProcResParams = (RkAiqAlgoProcResArawnr*)outparams;
149 Abayernr_Context_V1_t* pAbayernrCtx = (Abayernr_Context_V1_t *)inparams->ctx;
150 Abayernr_ExpInfo_V1_t stExpInfo;
151 memset(&stExpInfo, 0x00, sizeof(Abayernr_ExpInfo_t));
152
153 LOGD_ANR("%s:%d init:%d hdr mode:%d \n",
154 __FUNCTION__, __LINE__,
155 inparams->u.proc.init,
156 pAnrProcParams->hdr_mode);
157
158 stExpInfo.hdr_mode = 0; //pAnrProcParams->hdr_mode;
159 for(int i = 0; i < 3; i++) {
160 stExpInfo.arIso[i] = 50;
161 stExpInfo.arAGain[i] = 1.0;
162 stExpInfo.arDGain[i] = 1.0;
163 stExpInfo.arTime[i] = 0.01;
164 }
165
166 if(pAnrProcParams->hdr_mode == RK_AIQ_WORKING_MODE_NORMAL) {
167 stExpInfo.hdr_mode = 0;
168 } else if(pAnrProcParams->hdr_mode == RK_AIQ_ISP_HDR_MODE_2_FRAME_HDR
169 || pAnrProcParams->hdr_mode == RK_AIQ_ISP_HDR_MODE_2_LINE_HDR ) {
170 stExpInfo.hdr_mode = 1;
171 } else if(pAnrProcParams->hdr_mode == RK_AIQ_ISP_HDR_MODE_3_FRAME_HDR
172 || pAnrProcParams->hdr_mode == RK_AIQ_ISP_HDR_MODE_3_LINE_HDR ) {
173 stExpInfo.hdr_mode = 2;
174 }
175 stExpInfo.snr_mode = 0;
176
177 #if 1
178 RKAiqAecExpInfo_t *preExp = pAnrProcParams->com.u.proc.preExp;
179 RKAiqAecExpInfo_t *curExp = pAnrProcParams->com.u.proc.curExp;
180
181 if(preExp != NULL && curExp != NULL) {
182 stExpInfo.cur_snr_mode = curExp->CISFeature.SNR;
183 stExpInfo.pre_snr_mode = preExp->CISFeature.SNR;
184 if(pAnrProcParams->hdr_mode == RK_AIQ_WORKING_MODE_NORMAL) {
185 stExpInfo.hdr_mode = 0;
186 stExpInfo.arAGain[0] = curExp->LinearExp.exp_real_params.analog_gain;
187 stExpInfo.arDGain[0] = curExp->LinearExp.exp_real_params.digital_gain;
188 stExpInfo.arTime[0] = curExp->LinearExp.exp_real_params.integration_time;
189 stExpInfo.arDcgMode[0] = curExp->LinearExp.exp_real_params.dcg_mode;
190 stExpInfo.arIso[0] = stExpInfo.arAGain[0] * stExpInfo.arDGain[0] * 50;
191
192 stExpInfo.preAGain[0] = preExp->LinearExp.exp_real_params.analog_gain;
193 stExpInfo.preDGain[0] = preExp->LinearExp.exp_real_params.digital_gain;
194 stExpInfo.preTime[0] = preExp->LinearExp.exp_real_params.integration_time;
195 stExpInfo.preDcgMode[0] = preExp->LinearExp.exp_real_params.dcg_mode;
196 stExpInfo.preIso[0] = stExpInfo.preAGain[0] * stExpInfo.preDGain[0] * 50;
197 LOGD_ANR("anr: %s-%d, preExp(%f, %f, %f, %d, %d), curExp(%f, %f, %f, %d, %d)\n",
198 __FUNCTION__, __LINE__,
199 preExp->LinearExp.exp_real_params.analog_gain,
200 preExp->LinearExp.exp_real_params.integration_time,
201 preExp->LinearExp.exp_real_params.digital_gain,
202 preExp->LinearExp.exp_real_params.dcg_mode,
203 preExp->CISFeature.SNR,
204 curExp->LinearExp.exp_real_params.analog_gain,
205 curExp->LinearExp.exp_real_params.integration_time,
206 curExp->LinearExp.exp_real_params.digital_gain,
207 curExp->LinearExp.exp_real_params.dcg_mode,
208 curExp->CISFeature.SNR);
209 } else {
210 for(int i = 0; i < 3; i++) {
211 stExpInfo.arAGain[i] = curExp->HdrExp[i].exp_real_params.analog_gain,
212 stExpInfo.arDGain[i] = curExp->HdrExp[i].exp_real_params.digital_gain;
213 stExpInfo.arTime[i] = curExp->HdrExp[i].exp_real_params.integration_time;
214 stExpInfo.arDcgMode[i] = curExp->HdrExp[i].exp_real_params.dcg_mode;
215 stExpInfo.arIso[i] = stExpInfo.arAGain[i] * stExpInfo.arDGain[i] * 50;
216
217 stExpInfo.preAGain[i] = preExp->HdrExp[i].exp_real_params.analog_gain,
218 stExpInfo.preDGain[i] = preExp->HdrExp[i].exp_real_params.digital_gain;
219 stExpInfo.preTime[i] = preExp->HdrExp[i].exp_real_params.integration_time;
220 stExpInfo.preDcgMode[i] = preExp->HdrExp[i].exp_real_params.dcg_mode;
221 stExpInfo.preIso[i] = stExpInfo.preAGain[i] * stExpInfo.preDGain[i] * 50;
222
223 LOGD_ANR("%s:%d index:%d again:%f %f dgain:%f %f time:%f %f iso:%d %d hdr_mode:%d \n",
224 __FUNCTION__, __LINE__,
225 i,
226 stExpInfo.preAGain[i], stExpInfo.arAGain[i],
227 stExpInfo.preDGain[i], stExpInfo.arDGain[i],
228 stExpInfo.preTime[i], stExpInfo.arTime[i],
229 stExpInfo.preIso[i], stExpInfo.arIso[i],
230 stExpInfo.hdr_mode);
231 }
232 }
233 } else {
234 LOGE_ANR("%s:%d preExp(%p) or curExp(%p) is NULL, so use default instead \n",
235 __FUNCTION__, __LINE__, preExp, curExp);
236 }
237
238 #if 0
239 static int anr_cnt = 0;
240 anr_cnt++;
241
242 if(anr_cnt % 50 == 0) {
243 for(int i = 0; i < stExpInfo.hdr_mode + 1; i++) {
244 printf("%s:%d index:%d again:%f dgain:%f time:%f iso:%d hdr_mode:%d\n",
245 __FUNCTION__, __LINE__,
246 i,
247 stExpInfo.arAGain[i],
248 stExpInfo.arDGain[i],
249 stExpInfo.arTime[i],
250 stExpInfo.arIso[i],
251 stExpInfo.hdr_mode);
252 }
253 }
254 #endif
255
256
257 #endif
258
259 Abayernr_result_v1_t ret = Abayernr_Process_V1(pAbayernrCtx, &stExpInfo);
260 if(ret != ABAYERNR_RET_V1_SUCCESS) {
261 result = XCAM_RETURN_ERROR_FAILED;
262 LOGE_ANR("%s: processing ANR failed (%d)\n", __FUNCTION__, ret);
263 }
264
265 Abayernr_GetProcResult_V1(pAbayernrCtx, &pAnrProcResParams->stArawnrProcResult);
266 #endif
267
268 LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
269 return XCAM_RETURN_NO_ERROR;
270 }
271
272 static XCamReturn
post_process(const RkAiqAlgoCom * inparams,RkAiqAlgoResCom * outparams)273 post_process(const RkAiqAlgoCom* inparams, RkAiqAlgoResCom* outparams)
274 {
275 LOGI_ANR("%s: (enter)\n", __FUNCTION__ );
276
277 //nothing todo now
278
279 LOGI_ANR("%s: (exit)\n", __FUNCTION__ );
280 return XCAM_RETURN_NO_ERROR;
281 }
282
283 RkAiqAlgoDescription g_RkIspAlgoDescArawnr = {
284 .common = {
285 .version = RKISP_ALGO_ABAYERNR_VERSION_V1,
286 .vendor = RKISP_ALGO_ABAYERNR_VENDOR_V1,
287 .description = RKISP_ALGO_ABAYERNR_DESCRIPTION_V1,
288 .type = RK_AIQ_ALGO_TYPE_ARAWNR,
289 .id = 0,
290 .create_context = create_context,
291 .destroy_context = destroy_context,
292 },
293 .prepare = prepare,
294 .pre_process = pre_process,
295 .processing = processing,
296 .post_process = post_process,
297 };
298
299 RKAIQ_END_DECLARE
300