1
2 #include "rk_aiq_abayer2dnr_algo_v23.h"
3 #include "rk_aiq_abayer2dnr_algo_itf_v23.h"
4
5 RKAIQ_BEGIN_DECLARE
6
Abayer2dnr_Start_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx)7 Abayer2dnr_result_V23_t Abayer2dnr_Start_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx)
8 {
9 LOGI_ANR( "%s:enter!\n", __FUNCTION__);
10
11 // initial checks
12 if (pAbayernrCtx == NULL) {
13 return (ABAYER2DNR_V23_RET_NULL_POINTER);
14 }
15
16 if ((ABAYER2DNR_V23_STATE_RUNNING == pAbayernrCtx->eState)
17 || (ABAYER2DNR_V23_STATE_LOCKED == pAbayernrCtx->eState)) {
18 return (ABAYER2DNR_V23_RET_FAILURE);
19 }
20
21 pAbayernrCtx->eState = ABAYER2DNR_V23_STATE_RUNNING;
22
23 LOGI_ANR( "%s:exit!\n", __FUNCTION__);
24 return (ABAYER2DNR_V23_RET_SUCCESS);
25 }
26
27
Abayer2dnr_Stop_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx)28 Abayer2dnr_result_V23_t Abayer2dnr_Stop_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx)
29 {
30 LOGI_ANR( "%s:enter!\n", __FUNCTION__);
31
32 // initial checks
33 if (pAbayernrCtx == NULL) {
34 return (ABAYER2DNR_V23_RET_NULL_POINTER);
35 }
36
37 if (ABAYER2DNR_V23_STATE_LOCKED == pAbayernrCtx->eState) {
38 return (ABAYER2DNR_V23_RET_FAILURE);
39 }
40
41 pAbayernrCtx->eState = ABAYER2DNR_V23_STATE_STOPPED;
42
43 LOGI_ANR( "%s:exit!\n", __FUNCTION__);
44 return (ABAYER2DNR_V23_RET_SUCCESS);
45 }
46
47
48 //anr inint
Abayer2dnr_Init_V23(Abayer2dnr_Context_V23_t ** ppAbayernrCtx,void * pCalibDb)49 Abayer2dnr_result_V23_t Abayer2dnr_Init_V23(Abayer2dnr_Context_V23_t **ppAbayernrCtx, void *pCalibDb)
50 {
51 Abayer2dnr_Context_V23_t * pAbayernrCtx;
52
53 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
54
55 pAbayernrCtx = (Abayer2dnr_Context_V23_t *)malloc(sizeof(Abayer2dnr_Context_V23_t));
56 if(pAbayernrCtx == NULL) {
57 LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
58 return ABAYER2DNR_V23_RET_NULL_POINTER;
59 }
60
61 memset(pAbayernrCtx, 0x00, sizeof(Abayer2dnr_Context_V23_t));
62
63 //gain state init
64 pAbayernrCtx->stStrength.strength_enable = true;
65 pAbayernrCtx->stStrength.percent = 1.0;
66
67 pAbayernrCtx->eState = ABAYER2DNR_V23_STATE_INITIALIZED;
68 *ppAbayernrCtx = pAbayernrCtx;
69
70 pAbayernrCtx->eMode = ABAYER2DNR_V23_OP_MODE_AUTO;
71 pAbayernrCtx->isIQParaUpdate = false;
72 pAbayernrCtx->isGrayMode = false;
73 pAbayernrCtx->isReCalculate = 1;
74
75 //read v1 params from xml
76 #if (ABAYER2DNR_USE_JSON_FILE_V23)
77 CalibDbV2_Bayer2dnrV23_t * pcalibdbV23_bayernr_v23 =
78 (CalibDbV2_Bayer2dnrV23_t *)(CALIBDBV2_GET_MODULE_PTR((CamCalibDbV2Context_t*)pCalibDb, bayer2dnr_v23));
79 pAbayernrCtx->bayernr_v23 = *pcalibdbV23_bayernr_v23;
80 #endif
81
82
83 #if 1
84 pAbayernrCtx->stExpInfo.snr_mode = 1;
85 pAbayernrCtx->eParamMode = ABAYER2DNR_V23_PARAM_MODE_NORMAL;
86 Abayer2dnr_ConfigSettingParam_V23(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
87 #endif
88
89 LOGD_ANR("%s(%d):", __FUNCTION__, __LINE__);
90
91
92 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
93 return ABAYER2DNR_V23_RET_SUCCESS;
94 }
95
96 //anr release
Abayer2dnr_Release_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx)97 Abayer2dnr_result_V23_t Abayer2dnr_Release_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx)
98 {
99 Abayer2dnr_result_V23_t result = ABAYER2DNR_V23_RET_SUCCESS;
100 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
101 if(pAbayernrCtx == NULL) {
102 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
103 return ABAYER2DNR_V23_RET_NULL_POINTER;
104 }
105
106 result = Abayer2dnr_Stop_V23(pAbayernrCtx);
107 if (result != ABAYER2DNR_V23_RET_SUCCESS) {
108 LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
109 return (result);
110 }
111
112 // check state
113 if ((ABAYER2DNR_V23_STATE_RUNNING == pAbayernrCtx->eState)
114 || (ABAYER2DNR_V23_STATE_LOCKED == pAbayernrCtx->eState)) {
115 return (ABAYER2DNR_V23_RET_BUSY);
116 }
117
118 memset(pAbayernrCtx, 0x00, sizeof(Abayer2dnr_Context_V23_t));
119 free(pAbayernrCtx);
120
121 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
122 return ABAYER2DNR_V23_RET_SUCCESS;
123 }
124
125 //anr config
Abayer2dnr_Prepare_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_Config_V23_t * pAbayernrConfig)126 Abayer2dnr_result_V23_t Abayer2dnr_Prepare_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_Config_V23_t* pAbayernrConfig)
127 {
128 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
129
130 if(pAbayernrCtx == NULL || pAbayernrConfig == NULL) {
131 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
132 return ABAYER2DNR_V23_RET_INVALID_PARM;
133 }
134
135 if(!!(pAbayernrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
136 Abayer2dnr_IQParaUpdate_V23(pAbayernrCtx);
137 }
138
139 Abayer2dnr_Start_V23(pAbayernrCtx);
140
141 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
142 return ABAYER2DNR_V23_RET_SUCCESS;
143 }
144
145 //anr reconfig
Abayer2dnr_ReConfig_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_Config_V23_t * pAbayernrConfig)146 Abayer2dnr_result_V23_t Abayer2dnr_ReConfig_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_Config_V23_t* pAbayernrConfig)
147 {
148 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
149 //need todo what?
150
151 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
152 return ABAYER2DNR_V23_RET_SUCCESS;
153 }
154
155 //anr reconfig
Abayer2dnr_IQParaUpdate_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx)156 Abayer2dnr_result_V23_t Abayer2dnr_IQParaUpdate_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx)
157 {
158 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
159 //need todo what?
160
161 if(pAbayernrCtx->isIQParaUpdate) {
162 LOGD_ANR("IQ data reconfig\n");
163 Abayer2dnr_ConfigSettingParam_V23(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
164 pAbayernrCtx->isIQParaUpdate = false;
165 }
166
167 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
168 return ABAYER2DNR_V23_RET_SUCCESS;
169 }
170
171
172 //anr preprocess
Abayer2dnr_PreProcess_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx)173 Abayer2dnr_result_V23_t Abayer2dnr_PreProcess_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx)
174 {
175 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
176 //need todo what?
177
178 Abayer2dnr_IQParaUpdate_V23(pAbayernrCtx);
179
180 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
181 return ABAYER2DNR_V23_RET_SUCCESS;
182 }
183
184 //anr process
Abayer2dnr_Process_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_ExpInfo_V23_t * pExpInfo)185 Abayer2dnr_result_V23_t Abayer2dnr_Process_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_ExpInfo_V23_t *pExpInfo)
186 {
187 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
188 Abayer2dnr_ParamMode_V23_t mode = ABAYER2DNR_V23_PARAM_MODE_INVALID;
189
190 if(pAbayernrCtx == NULL || pExpInfo == NULL) {
191 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
192 return ABAYER2DNR_V23_RET_INVALID_PARM;
193 }
194
195 if(pAbayernrCtx->eState != ABAYER2DNR_V23_STATE_RUNNING) {
196 return ABAYER2DNR_V23_RET_SUCCESS;
197 }
198
199 Abayer2dnr_ParamModeProcess_V23(pAbayernrCtx, pExpInfo, &mode);
200
201 if(pAbayernrCtx->eMode == ABAYER2DNR_V23_OP_MODE_AUTO) {
202
203 #if ABAYER2DNR_USE_JSON_FILE_V23
204 if(pExpInfo->snr_mode != pAbayernrCtx->stExpInfo.snr_mode || pAbayernrCtx->eParamMode != mode) {
205 LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
206 pAbayernrCtx->eParamMode = mode;
207 Abayer2dnr_ConfigSettingParam_V23(pAbayernrCtx, pAbayernrCtx->eParamMode, pExpInfo->snr_mode);
208 }
209 #endif
210
211 //select param
212 bayer2dnr_select_params_by_ISO_V23(&pAbayernrCtx->stAuto.st2DParams, &pAbayernrCtx->stAuto.st2DSelect, pExpInfo);
213 } else if(pAbayernrCtx->eMode == ABAYER2DNR_V23_OP_MODE_MANUAL) {
214 //TODO
215 }
216
217 memcpy(&pAbayernrCtx->stExpInfo, pExpInfo, sizeof(Abayer2dnr_ExpInfo_V23_t));
218
219 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
220 return ABAYER2DNR_V23_RET_SUCCESS;
221
222 }
223
224
225
226 //anr get result
Abayer2dnr_GetProcResult_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_ProcResult_V23_t * pAbayernrResult)227 Abayer2dnr_result_V23_t Abayer2dnr_GetProcResult_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_ProcResult_V23_t* pAbayernrResult)
228 {
229 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
230
231 if(pAbayernrCtx == NULL || pAbayernrResult == NULL) {
232 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
233 return ABAYER2DNR_V23_RET_INVALID_PARM;
234 }
235
236 RK_Bayer2dnrV23_Params_Select_t* st2DSelect = NULL;
237 if(pAbayernrCtx->eMode == ABAYER2DNR_V23_OP_MODE_AUTO) {
238 st2DSelect = &pAbayernrCtx->stAuto.st2DSelect;
239 } else if(pAbayernrCtx->eMode == ABAYER2DNR_V23_OP_MODE_MANUAL) {
240 st2DSelect = &pAbayernrCtx->stManual.st2DSelect;
241 }
242
243 //transfer to reg value
244 bayer2dnr_fix_transfer_V23(st2DSelect, pAbayernrResult->st2DFix, &pAbayernrCtx->stStrength, &pAbayernrCtx->stExpInfo);
245
246 if(pAbayernrCtx->eMode == ABAYER2DNR_V23_OP_MODE_REG_MANUAL) {
247 *pAbayernrResult->st2DFix = pAbayernrCtx->stManual.st2Dfix;
248 pAbayernrCtx->stStrength.percent = 1.0;
249 }
250
251 LOGD_ANR("%s:%d xml:local:%d mode:%d reg: local gain:%d mfnr gain:%d mode:%d\n",
252 __FUNCTION__, __LINE__);
253
254 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
255 return ABAYER2DNR_V23_RET_SUCCESS;
256 }
257
Abayer2dnr_ConfigSettingParam_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_ParamMode_V23_t eParamMode,int snr_mode)258 Abayer2dnr_result_V23_t Abayer2dnr_ConfigSettingParam_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_ParamMode_V23_t eParamMode, int snr_mode)
259 {
260 char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
261 char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
262 memset(param_mode_name, 0x00, sizeof(param_mode_name));
263 memset(snr_name, 0x00, sizeof(snr_name));
264
265 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
266 if(pAbayernrCtx == NULL) {
267 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
268 return ABAYER2DNR_V23_RET_INVALID_PARM;
269 }
270
271 //select param mode first
272 if(eParamMode == ABAYER2DNR_V23_PARAM_MODE_NORMAL) {
273 sprintf(param_mode_name, "%s", "normal");
274 } else if(eParamMode == ABAYER2DNR_V23_PARAM_MODE_HDR) {
275 sprintf(param_mode_name, "%s", "hdr");
276 } else if(eParamMode == ABAYER2DNR_V23_PARAM_MODE_GRAY) {
277 sprintf(param_mode_name, "%s", "gray");
278 } else {
279 LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
280 sprintf(param_mode_name, "%s", "normal");
281 }
282
283 //then select snr mode next
284 if(snr_mode == 1) {
285 sprintf(snr_name, "%s", "HSNR");
286 } else if(snr_mode == 0) {
287 sprintf(snr_name, "%s", "LSNR");
288 } else {
289 LOGE_ANR("%s(%d): not support snr mode:%d!\n", __FUNCTION__, __LINE__, snr_mode);
290 sprintf(snr_name, "%s", "LSNR");
291 }
292
293 #if (ABAYER2DNR_USE_JSON_FILE_V23)
294 bayer2dnr_config_setting_param_json_V23(&pAbayernrCtx->stAuto.st2DParams, &pAbayernrCtx->bayernr_v23, param_mode_name, snr_name);
295 #endif
296 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
297 return ABAYER2DNR_V23_RET_SUCCESS;
298 }
299
Abayer2dnr_ParamModeProcess_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_ExpInfo_V23_t * pExpInfo,Abayer2dnr_ParamMode_V23_t * mode)300 Abayer2dnr_result_V23_t Abayer2dnr_ParamModeProcess_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_ExpInfo_V23_t *pExpInfo, Abayer2dnr_ParamMode_V23_t *mode) {
301 Abayer2dnr_result_V23_t res = ABAYER2DNR_V23_RET_SUCCESS;
302 *mode = pAbayernrCtx->eParamMode;
303
304 if(pAbayernrCtx == NULL) {
305 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
306 return ABAYER2DNR_V23_RET_INVALID_PARM;
307 }
308
309 if(pAbayernrCtx->isGrayMode) {
310 *mode = ABAYER2DNR_V23_PARAM_MODE_GRAY;
311 } else if(pExpInfo->hdr_mode == 0) {
312 *mode = ABAYER2DNR_V23_PARAM_MODE_NORMAL;
313 } else if(pExpInfo->hdr_mode >= 1) {
314 *mode = ABAYER2DNR_V23_PARAM_MODE_HDR;
315 } else {
316 *mode = ABAYER2DNR_V23_PARAM_MODE_NORMAL;
317 }
318
319 return res;
320 }
321
322
323 RKAIQ_END_DECLARE
324
325
326