1 
2 #include "rk_aiq_abayertnr_algo_v23.h"
3 #include "rk_aiq_abayertnr_algo_itf_v23.h"
4 
5 RKAIQ_BEGIN_DECLARE
6 
Abayertnr_Start_V23(Abayertnr_Context_V23_t * pAbayertnrCtx)7 Abayertnr_result_V23_t Abayertnr_Start_V23(Abayertnr_Context_V23_t *pAbayertnrCtx)
8 {
9     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
10 
11     // initial checks
12     if (pAbayertnrCtx == NULL) {
13         return (ABAYERTNRV23_RET_NULL_POINTER);
14     }
15 
16     if ((ABAYERTNRV23_STATE_RUNNING == pAbayertnrCtx->eState)
17             || (ABAYERTNRV23_STATE_LOCKED == pAbayertnrCtx->eState)) {
18         return (ABAYERTNRV23_RET_FAILURE);
19     }
20 
21     pAbayertnrCtx->eState = ABAYERTNRV23_STATE_RUNNING;
22 
23     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
24     return (ABAYERTNRV23_RET_SUCCESS);
25 }
26 
27 
Abayertnr_Stop_V23(Abayertnr_Context_V23_t * pAbayertnrCtx)28 Abayertnr_result_V23_t Abayertnr_Stop_V23(Abayertnr_Context_V23_t *pAbayertnrCtx)
29 {
30     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
31 
32     // initial checks
33     if (pAbayertnrCtx == NULL) {
34         return (ABAYERTNRV23_RET_NULL_POINTER);
35     }
36 
37     if (ABAYERTNRV23_STATE_LOCKED == pAbayertnrCtx->eState) {
38         return (ABAYERTNRV23_RET_FAILURE);
39     }
40 
41     pAbayertnrCtx->eState = ABAYERTNRV23_STATE_STOPPED;
42 
43     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
44     return (ABAYERTNRV23_RET_SUCCESS);
45 }
46 
47 
48 //anr inint
Abayertnr_Init_V23(Abayertnr_Context_V23_t ** ppAbayertnrCtx,void * pCalibDb)49 Abayertnr_result_V23_t Abayertnr_Init_V23(Abayertnr_Context_V23_t **ppAbayertnrCtx, void *pCalibDb)
50 {
51     Abayertnr_Context_V23_t * pAbayertnrCtx;
52 
53     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
54 
55     pAbayertnrCtx = (Abayertnr_Context_V23_t *)malloc(sizeof(Abayertnr_Context_V23_t));
56     if(pAbayertnrCtx == NULL) {
57         LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
58         return ABAYERTNRV23_RET_NULL_POINTER;
59     }
60 
61     memset(pAbayertnrCtx, 0x00, sizeof(Abayertnr_Context_V23_t));
62 
63     //gain state init
64     pAbayertnrCtx->stStrength.strength_enable = true;
65     pAbayertnrCtx->stStrength.percent = 1.0;
66 
67     pAbayertnrCtx->eState = ABAYERTNRV23_STATE_INITIALIZED;
68     *ppAbayertnrCtx = pAbayertnrCtx;
69 
70     pAbayertnrCtx->eMode = ABAYERTNRV23_OP_MODE_AUTO;
71     pAbayertnrCtx->isIQParaUpdate = false;
72     pAbayertnrCtx->isGrayMode = false;
73     pAbayertnrCtx->isReCalculate = 1;
74 
75     //read v1 params from xml
76 #if (ABAYERTNR_USE_JSON_FILE_V23)
77 #if (RKAIQ_HAVE_BAYERTNR_V23)
78     CalibDbV2_BayerTnrV23_t * pcalibdbV23_bayertnr_v23 =
79         (CalibDbV2_BayerTnrV23_t *)(CALIBDBV2_GET_MODULE_PTR((CamCalibDbV2Context_t*)pCalibDb, bayertnr_v23));
80 #else
81     CalibDbV2_BayerTnrV23Lite_t* pcalibdbV23_bayertnr_v23 =
82         (CalibDbV2_BayerTnrV23Lite_t*)(CALIBDBV2_GET_MODULE_PTR((CamCalibDbV2Context_t*)pCalibDb,
83                                                                 bayertnr_v23));
84 #endif
85     pAbayertnrCtx->bayertnr_v23 = *pcalibdbV23_bayertnr_v23;
86 #endif
87 
88 
89 #if RK_SIMULATOR_HW
90     //just for v23 params from html
91 
92 #endif
93 
94 #if 1
95     pAbayertnrCtx->stExpInfo.snr_mode = 1;
96     pAbayertnrCtx->eParamMode = ABAYERTNRV23_PARAM_MODE_NORMAL;
97     Abayertnr_ConfigSettingParam_V23(pAbayertnrCtx, pAbayertnrCtx->eParamMode, pAbayertnrCtx->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 ABAYERTNRV23_RET_SUCCESS;
105 }
106 
107 //anr release
Abayertnr_Release_V23(Abayertnr_Context_V23_t * pAbayertnrCtx)108 Abayertnr_result_V23_t Abayertnr_Release_V23(Abayertnr_Context_V23_t *pAbayertnrCtx)
109 {
110     Abayertnr_result_V23_t result = ABAYERTNRV23_RET_SUCCESS;
111     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
112     if(pAbayertnrCtx == NULL) {
113         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
114         return ABAYERTNRV23_RET_NULL_POINTER;
115     }
116 
117     result = Abayertnr_Stop_V23(pAbayertnrCtx);
118     if (result != ABAYERTNRV23_RET_SUCCESS) {
119         LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
120         return (result);
121     }
122 
123     // check state
124     if ((ABAYERTNRV23_STATE_RUNNING == pAbayertnrCtx->eState)
125             || (ABAYERTNRV23_STATE_LOCKED == pAbayertnrCtx->eState)) {
126         return (ABAYERTNRV23_RET_BUSY);
127     }
128 
129     memset(pAbayertnrCtx, 0x00, sizeof(Abayertnr_Context_V23_t));
130     free(pAbayertnrCtx);
131 
132     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
133     return ABAYERTNRV23_RET_SUCCESS;
134 }
135 
136 //anr config
Abayertnr_Prepare_V23(Abayertnr_Context_V23_t * pAbayertnrCtx,Abayertnr_Config_V23_t * pAbayertnrConfig)137 Abayertnr_result_V23_t Abayertnr_Prepare_V23(Abayertnr_Context_V23_t *pAbayertnrCtx, Abayertnr_Config_V23_t* pAbayertnrConfig)
138 {
139     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
140 
141     if(pAbayertnrCtx == NULL || pAbayertnrConfig == NULL) {
142         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
143         return ABAYERTNRV23_RET_INVALID_PARM;
144     }
145 
146     if(!!(pAbayertnrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
147         Abayertnr_IQParaUpdate_V23(pAbayertnrCtx);
148     }
149 
150     Abayertnr_Start_V23(pAbayertnrCtx);
151 
152     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
153     return ABAYERTNRV23_RET_SUCCESS;
154 }
155 
156 //anr reconfig
Abayertnr_ReConfig_V23(Abayertnr_Context_V23_t * pAbayertnrCtx,Abayertnr_Config_V23_t * pAbayertnrConfig)157 Abayertnr_result_V23_t Abayertnr_ReConfig_V23(Abayertnr_Context_V23_t *pAbayertnrCtx, Abayertnr_Config_V23_t* pAbayertnrConfig)
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 ABAYERTNRV23_RET_SUCCESS;
164 }
165 
166 //anr reconfig
Abayertnr_IQParaUpdate_V23(Abayertnr_Context_V23_t * pAbayertnrCtx)167 Abayertnr_result_V23_t Abayertnr_IQParaUpdate_V23(Abayertnr_Context_V23_t *pAbayertnrCtx)
168 {
169     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
170     //need todo what?
171 
172     if(pAbayertnrCtx->isIQParaUpdate) {
173         LOGD_ANR("IQ data reconfig\n");
174         Abayertnr_ConfigSettingParam_V23(pAbayertnrCtx, pAbayertnrCtx->eParamMode, pAbayertnrCtx->stExpInfo.snr_mode);
175         pAbayertnrCtx->isIQParaUpdate = false;
176     }
177 
178     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
179     return ABAYERTNRV23_RET_SUCCESS;
180 }
181 
182 
183 //anr preprocess
Abayertnr_PreProcess_V23(Abayertnr_Context_V23_t * pAbayertnrCtx)184 Abayertnr_result_V23_t Abayertnr_PreProcess_V23(Abayertnr_Context_V23_t *pAbayertnrCtx)
185 {
186     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
187     //need todo what?
188 
189     Abayertnr_IQParaUpdate_V23(pAbayertnrCtx);
190 
191     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
192     return ABAYERTNRV23_RET_SUCCESS;
193 }
194 
195 //anr process
Abayertnr_Process_V23(Abayertnr_Context_V23_t * pAbayertnrCtx,Abayertnr_ExpInfo_V23_t * pExpInfo)196 Abayertnr_result_V23_t Abayertnr_Process_V23(Abayertnr_Context_V23_t *pAbayertnrCtx, Abayertnr_ExpInfo_V23_t *pExpInfo)
197 {
198     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
199     Abayertnr_ParamMode_V23_t mode = ABAYERTNRV23_PARAM_MODE_INVALID;
200 
201     if(pAbayertnrCtx == NULL || pExpInfo == NULL) {
202         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
203         return ABAYERTNRV23_RET_INVALID_PARM;
204     }
205 
206     if(pAbayertnrCtx->eState != ABAYERTNRV23_STATE_RUNNING) {
207         return ABAYERTNRV23_RET_SUCCESS;
208     }
209 
210     Abayertnr_ParamModeProcess_V23(pAbayertnrCtx, pExpInfo, &mode);
211 
212     if(pAbayertnrCtx->eMode == ABAYERTNRV23_OP_MODE_AUTO) {
213 
214         LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
215 
216 #if ABAYERTNR_USE_XML_FILE_V23
217         if(pExpInfo->snr_mode != pAbayertnrCtx->stExpInfo.snr_mode || pAbayertnrCtx->eParamMode != mode) {
218             LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
219             pAbayertnrCtx->eParamMode = mode;
220             Abayertnr_ConfigSettingParam_V23(pAbayertnrCtx, pAbayertnrCtx->eParamMode, pExpInfo->snr_mode);
221         }
222 #endif
223 
224         //select param
225         bayertnr_select_params_by_ISO_V23(&pAbayertnrCtx->stAuto.st3DParams, &pAbayertnrCtx->stAuto.st3DSelect, pExpInfo);
226 
227     } else if(pAbayertnrCtx->eMode == ABAYERTNRV23_OP_MODE_MANUAL) {
228         //TODO
229     }
230 
231     memcpy(&pAbayertnrCtx->stExpInfo, pExpInfo, sizeof(Abayertnr_ExpInfo_V23_t));
232 
233     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
234     return ABAYERTNRV23_RET_SUCCESS;
235 
236 }
237 
238 
239 
240 //anr get result
Abayertnr_GetProcResult_V23(Abayertnr_Context_V23_t * pAbayertnrCtx,Abayertnr_ProcResult_V23_t * pAbayertnrResult)241 Abayertnr_result_V23_t Abayertnr_GetProcResult_V23(Abayertnr_Context_V23_t *pAbayertnrCtx, Abayertnr_ProcResult_V23_t* pAbayertnrResult)
242 {
243     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
244 
245     if(pAbayertnrCtx == NULL || pAbayertnrResult == NULL) {
246         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
247         return ABAYERTNRV23_RET_INVALID_PARM;
248     }
249 
250 
251 #if (RKAIQ_HAVE_BAYERTNR_V23)
252     RK_Bayertnr_Params_V23_Select_t* st3DSelect = NULL;
253 #else
254     RK_Bayertnr_Param_V23L_Select_t* st3DSelect = NULL;
255 #endif
256     if(pAbayertnrCtx->eMode == ABAYERTNRV23_OP_MODE_AUTO) {
257         st3DSelect = &pAbayertnrCtx->stAuto.st3DSelect;
258 
259     } else if(pAbayertnrCtx->eMode == ABAYERTNRV23_OP_MODE_MANUAL) {
260         //TODO
261         st3DSelect = &pAbayertnrCtx->stManual.st3DSelect;
262     }
263 
264     //transfer to reg value
265     bayertnr_fix_transfer_V23(st3DSelect, pAbayertnrResult->st3DFix, &pAbayertnrCtx->stStrength, &pAbayertnrCtx->stExpInfo);
266 
267     if(pAbayertnrCtx->eMode == ABAYERTNRV23_OP_MODE_REG_MANUAL) {
268         *pAbayertnrResult->st3DFix = pAbayertnrCtx->stManual.st3DFix;
269         pAbayertnrCtx->stStrength.percent = 1.0;
270     }
271 
272     LOGD_ANR("%s:%d abayertnr eMode:%d bypass:%d iso:%d fstrength:%f\n",
273              __FUNCTION__, __LINE__,
274              pAbayertnrCtx->eMode,
275              pAbayertnrResult->st3DFix->bypass_en,
276              pAbayertnrCtx->stExpInfo.arIso[pAbayertnrCtx->stExpInfo.hdr_mode],
277              pAbayertnrCtx->stStrength.percent);
278 
279     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
280     return ABAYERTNRV23_RET_SUCCESS;
281 }
282 
Abayertnr_ConfigSettingParam_V23(Abayertnr_Context_V23_t * pAbayertnrCtx,Abayertnr_ParamMode_V23_t eParamMode,int snr_mode)283 Abayertnr_result_V23_t Abayertnr_ConfigSettingParam_V23(Abayertnr_Context_V23_t *pAbayertnrCtx, Abayertnr_ParamMode_V23_t eParamMode, int snr_mode)
284 {
285     char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
286     char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
287     memset(param_mode_name, 0x00, sizeof(param_mode_name));
288     memset(snr_name, 0x00, sizeof(snr_name));
289 
290     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
291     if(pAbayertnrCtx == NULL) {
292         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
293         return ABAYERTNRV23_RET_INVALID_PARM;
294     }
295 
296     //select param mode first
297     if(eParamMode == ABAYERTNRV23_PARAM_MODE_NORMAL) {
298         sprintf(param_mode_name, "%s", "normal");
299     } else if(eParamMode == ABAYERTNRV23_PARAM_MODE_HDR) {
300         sprintf(param_mode_name, "%s", "hdr");
301     } else if(eParamMode == ABAYERTNRV23_PARAM_MODE_GRAY) {
302         sprintf(param_mode_name, "%s", "gray");
303     } else {
304         LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
305         sprintf(param_mode_name, "%s", "normal");
306     }
307 
308     //then select snr mode next
309     if(snr_mode == 1) {
310         sprintf(snr_name, "%s", "HSNR");
311     } else if(snr_mode == 0) {
312         sprintf(snr_name, "%s", "LSNR");
313     } else {
314         LOGE_ANR("%s(%d): not support snr mode:%d!\n", __FUNCTION__, __LINE__, snr_mode);
315         sprintf(snr_name, "%s", "LSNR");
316     }
317 
318 #if (ABAYERTNR_USE_JSON_FILE_V23)
319     bayertnr_config_setting_param_json_V23(&pAbayertnrCtx->stAuto.st3DParams, &pAbayertnrCtx->bayertnr_v23, param_mode_name, snr_name);
320 #endif
321     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
322     return ABAYERTNRV23_RET_SUCCESS;
323 }
324 
Abayertnr_ParamModeProcess_V23(Abayertnr_Context_V23_t * pAbayertnrCtx,Abayertnr_ExpInfo_V23_t * pExpInfo,Abayertnr_ParamMode_V23_t * mode)325 Abayertnr_result_V23_t Abayertnr_ParamModeProcess_V23(Abayertnr_Context_V23_t *pAbayertnrCtx, Abayertnr_ExpInfo_V23_t *pExpInfo, Abayertnr_ParamMode_V23_t *mode) {
326     Abayertnr_result_V23_t res  = ABAYERTNRV23_RET_SUCCESS;
327     *mode = pAbayertnrCtx->eParamMode;
328 
329     if(pAbayertnrCtx == NULL) {
330         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
331         return ABAYERTNRV23_RET_INVALID_PARM;
332     }
333 
334     if(pAbayertnrCtx->isGrayMode) {
335         *mode = ABAYERTNRV23_PARAM_MODE_GRAY;
336     } else if(pExpInfo->hdr_mode == 0) {
337         *mode = ABAYERTNRV23_PARAM_MODE_NORMAL;
338     } else if(pExpInfo->hdr_mode >= 1) {
339         *mode = ABAYERTNRV23_PARAM_MODE_HDR;
340     } else {
341         *mode = ABAYERTNRV23_PARAM_MODE_NORMAL;
342     }
343 
344     return res;
345 }
346 
347 
348 RKAIQ_END_DECLARE
349 
350 
351