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