1
2 #include "rk_aiq_acnr_algo_v1.h"
3 #include "rk_aiq_acnr_algo_itf_v1.h"
4 #include "RkAiqCalibDbV2Helper.h"
5
6 RKAIQ_BEGIN_DECLARE
7
Acnr_Start_V1(Acnr_Context_V1_t * pAcnrCtx)8 Acnr_result_t Acnr_Start_V1(Acnr_Context_V1_t *pAcnrCtx)
9 {
10 LOGI_ANR( "%s:enter!\n", __FUNCTION__);
11
12 // initial checks
13 if (pAcnrCtx == NULL) {
14 return (ACNR_RET_NULL_POINTER);
15 }
16
17 if ((ACNR_STATE_RUNNING == pAcnrCtx->eState)
18 || (ACNR_STATE_LOCKED == pAcnrCtx->eState)) {
19 return (ACNR_RET_FAILURE);
20 }
21
22 pAcnrCtx->eState = ACNR_STATE_RUNNING;
23
24 LOGI_ANR( "%s:exit!\n", __FUNCTION__);
25 return (ACNR_RET_SUCCESS);
26 }
27
28
Acnr_Stop_V1(Acnr_Context_V1_t * pAcnrCtx)29 Acnr_result_t Acnr_Stop_V1(Acnr_Context_V1_t *pAcnrCtx)
30 {
31 LOGI_ANR( "%s:enter!\n", __FUNCTION__);
32
33 // initial checks
34 if (pAcnrCtx == NULL) {
35 return (ACNR_RET_NULL_POINTER);
36 }
37
38 if (ACNR_STATE_LOCKED == pAcnrCtx->eState) {
39 return (ACNR_RET_FAILURE);
40 }
41
42 pAcnrCtx->eState = ACNR_STATE_STOPPED;
43
44 LOGI_ANR( "%s:exit!\n", __FUNCTION__);
45 return (ACNR_RET_SUCCESS);
46 }
47
48
49 //anr inint
Acnr_Init_V1(Acnr_Context_V1_t ** ppAcnrCtx,void * pCalibDb)50 Acnr_result_t Acnr_Init_V1(Acnr_Context_V1_t **ppAcnrCtx, void *pCalibDb)
51 {
52 Acnr_Context_V1_t * pAcnrCtx;
53
54 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
55
56 pAcnrCtx = (Acnr_Context_V1_t *)malloc(sizeof(Acnr_Context_V1_t));
57 if(pAcnrCtx == NULL) {
58 LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
59 return ACNR_RET_NULL_POINTER;
60 }
61
62 memset(pAcnrCtx, 0x00, sizeof(Acnr_Context_V1_t));
63
64 //gain state init
65 pAcnrCtx->fCnr_SF_Strength = 1.0;
66
67 pAcnrCtx->eState = ACNR_STATE_INITIALIZED;
68 *ppAcnrCtx = pAcnrCtx;
69
70 pAcnrCtx->eMode = ACNR_OP_MODE_AUTO;
71 pAcnrCtx->isIQParaUpdate = false;
72 pAcnrCtx->isGrayMode = false;
73 pAcnrCtx->isReCalculate = 1;
74
75 #if ACNR_USE_XML_FILE_V1
76 //read v1 params from xml
77 #if ACNR_USE_JSON_FILE_V1
78 pAcnrCtx->cnr_v1 =
79 *(CalibDbV2_CNR_t *)(CALIBDBV2_GET_MODULE_PTR(pCalibDb, cnr_v1));
80 #else
81 pAcnrCtx->list_cnr_v1 =
82 (struct list_head*)(CALIBDB_GET_MODULE_PTR(pCalibDb, list_cnr_v1));
83 printf("%s(%d): cnrV1 list:%p\n", __FUNCTION__, __LINE__, pAcnrCtx->list_cnr_v1);
84 #endif
85 #endif
86
87 #if RK_SIMULATOR_HW
88 //just for v2 params from html
89
90 #endif
91
92 #if ACNR_USE_XML_FILE_V1
93 pAcnrCtx->stExpInfo.snr_mode = 1;
94 pAcnrCtx->eParamMode = ACNR_PARAM_MODE_NORMAL;
95 Acnr_ConfigSettingParam_V1(pAcnrCtx, pAcnrCtx->eParamMode, pAcnrCtx->stExpInfo.snr_mode);
96 #endif
97
98 LOGD_ANR("%s(%d):", __FUNCTION__, __LINE__);
99
100
101 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
102 return ACNR_RET_SUCCESS;
103 }
104
105 //anr release
Acnr_Release_V1(Acnr_Context_V1_t * pAcnrCtx)106 Acnr_result_t Acnr_Release_V1(Acnr_Context_V1_t *pAcnrCtx)
107 {
108 Acnr_result_t result = ACNR_RET_SUCCESS;
109 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
110 if(pAcnrCtx == NULL) {
111 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
112 return ACNR_RET_NULL_POINTER;
113 }
114
115 result = Acnr_Stop_V1(pAcnrCtx);
116 if (result != ACNR_RET_SUCCESS) {
117 LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
118 return (result);
119 }
120
121 // check state
122 if ((ACNR_STATE_RUNNING == pAcnrCtx->eState)
123 || (ACNR_STATE_LOCKED == pAcnrCtx->eState)) {
124 return (ACNR_RET_BUSY);
125 }
126
127 memset(pAcnrCtx, 0x00, sizeof(Acnr_Context_V1_t));
128 free(pAcnrCtx);
129
130 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
131 return ACNR_RET_SUCCESS;
132 }
133
134 //anr config
Acnr_Prepare_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_Config_V1_t * pAcnrConfig)135 Acnr_result_t Acnr_Prepare_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_Config_V1_t* pAcnrConfig)
136 {
137 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
138
139 if(pAcnrCtx == NULL || pAcnrConfig == NULL) {
140 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
141 return ACNR_RET_INVALID_PARM;
142 }
143
144 if(!!(pAcnrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
145 Acnr_IQParaUpdate_V1(pAcnrCtx);
146 }
147
148 pAcnrCtx->rawWidth = pAcnrConfig->rawWidth;
149 pAcnrCtx->rawHeight = pAcnrConfig->rawHeight;
150 Acnr_Start_V1(pAcnrCtx);
151
152 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
153 return ACNR_RET_SUCCESS;
154 }
155
156 //anr reconfig
Acnr_ReConfig_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_Config_V1_t * pAcnrConfig)157 Acnr_result_t Acnr_ReConfig_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_Config_V1_t* pAcnrConfig)
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 ACNR_RET_SUCCESS;
164 }
165
166 //anr reconfig
Acnr_IQParaUpdate_V1(Acnr_Context_V1_t * pAcnrCtx)167 Acnr_result_t Acnr_IQParaUpdate_V1(Acnr_Context_V1_t *pAcnrCtx)
168 {
169 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
170 //need todo what?
171
172 if(pAcnrCtx->isIQParaUpdate) {
173 LOGD_ANR("IQ data reconfig\n");
174 Acnr_ConfigSettingParam_V1(pAcnrCtx, pAcnrCtx->eParamMode, pAcnrCtx->stExpInfo.snr_mode);
175 pAcnrCtx->isIQParaUpdate = false;
176 }
177
178 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
179 return ACNR_RET_SUCCESS;
180 }
181
182
183 //anr preprocess
Acnr_PreProcess_V1(Acnr_Context_V1_t * pAcnrCtx)184 Acnr_result_t Acnr_PreProcess_V1(Acnr_Context_V1_t *pAcnrCtx)
185 {
186 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
187 //need todo what?
188
189 Acnr_IQParaUpdate_V1(pAcnrCtx);
190
191 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
192 return ACNR_RET_SUCCESS;
193 }
194
195 //anr process
Acnr_Process_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_ExpInfo_t * pExpInfo)196 Acnr_result_t Acnr_Process_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ExpInfo_t *pExpInfo)
197 {
198 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
199 Acnr_ParamMode_t mode = ACNR_PARAM_MODE_INVALID;
200
201 if(pAcnrCtx == NULL) {
202 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
203 return ACNR_RET_INVALID_PARM;
204 }
205
206 if(pExpInfo == NULL) {
207 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
208 return ACNR_RET_INVALID_PARM;
209 }
210
211 if(pAcnrCtx->eState != ACNR_STATE_RUNNING) {
212 return ACNR_RET_SUCCESS;
213 }
214
215
216 Acnr_ParamModeProcess_V1(pAcnrCtx, pExpInfo, &mode);
217
218 if(pAcnrCtx->eMode == ACNR_OP_MODE_AUTO) {
219
220 LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
221
222 #if ACNR_USE_XML_FILE_V1
223 if(pExpInfo->snr_mode != pAcnrCtx->stExpInfo.snr_mode || pAcnrCtx->eParamMode != mode) {
224 LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
225 pAcnrCtx->eParamMode = mode;
226 Acnr_ConfigSettingParam_V1(pAcnrCtx, pAcnrCtx->eParamMode, pExpInfo->snr_mode);
227 }
228 #endif
229
230 //select param
231 cnr_select_params_by_ISO_V1(&pAcnrCtx->stAuto.stParams, &pAcnrCtx->stAuto.stSelect, pExpInfo);
232
233 } else if(pAcnrCtx->eMode == ACNR_OP_MODE_MANUAL) {
234 //TODO
235 }
236
237 memcpy(&pAcnrCtx->stExpInfo, pExpInfo, sizeof(Acnr_ExpInfo_t));
238 pAcnrCtx->stExpInfo.rawHeight = pAcnrCtx->rawHeight;
239 pAcnrCtx->stExpInfo.rawWidth = pAcnrCtx->rawWidth;
240
241 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
242 return ACNR_RET_SUCCESS;
243
244 }
245
246
247
248 //anr get result
Acnr_GetProcResult_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_ProcResult_V1_t * pAcnrResult)249 Acnr_result_t Acnr_GetProcResult_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ProcResult_V1_t* pAcnrResult)
250 {
251 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
252
253 if(pAcnrCtx == NULL) {
254 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
255 return ACNR_RET_INVALID_PARM;
256 }
257
258 if(pAcnrResult == NULL) {
259 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
260 return ACNR_RET_INVALID_PARM;
261 }
262
263 RK_CNR_Params_V1_Select_t* stSelect = NULL;
264 if(pAcnrCtx->eMode == ACNR_OP_MODE_AUTO) {
265 stSelect = &pAcnrCtx->stAuto.stSelect;
266 } else if(pAcnrCtx->eMode == ACNR_OP_MODE_MANUAL) {
267 //TODO
268 stSelect = &pAcnrCtx->stManual.stSelect;
269 pAcnrCtx->fCnr_SF_Strength = 1.0;
270 }
271
272 //transfer to reg value
273 cnr_fix_transfer_V1(stSelect, pAcnrResult->stFix, &pAcnrCtx->stExpInfo, pAcnrCtx->fCnr_SF_Strength);
274
275 LOGD_ANR("%s:%d xml:local:%d mode:%d reg: local gain:%d mfnr gain:%d mode:%d\n",
276 __FUNCTION__, __LINE__);
277
278 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
279 return ACNR_RET_SUCCESS;
280 }
281
Acnr_ConfigSettingParam_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_ParamMode_t eParamMode,int snr_mode)282 Acnr_result_t Acnr_ConfigSettingParam_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ParamMode_t eParamMode, int snr_mode)
283 {
284 char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
285 char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
286 memset(param_mode_name, 0x00, sizeof(param_mode_name));
287 memset(snr_name, 0x00, sizeof(snr_name));
288
289 if(pAcnrCtx == NULL) {
290 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
291 return ACNR_RET_INVALID_PARM;
292 }
293
294 //select param mode first
295 if(eParamMode == ACNR_PARAM_MODE_NORMAL) {
296 sprintf(param_mode_name, "%s", "normal");
297 } else if(eParamMode == ACNR_PARAM_MODE_HDR) {
298 sprintf(param_mode_name, "%s", "hdr");
299 } else if(eParamMode == ACNR_PARAM_MODE_GRAY) {
300 sprintf(param_mode_name, "%s", "gray");
301 } else {
302 LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
303 sprintf(param_mode_name, "%s", "normal");
304 }
305
306
307 //then select snr mode next
308 if(snr_mode == 1) {
309 sprintf(snr_name, "%s", "HSNR");
310 } else if(snr_mode == 0) {
311 sprintf(snr_name, "%s", "LSNR");
312 } else {
313 LOGE_ANR("%s(%d): not support snr mode:%d!\n", __FUNCTION__, __LINE__, snr_mode);
314 sprintf(snr_name, "%s", "LSNR");
315 }
316
317 #if ACNR_USE_JSON_FILE_V1
318 cnr_config_setting_param_json_V1(&pAcnrCtx->stAuto.stParams, &pAcnrCtx->cnr_v1, param_mode_name, snr_name);
319 #else
320 cnr_config_setting_param_V1(&pAcnrCtx->stAuto.stParams, pAcnrCtx->list_cnr_v1, param_mode_name, snr_name);
321 #endif
322
323 return ACNR_RET_SUCCESS;
324 }
325
Acnr_ParamModeProcess_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_ExpInfo_t * pExpInfo,Acnr_ParamMode_t * mode)326 Acnr_result_t Acnr_ParamModeProcess_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ExpInfo_t *pExpInfo, Acnr_ParamMode_t *mode) {
327 Acnr_result_t res = ACNR_RET_SUCCESS;
328 *mode = pAcnrCtx->eParamMode;
329
330 if(pAcnrCtx == NULL) {
331 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
332 return ACNR_RET_INVALID_PARM;
333 }
334
335 if(pAcnrCtx->isGrayMode) {
336 *mode = ACNR_PARAM_MODE_GRAY;
337 } else if(pExpInfo->hdr_mode == 0) {
338 *mode = ACNR_PARAM_MODE_NORMAL;
339 } else if(pExpInfo->hdr_mode >= 1) {
340 *mode = ACNR_PARAM_MODE_HDR;
341 } else {
342 *mode = ACNR_PARAM_MODE_NORMAL;
343 }
344
345 return res;
346 }
347
348
349 RKAIQ_END_DECLARE
350
351
352