1
2 #include "rk_aiq_abayernr_algo_v2.h"
3 #include "rk_aiq_abayernr_algo_itf_v2.h"
4 #include "RkAiqCalibDbV2Helper.h"
5
6 RKAIQ_BEGIN_DECLARE
7
Abayernr_Start_V2(Abayernr_Context_V2_t * pAbayernrCtx)8 Abayernr_result_t Abayernr_Start_V2(Abayernr_Context_V2_t *pAbayernrCtx)
9 {
10 LOGI_ANR( "%s:enter!\n", __FUNCTION__);
11
12 // initial checks
13 if (pAbayernrCtx == NULL) {
14 return (ABAYERNR_RET_NULL_POINTER);
15 }
16
17 if ((ABAYERNR_STATE_RUNNING == pAbayernrCtx->eState)
18 || (ABAYERNR_STATE_LOCKED == pAbayernrCtx->eState)) {
19 return (ABAYERNR_RET_FAILURE);
20 }
21
22 pAbayernrCtx->eState = ABAYERNR_STATE_RUNNING;
23
24 LOGI_ANR( "%s:exit!\n", __FUNCTION__);
25 return (ABAYERNR_RET_SUCCESS);
26 }
27
28
Abayernr_Stop_V2(Abayernr_Context_V2_t * pAbayernrCtx)29 Abayernr_result_t Abayernr_Stop_V2(Abayernr_Context_V2_t *pAbayernrCtx)
30 {
31 LOGI_ANR( "%s:enter!\n", __FUNCTION__);
32
33 // initial checks
34 if (pAbayernrCtx == NULL) {
35 return (ABAYERNR_RET_NULL_POINTER);
36 }
37
38 if (ABAYERNR_STATE_LOCKED == pAbayernrCtx->eState) {
39 return (ABAYERNR_RET_FAILURE);
40 }
41
42 pAbayernrCtx->eState = ABAYERNR_STATE_STOPPED;
43
44 LOGI_ANR( "%s:exit!\n", __FUNCTION__);
45 return (ABAYERNR_RET_SUCCESS);
46 }
47
48
49 //anr inint
Abayernr_Init_V2(Abayernr_Context_V2_t ** ppAbayernrCtx,void * pCalibDb)50 Abayernr_result_t Abayernr_Init_V2(Abayernr_Context_V2_t **ppAbayernrCtx, void *pCalibDb)
51 {
52 Abayernr_Context_V2_t * pAbayernrCtx;
53
54 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
55
56 pAbayernrCtx = (Abayernr_Context_V2_t *)malloc(sizeof(Abayernr_Context_V2_t));
57 if(pAbayernrCtx == NULL) {
58 LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
59 return ABAYERNR_RET_NULL_POINTER;
60 }
61
62 memset(pAbayernrCtx, 0x00, sizeof(Abayernr_Context_V2_t));
63
64 //gain state init
65 pAbayernrCtx->fRawnr_SF_Strength = 1.0;
66 pAbayernrCtx->fRawnr_TF_Strength = 1.0;
67
68 pAbayernrCtx->eState = ABAYERNR_STATE_INITIALIZED;
69 *ppAbayernrCtx = pAbayernrCtx;
70
71 pAbayernrCtx->eMode = ABAYERNR_OP_MODE_AUTO;
72 pAbayernrCtx->isIQParaUpdate = false;
73 pAbayernrCtx->isGrayMode = false;
74 pAbayernrCtx->isReCalculate = 1;
75
76 #if 1
77 //read v1 params from xml
78 #if (ABAYERNR_USE_JSON_FILE_V2)
79 CalibDbV2_BayerNrV2_t * pcalibdbV2_bayernr_v2 =
80 (CalibDbV2_BayerNrV2_t *)(CALIBDBV2_GET_MODULE_PTR((CamCalibDbV2Context_t*)pCalibDb, bayernr_v2));
81 pAbayernrCtx->bayernr_v2 = *pcalibdbV2_bayernr_v2;
82 #else
83 pAbayernrCtx->list_bayernr_v2 =
84 (struct list_head*)(CALIBDB_GET_MODULE_PTR((CamCalibDbContext_t *)pCalibDb, list_bayernr_v2));
85 printf("%s(%d): bayernr list:%p\n", __FUNCTION__, __LINE__, pAbayernrCtx->list_bayernr_v2);
86 #endif
87 #endif
88
89 #if RK_SIMULATOR_HW
90 //just for v2 params from html
91
92 #endif
93
94 #if 1
95 pAbayernrCtx->stExpInfo.snr_mode = 1;
96 pAbayernrCtx->eParamMode = ABAYERNR_PARAM_MODE_NORMAL;
97 Abayernr_ConfigSettingParam_V2(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
98 #endif
99
100 LOGD_ANR("%s(%d):", __FUNCTION__, __LINE__);
101
102
103 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
104 return ABAYERNR_RET_SUCCESS;
105 }
106
107 //anr release
Abayernr_Release_V2(Abayernr_Context_V2_t * pAbayernrCtx)108 Abayernr_result_t Abayernr_Release_V2(Abayernr_Context_V2_t *pAbayernrCtx)
109 {
110 Abayernr_result_t result = ABAYERNR_RET_SUCCESS;
111 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
112 if(pAbayernrCtx == NULL) {
113 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
114 return ABAYERNR_RET_NULL_POINTER;
115 }
116
117 result = Abayernr_Stop_V2(pAbayernrCtx);
118 if (result != ABAYERNR_RET_SUCCESS) {
119 LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
120 return (result);
121 }
122
123 // check state
124 if ((ABAYERNR_STATE_RUNNING == pAbayernrCtx->eState)
125 || (ABAYERNR_STATE_LOCKED == pAbayernrCtx->eState)) {
126 return (ABAYERNR_RET_BUSY);
127 }
128
129 memset(pAbayernrCtx, 0x00, sizeof(Abayernr_Context_V2_t));
130 free(pAbayernrCtx);
131
132 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
133 return ABAYERNR_RET_SUCCESS;
134 }
135
136 //anr config
Abayernr_Prepare_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_Config_V2_t * pAbayernrConfig)137 Abayernr_result_t Abayernr_Prepare_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_Config_V2_t* pAbayernrConfig)
138 {
139 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
140
141 if(pAbayernrCtx == NULL || pAbayernrConfig == NULL) {
142 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
143 return ABAYERNR_RET_INVALID_PARM;
144 }
145
146 if(!!(pAbayernrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
147 Abayernr_IQParaUpdate_V2(pAbayernrCtx);
148 }
149
150 Abayernr_Start_V2(pAbayernrCtx);
151
152 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
153 return ABAYERNR_RET_SUCCESS;
154 }
155
156 //anr reconfig
Abayernr_ReConfig_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_Config_V2_t * pAbayernrConfig)157 Abayernr_result_t Abayernr_ReConfig_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_Config_V2_t* pAbayernrConfig)
158 {
159 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
160 //need todo what?
161
162 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
163 return ABAYERNR_RET_SUCCESS;
164 }
165
166 //anr reconfig
Abayernr_IQParaUpdate_V2(Abayernr_Context_V2_t * pAbayernrCtx)167 Abayernr_result_t Abayernr_IQParaUpdate_V2(Abayernr_Context_V2_t *pAbayernrCtx)
168 {
169 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
170 //need todo what?
171
172 if(pAbayernrCtx->isIQParaUpdate) {
173 LOGD_ANR("IQ data reconfig\n");
174 Abayernr_ConfigSettingParam_V2(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
175 pAbayernrCtx->isIQParaUpdate = false;
176 }
177
178 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
179 return ABAYERNR_RET_SUCCESS;
180 }
181
182
183 //anr preprocess
Abayernr_PreProcess_V2(Abayernr_Context_V2_t * pAbayernrCtx)184 Abayernr_result_t Abayernr_PreProcess_V2(Abayernr_Context_V2_t *pAbayernrCtx)
185 {
186 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
187 //need todo what?
188
189 Abayernr_IQParaUpdate_V2(pAbayernrCtx);
190
191 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
192 return ABAYERNR_RET_SUCCESS;
193 }
194
195 //anr process
Abayernr_Process_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_ExpInfo_t * pExpInfo)196 Abayernr_result_t Abayernr_Process_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_ExpInfo_t *pExpInfo)
197 {
198 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
199 Abayernr_ParamMode_t mode = ABAYERNR_PARAM_MODE_INVALID;
200
201 if(pAbayernrCtx == NULL || pExpInfo == NULL) {
202 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
203 return ABAYERNR_RET_INVALID_PARM;
204 }
205
206 if(pAbayernrCtx->eState != ABAYERNR_STATE_RUNNING) {
207 return ABAYERNR_RET_SUCCESS;
208 }
209
210 Abayernr_ParamModeProcess_V2(pAbayernrCtx, pExpInfo, &mode);
211
212 if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_AUTO) {
213
214 LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
215
216 #if ABAYERNR_USE_XML_FILE_V2
217 if(pExpInfo->snr_mode != pAbayernrCtx->stExpInfo.snr_mode || pAbayernrCtx->eParamMode != mode) {
218 LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
219 pAbayernrCtx->eParamMode = mode;
220 Abayernr_ConfigSettingParam_V2(pAbayernrCtx, pAbayernrCtx->eParamMode, pExpInfo->snr_mode);
221 }
222 #endif
223
224 //select param
225 bayernr2D_select_params_by_ISO_V2(&pAbayernrCtx->stAuto.st2DParams, &pAbayernrCtx->stAuto.st2DSelect, pExpInfo);
226 bayernr3D_select_params_by_ISO_V2(&pAbayernrCtx->stAuto.st3DParams, &pAbayernrCtx->stAuto.st3DSelect, pExpInfo);
227
228 } else if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_MANUAL) {
229 //TODO
230 }
231
232 memcpy(&pAbayernrCtx->stExpInfo, pExpInfo, sizeof(Abayernr_ExpInfo_t));
233
234 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
235 return ABAYERNR_RET_SUCCESS;
236
237 }
238
239
240
241 //anr get result
Abayernr_GetProcResult_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_ProcResult_V2_t * pAbayernrResult)242 Abayernr_result_t Abayernr_GetProcResult_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_ProcResult_V2_t* pAbayernrResult)
243 {
244 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
245
246 if(pAbayernrCtx == NULL || pAbayernrResult == NULL) {
247 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
248 return ABAYERNR_RET_INVALID_PARM;
249 }
250
251 RK_Bayernr_2D_Params_V2_Select_t* st2DSelect = NULL;
252 RK_Bayernr_3D_Params_V2_Select_t* st3DSelect = NULL;
253 if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_AUTO) {
254 st2DSelect = &pAbayernrCtx->stAuto.st2DSelect;
255 st3DSelect = &pAbayernrCtx->stAuto.st3DSelect;
256 } else if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_MANUAL) {
257 //TODO
258 st2DSelect = &pAbayernrCtx->stManual.st2DSelect;
259 st3DSelect = &pAbayernrCtx->stManual.st3DSelect;
260 pAbayernrCtx->fRawnr_SF_Strength = 1.0;
261 pAbayernrCtx->fRawnr_TF_Strength = 1.0;
262 }
263
264 //transfer to reg value
265 bayernr2D_fix_transfer_V2(st2DSelect, pAbayernrResult->st2DFix, pAbayernrCtx->fRawnr_SF_Strength, &pAbayernrCtx->stExpInfo);
266 bayernr3D_fix_transfer_V2(st3DSelect, pAbayernrResult->st3DFix, pAbayernrCtx->fRawnr_TF_Strength, &pAbayernrCtx->stExpInfo);
267
268 LOGD_ANR("%s:%d xml:local:%d mode:%d reg: local gain:%d mfnr gain:%d mode:%d\n",
269 __FUNCTION__, __LINE__);
270
271 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
272 return ABAYERNR_RET_SUCCESS;
273 }
274
Abayernr_ConfigSettingParam_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_ParamMode_t eParamMode,int snr_mode)275 Abayernr_result_t Abayernr_ConfigSettingParam_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_ParamMode_t eParamMode, int snr_mode)
276 {
277 char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
278 char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
279 memset(param_mode_name, 0x00, sizeof(param_mode_name));
280 memset(snr_name, 0x00, sizeof(snr_name));
281
282 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
283 if(pAbayernrCtx == NULL) {
284 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
285 return ABAYERNR_RET_INVALID_PARM;
286 }
287
288 //select param mode first
289 if(eParamMode == ABAYERNR_PARAM_MODE_NORMAL) {
290 sprintf(param_mode_name, "%s", "normal");
291 } else if(eParamMode == ABAYERNR_PARAM_MODE_HDR) {
292 sprintf(param_mode_name, "%s", "hdr");
293 } else if(eParamMode == ABAYERNR_PARAM_MODE_GRAY) {
294 sprintf(param_mode_name, "%s", "gray");
295 } else {
296 LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
297 sprintf(param_mode_name, "%s", "normal");
298 }
299
300 //then select snr mode next
301 if(snr_mode == 1) {
302 sprintf(snr_name, "%s", "HSNR");
303 } else if(snr_mode == 0) {
304 sprintf(snr_name, "%s", "LSNR");
305 } else {
306 LOGE_ANR("%s(%d): not support snr mode:%d!\n", __FUNCTION__, __LINE__, snr_mode);
307 sprintf(snr_name, "%s", "LSNR");
308 }
309
310 #if (ABAYERNR_USE_JSON_FILE_V2)
311 bayernr2D_config_setting_param_json_V2(&pAbayernrCtx->stAuto.st2DParams, &pAbayernrCtx->bayernr_v2, param_mode_name, snr_name);
312 bayernr3D_config_setting_param_json_V2(&pAbayernrCtx->stAuto.st3DParams, &pAbayernrCtx->bayernr_v2, param_mode_name, snr_name);
313 #else
314 bayernr2D_config_setting_param_V2(&pAbayernrCtx->stAuto.st2DParams, pAbayernrCtx->list_bayernr_v2, param_mode_name, snr_name);
315 bayernr3D_config_setting_param_V2(&pAbayernrCtx->stAuto.st3DParams, pAbayernrCtx->list_bayernr_v2, param_mode_name, snr_name);
316 #endif
317 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
318 return ABAYERNR_RET_SUCCESS;
319 }
320
Abayernr_ParamModeProcess_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_ExpInfo_t * pExpInfo,Abayernr_ParamMode_t * mode)321 Abayernr_result_t Abayernr_ParamModeProcess_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_ExpInfo_t *pExpInfo, Abayernr_ParamMode_t *mode) {
322 Abayernr_result_t res = ABAYERNR_RET_SUCCESS;
323 *mode = pAbayernrCtx->eParamMode;
324
325 if(pAbayernrCtx == NULL) {
326 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
327 return ABAYERNR_RET_INVALID_PARM;
328 }
329
330 if(pAbayernrCtx->isGrayMode) {
331 *mode = ABAYERNR_PARAM_MODE_GRAY;
332 } else if(pExpInfo->hdr_mode == 0) {
333 *mode = ABAYERNR_PARAM_MODE_NORMAL;
334 } else if(pExpInfo->hdr_mode >= 1) {
335 *mode = ABAYERNR_PARAM_MODE_HDR;
336 } else {
337 *mode = ABAYERNR_PARAM_MODE_NORMAL;
338 }
339
340 return res;
341 }
342
343
344 RKAIQ_END_DECLARE
345
346
347