1
2 #include "rk_aiq_acnr_algo_v30.h"
3 #include "rk_aiq_acnr_algo_itf_v30.h"
4
5 RKAIQ_BEGIN_DECLARE
6
Acnr_Start_V30(Acnr_Context_V30_t * pAcnrCtx)7 AcnrV30_result_t Acnr_Start_V30(Acnr_Context_V30_t *pAcnrCtx)
8 {
9 LOGI_ANR( "%s:enter!\n", __FUNCTION__);
10
11 // initial checks
12 if (pAcnrCtx == NULL) {
13 return (ACNRV30_RET_NULL_POINTER);
14 }
15
16 if ((ACNRV30_STATE_RUNNING == pAcnrCtx->eState)
17 || (ACNRV30_STATE_LOCKED == pAcnrCtx->eState)) {
18 return (ACNRV30_RET_FAILURE);
19 }
20
21 pAcnrCtx->eState = ACNRV30_STATE_RUNNING;
22
23 LOGI_ANR( "%s:exit!\n", __FUNCTION__);
24 return (ACNRV30_RET_SUCCESS);
25 }
26
27
Acnr_Stop_V30(Acnr_Context_V30_t * pAcnrCtx)28 AcnrV30_result_t Acnr_Stop_V30(Acnr_Context_V30_t *pAcnrCtx)
29 {
30 LOGI_ANR( "%s:enter!\n", __FUNCTION__);
31
32 // initial checks
33 if (pAcnrCtx == NULL) {
34 return (ACNRV30_RET_NULL_POINTER);
35 }
36
37 if (ACNRV30_STATE_LOCKED == pAcnrCtx->eState) {
38 return (ACNRV30_RET_FAILURE);
39 }
40
41 pAcnrCtx->eState = ACNRV30_STATE_STOPPED;
42
43 LOGI_ANR( "%s:exit!\n", __FUNCTION__);
44 return (ACNRV30_RET_SUCCESS);
45 }
46
47
48 //anr inint
Acnr_Init_V30(Acnr_Context_V30_t ** ppAcnrCtx,void * pCalibDb)49 AcnrV30_result_t Acnr_Init_V30(Acnr_Context_V30_t **ppAcnrCtx, void *pCalibDb)
50 {
51 Acnr_Context_V30_t * pAcnrCtx;
52
53 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
54
55 pAcnrCtx = (Acnr_Context_V30_t *)malloc(sizeof(Acnr_Context_V30_t));
56 if(pAcnrCtx == NULL) {
57 LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
58 return ACNRV30_RET_NULL_POINTER;
59 }
60
61 memset(pAcnrCtx, 0x00, sizeof(Acnr_Context_V30_t));
62
63 //gain state init
64 pAcnrCtx->stStrength.strength_enable = true;
65 pAcnrCtx->stStrength.percent = 1.0;
66
67 pAcnrCtx->eState = ACNRV30_STATE_INITIALIZED;
68 *ppAcnrCtx = pAcnrCtx;
69
70 pAcnrCtx->eMode = ACNRV30_OP_MODE_AUTO;
71 pAcnrCtx->isIQParaUpdate = false;
72 pAcnrCtx->isGrayMode = false;
73 pAcnrCtx->isReCalculate = 1;
74
75 #if ACNR_USE_XML_FILE_V30
76 //read v30 params from xml
77 #if ACNR_USE_JSON_FILE_V30
78 pAcnrCtx->cnr_v30 =
79 *(CalibDbV2_CNRV30_t *)(CALIBDBV2_GET_MODULE_PTR(pCalibDb, cnr_v30));
80 #endif
81
82 #endif
83
84 #if RK_SIMULATOR_HW
85 //just for v30 params from html
86
87 #endif
88
89 #if ACNR_USE_XML_FILE_V30
90 pAcnrCtx->stExpInfo.snr_mode = 1;
91 pAcnrCtx->eParamMode = ACNRV30_PARAM_MODE_NORMAL;
92 Acnr_ConfigSettingParam_V30(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 ACNRV30_RET_SUCCESS;
100 }
101
102 //anr release
Acnr_Release_V30(Acnr_Context_V30_t * pAcnrCtx)103 AcnrV30_result_t Acnr_Release_V30(Acnr_Context_V30_t *pAcnrCtx)
104 {
105 AcnrV30_result_t result = ACNRV30_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 ACNRV30_RET_NULL_POINTER;
110 }
111
112 result = Acnr_Stop_V30(pAcnrCtx);
113 if (result != ACNRV30_RET_SUCCESS) {
114 LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
115 return (result);
116 }
117
118 // check state
119 if ((ACNRV30_STATE_RUNNING == pAcnrCtx->eState)
120 || (ACNRV30_STATE_LOCKED == pAcnrCtx->eState)) {
121 return (ACNRV30_RET_BUSY);
122 }
123
124 memset(pAcnrCtx, 0x00, sizeof(Acnr_Context_V30_t));
125 free(pAcnrCtx);
126
127 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
128 return ACNRV30_RET_SUCCESS;
129 }
130
131 //anr config
Acnr_Prepare_V30(Acnr_Context_V30_t * pAcnrCtx,Acnr_Config_V30_t * pAcnrConfig)132 AcnrV30_result_t Acnr_Prepare_V30(Acnr_Context_V30_t *pAcnrCtx, Acnr_Config_V30_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 ACNRV30_RET_INVALID_PARM;
139 }
140
141 if(!!(pAcnrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
142 Acnr_IQParaUpdate_V30(pAcnrCtx);
143 }
144
145 pAcnrCtx->rawWidth = pAcnrConfig->rawWidth;
146 pAcnrCtx->rawHeight = pAcnrConfig->rawHeight;
147 Acnr_Start_V30(pAcnrCtx);
148
149 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
150 return ACNRV30_RET_SUCCESS;
151 }
152
153 //anr reconfig
Acnr_ReConfig_V30(Acnr_Context_V30_t * pAcnrCtx,Acnr_Config_V30_t * pAcnrConfig)154 AcnrV30_result_t Acnr_ReConfig_V30(Acnr_Context_V30_t *pAcnrCtx, Acnr_Config_V30_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 ACNRV30_RET_SUCCESS;
161 }
162
163 //anr reconfig
Acnr_IQParaUpdate_V30(Acnr_Context_V30_t * pAcnrCtx)164 AcnrV30_result_t Acnr_IQParaUpdate_V30(Acnr_Context_V30_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_V30(pAcnrCtx, pAcnrCtx->eParamMode, pAcnrCtx->stExpInfo.snr_mode);
172 pAcnrCtx->isIQParaUpdate = false;
173 }
174
175 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
176 return ACNRV30_RET_SUCCESS;
177 }
178
179
180 //anr preprocess
Acnr_PreProcess_V30(Acnr_Context_V30_t * pAcnrCtx)181 AcnrV30_result_t Acnr_PreProcess_V30(Acnr_Context_V30_t *pAcnrCtx)
182 {
183 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
184 //need todo what?
185
186 Acnr_IQParaUpdate_V30(pAcnrCtx);
187
188 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
189 return ACNRV30_RET_SUCCESS;
190 }
191
192 //anr process
Acnr_Process_V30(Acnr_Context_V30_t * pAcnrCtx,AcnrV30_ExpInfo_t * pExpInfo)193 AcnrV30_result_t Acnr_Process_V30(Acnr_Context_V30_t *pAcnrCtx, AcnrV30_ExpInfo_t *pExpInfo)
194 {
195 LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
196 AcnrV30_ParamMode_t mode = ACNRV30_PARAM_MODE_INVALID;
197
198 if(pAcnrCtx == NULL) {
199 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
200 return ACNRV30_RET_INVALID_PARM;
201 }
202
203 if(pExpInfo == NULL) {
204 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
205 return ACNRV30_RET_INVALID_PARM;
206 }
207
208 if(pAcnrCtx->eState != ACNRV30_STATE_RUNNING) {
209 return ACNRV30_RET_SUCCESS;
210 }
211
212
213 Acnr_ParamModeProcess_V30(pAcnrCtx, pExpInfo, &mode);
214
215 if(pAcnrCtx->eMode == ACNRV30_OP_MODE_AUTO) {
216
217 LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
218
219 #if ACNR_USE_XML_FILE_V30
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_V30(pAcnrCtx, pAcnrCtx->eParamMode, pExpInfo->snr_mode);
224 }
225 #endif
226
227 //select param
228 cnr_select_params_by_ISO_V30(&pAcnrCtx->stAuto.stParams, &pAcnrCtx->stAuto.stSelect, pExpInfo);
229
230 } else if(pAcnrCtx->eMode == ACNRV30_OP_MODE_MANUAL) {
231 //TODO
232 }
233
234 memcpy(&pAcnrCtx->stExpInfo, pExpInfo, sizeof(AcnrV30_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 ACNRV30_RET_SUCCESS;
240
241 }
242
243
244
245 //anr get result
Acnr_GetProcResult_V30(Acnr_Context_V30_t * pAcnrCtx,Acnr_ProcResult_V30_t * pAcnrResult)246 AcnrV30_result_t Acnr_GetProcResult_V30(Acnr_Context_V30_t *pAcnrCtx, Acnr_ProcResult_V30_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 ACNRV30_RET_INVALID_PARM;
253 }
254
255 if(pAcnrResult == NULL) {
256 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
257 return ACNRV30_RET_INVALID_PARM;
258 }
259
260 RK_CNR_Params_V30_Select_t* stSelect = NULL;
261 if(pAcnrCtx->eMode == ACNRV30_OP_MODE_AUTO) {
262 stSelect = &pAcnrCtx->stAuto.stSelect;
263 } else if(pAcnrCtx->eMode == ACNRV30_OP_MODE_MANUAL) {
264 stSelect = &pAcnrCtx->stManual.stSelect;
265 }
266
267 //transfer to reg value
268 cnr_fix_transfer_V30(stSelect, pAcnrResult->stFix, &pAcnrCtx->stExpInfo, &pAcnrCtx->stStrength);
269
270 if(pAcnrCtx->eMode == ACNRV30_OP_MODE_REG_MANUAL) {
271 *pAcnrResult->stFix = pAcnrCtx->stManual.stFix;
272 pAcnrCtx->stStrength.percent = 1.0;
273 }
274
275 LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
276 return ACNRV30_RET_SUCCESS;
277 }
278
Acnr_ConfigSettingParam_V30(Acnr_Context_V30_t * pAcnrCtx,AcnrV30_ParamMode_t eParamMode,int snr_mode)279 AcnrV30_result_t Acnr_ConfigSettingParam_V30(Acnr_Context_V30_t *pAcnrCtx, AcnrV30_ParamMode_t eParamMode, int snr_mode)
280 {
281 char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
282 char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
283 memset(param_mode_name, 0x00, sizeof(param_mode_name));
284 memset(snr_name, 0x00, sizeof(snr_name));
285
286 if(pAcnrCtx == NULL) {
287 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
288 return ACNRV30_RET_INVALID_PARM;
289 }
290
291 //select param mode first
292 if(eParamMode == ACNRV30_PARAM_MODE_NORMAL) {
293 sprintf(param_mode_name, "%s", "normal");
294 } else if(eParamMode == ACNRV30_PARAM_MODE_HDR) {
295 sprintf(param_mode_name, "%s", "hdr");
296 } else if(eParamMode == ACNRV30_PARAM_MODE_GRAY) {
297 sprintf(param_mode_name, "%s", "gray");
298 } else {
299 LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
300 sprintf(param_mode_name, "%s", "normal");
301 }
302
303
304 //then select snr mode next
305 if(snr_mode == 1) {
306 sprintf(snr_name, "%s", "HSNR");
307 } else if(snr_mode == 0) {
308 sprintf(snr_name, "%s", "LSNR");
309 } else {
310 LOGE_ANR("%s(%d): not support snr mode:%d!\n", __FUNCTION__, __LINE__, snr_mode);
311 sprintf(snr_name, "%s", "LSNR");
312 }
313
314 #if ACNR_USE_JSON_FILE_V30
315 cnr_config_setting_param_json_V30(&pAcnrCtx->stAuto.stParams, &pAcnrCtx->cnr_v30, param_mode_name, snr_name);
316 #endif
317
318 return ACNRV30_RET_SUCCESS;
319 }
320
Acnr_ParamModeProcess_V30(Acnr_Context_V30_t * pAcnrCtx,AcnrV30_ExpInfo_t * pExpInfo,AcnrV30_ParamMode_t * mode)321 AcnrV30_result_t Acnr_ParamModeProcess_V30(Acnr_Context_V30_t *pAcnrCtx, AcnrV30_ExpInfo_t *pExpInfo, AcnrV30_ParamMode_t *mode) {
322 AcnrV30_result_t res = ACNRV30_RET_SUCCESS;
323 *mode = pAcnrCtx->eParamMode;
324
325 if(pAcnrCtx == NULL) {
326 LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
327 return ACNRV30_RET_INVALID_PARM;
328 }
329
330 if(pAcnrCtx->isGrayMode) {
331 *mode = ACNRV30_PARAM_MODE_GRAY;
332 } else if(pExpInfo->hdr_mode == 0) {
333 *mode = ACNRV30_PARAM_MODE_NORMAL;
334 } else if(pExpInfo->hdr_mode >= 1) {
335 *mode = ACNRV30_PARAM_MODE_HDR;
336 } else {
337 *mode = ACNRV30_PARAM_MODE_NORMAL;
338 }
339
340 return res;
341 }
342
343
344 RKAIQ_END_DECLARE
345
346
347