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