xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/arawnr2/rk_aiq_abayernr_algo_v2.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 
2 #include "rk_aiq_abayernr_algo_v2.h"
3 #include "rk_aiq_abayernr_algo_itf_v2.h"
4 #include "RkAiqCalibDbV2Helper.h"
5 
6 RKAIQ_BEGIN_DECLARE
7 
Abayernr_Start_V2(Abayernr_Context_V2_t * pAbayernrCtx)8 Abayernr_result_t Abayernr_Start_V2(Abayernr_Context_V2_t *pAbayernrCtx)
9 {
10     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
11 
12     // initial checks
13     if (pAbayernrCtx == NULL) {
14         return (ABAYERNR_RET_NULL_POINTER);
15     }
16 
17     if ((ABAYERNR_STATE_RUNNING == pAbayernrCtx->eState)
18             || (ABAYERNR_STATE_LOCKED == pAbayernrCtx->eState)) {
19         return (ABAYERNR_RET_FAILURE);
20     }
21 
22     pAbayernrCtx->eState = ABAYERNR_STATE_RUNNING;
23 
24     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
25     return (ABAYERNR_RET_SUCCESS);
26 }
27 
28 
Abayernr_Stop_V2(Abayernr_Context_V2_t * pAbayernrCtx)29 Abayernr_result_t Abayernr_Stop_V2(Abayernr_Context_V2_t *pAbayernrCtx)
30 {
31     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
32 
33     // initial checks
34     if (pAbayernrCtx == NULL) {
35         return (ABAYERNR_RET_NULL_POINTER);
36     }
37 
38     if (ABAYERNR_STATE_LOCKED == pAbayernrCtx->eState) {
39         return (ABAYERNR_RET_FAILURE);
40     }
41 
42     pAbayernrCtx->eState = ABAYERNR_STATE_STOPPED;
43 
44     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
45     return (ABAYERNR_RET_SUCCESS);
46 }
47 
48 
49 //anr inint
Abayernr_Init_V2(Abayernr_Context_V2_t ** ppAbayernrCtx,void * pCalibDb)50 Abayernr_result_t Abayernr_Init_V2(Abayernr_Context_V2_t **ppAbayernrCtx, void *pCalibDb)
51 {
52     Abayernr_Context_V2_t * pAbayernrCtx;
53 
54     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
55 
56     pAbayernrCtx = (Abayernr_Context_V2_t *)malloc(sizeof(Abayernr_Context_V2_t));
57     if(pAbayernrCtx == NULL) {
58         LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
59         return ABAYERNR_RET_NULL_POINTER;
60     }
61 
62     memset(pAbayernrCtx, 0x00, sizeof(Abayernr_Context_V2_t));
63 
64     //gain state init
65     pAbayernrCtx->fRawnr_SF_Strength = 1.0;
66     pAbayernrCtx->fRawnr_TF_Strength = 1.0;
67 
68     pAbayernrCtx->eState = ABAYERNR_STATE_INITIALIZED;
69     *ppAbayernrCtx = pAbayernrCtx;
70 
71     pAbayernrCtx->eMode = ABAYERNR_OP_MODE_AUTO;
72     pAbayernrCtx->isIQParaUpdate = false;
73     pAbayernrCtx->isGrayMode = false;
74     pAbayernrCtx->isReCalculate = 1;
75 
76 #if 1
77     //read v1 params from xml
78 #if (ABAYERNR_USE_JSON_FILE_V2)
79     CalibDbV2_BayerNrV2_t * pcalibdbV2_bayernr_v2 =
80         (CalibDbV2_BayerNrV2_t *)(CALIBDBV2_GET_MODULE_PTR((CamCalibDbV2Context_t*)pCalibDb, bayernr_v2));
81     pAbayernrCtx->bayernr_v2 = *pcalibdbV2_bayernr_v2;
82 #else
83     pAbayernrCtx->list_bayernr_v2 =
84         (struct list_head*)(CALIBDB_GET_MODULE_PTR((CamCalibDbContext_t *)pCalibDb, list_bayernr_v2));
85     printf("%s(%d): bayernr list:%p\n", __FUNCTION__, __LINE__, pAbayernrCtx->list_bayernr_v2);
86 #endif
87 #endif
88 
89 #if RK_SIMULATOR_HW
90     //just for v2 params from html
91 
92 #endif
93 
94 #if 1
95     pAbayernrCtx->stExpInfo.snr_mode = 1;
96     pAbayernrCtx->eParamMode = ABAYERNR_PARAM_MODE_NORMAL;
97     Abayernr_ConfigSettingParam_V2(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->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 ABAYERNR_RET_SUCCESS;
105 }
106 
107 //anr release
Abayernr_Release_V2(Abayernr_Context_V2_t * pAbayernrCtx)108 Abayernr_result_t Abayernr_Release_V2(Abayernr_Context_V2_t *pAbayernrCtx)
109 {
110     Abayernr_result_t result = ABAYERNR_RET_SUCCESS;
111     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
112     if(pAbayernrCtx == NULL) {
113         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
114         return ABAYERNR_RET_NULL_POINTER;
115     }
116 
117     result = Abayernr_Stop_V2(pAbayernrCtx);
118     if (result != ABAYERNR_RET_SUCCESS) {
119         LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
120         return (result);
121     }
122 
123     // check state
124     if ((ABAYERNR_STATE_RUNNING == pAbayernrCtx->eState)
125             || (ABAYERNR_STATE_LOCKED == pAbayernrCtx->eState)) {
126         return (ABAYERNR_RET_BUSY);
127     }
128 
129     memset(pAbayernrCtx, 0x00, sizeof(Abayernr_Context_V2_t));
130     free(pAbayernrCtx);
131 
132     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
133     return ABAYERNR_RET_SUCCESS;
134 }
135 
136 //anr config
Abayernr_Prepare_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_Config_V2_t * pAbayernrConfig)137 Abayernr_result_t Abayernr_Prepare_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_Config_V2_t* pAbayernrConfig)
138 {
139     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
140 
141     if(pAbayernrCtx == NULL || pAbayernrConfig == NULL) {
142         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
143         return ABAYERNR_RET_INVALID_PARM;
144     }
145 
146     if(!!(pAbayernrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
147         Abayernr_IQParaUpdate_V2(pAbayernrCtx);
148     }
149 
150     Abayernr_Start_V2(pAbayernrCtx);
151 
152     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
153     return ABAYERNR_RET_SUCCESS;
154 }
155 
156 //anr reconfig
Abayernr_ReConfig_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_Config_V2_t * pAbayernrConfig)157 Abayernr_result_t Abayernr_ReConfig_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_Config_V2_t* pAbayernrConfig)
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 ABAYERNR_RET_SUCCESS;
164 }
165 
166 //anr reconfig
Abayernr_IQParaUpdate_V2(Abayernr_Context_V2_t * pAbayernrCtx)167 Abayernr_result_t Abayernr_IQParaUpdate_V2(Abayernr_Context_V2_t *pAbayernrCtx)
168 {
169     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
170     //need todo what?
171 
172     if(pAbayernrCtx->isIQParaUpdate) {
173         LOGD_ANR("IQ data reconfig\n");
174         Abayernr_ConfigSettingParam_V2(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
175         pAbayernrCtx->isIQParaUpdate = false;
176     }
177 
178     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
179     return ABAYERNR_RET_SUCCESS;
180 }
181 
182 
183 //anr preprocess
Abayernr_PreProcess_V2(Abayernr_Context_V2_t * pAbayernrCtx)184 Abayernr_result_t Abayernr_PreProcess_V2(Abayernr_Context_V2_t *pAbayernrCtx)
185 {
186     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
187     //need todo what?
188 
189     Abayernr_IQParaUpdate_V2(pAbayernrCtx);
190 
191     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
192     return ABAYERNR_RET_SUCCESS;
193 }
194 
195 //anr process
Abayernr_Process_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_ExpInfo_t * pExpInfo)196 Abayernr_result_t Abayernr_Process_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_ExpInfo_t *pExpInfo)
197 {
198     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
199     Abayernr_ParamMode_t mode = ABAYERNR_PARAM_MODE_INVALID;
200 
201     if(pAbayernrCtx == NULL || pExpInfo == NULL) {
202         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
203         return ABAYERNR_RET_INVALID_PARM;
204     }
205 
206     if(pAbayernrCtx->eState != ABAYERNR_STATE_RUNNING) {
207         return ABAYERNR_RET_SUCCESS;
208     }
209 
210     Abayernr_ParamModeProcess_V2(pAbayernrCtx, pExpInfo, &mode);
211 
212     if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_AUTO) {
213 
214         LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
215 
216 #if ABAYERNR_USE_XML_FILE_V2
217         if(pExpInfo->snr_mode != pAbayernrCtx->stExpInfo.snr_mode || pAbayernrCtx->eParamMode != mode) {
218             LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
219             pAbayernrCtx->eParamMode = mode;
220             Abayernr_ConfigSettingParam_V2(pAbayernrCtx, pAbayernrCtx->eParamMode, pExpInfo->snr_mode);
221         }
222 #endif
223 
224         //select param
225         bayernr2D_select_params_by_ISO_V2(&pAbayernrCtx->stAuto.st2DParams, &pAbayernrCtx->stAuto.st2DSelect, pExpInfo);
226         bayernr3D_select_params_by_ISO_V2(&pAbayernrCtx->stAuto.st3DParams, &pAbayernrCtx->stAuto.st3DSelect, pExpInfo);
227 
228     } else if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_MANUAL) {
229         //TODO
230     }
231 
232     memcpy(&pAbayernrCtx->stExpInfo, pExpInfo, sizeof(Abayernr_ExpInfo_t));
233 
234     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
235     return ABAYERNR_RET_SUCCESS;
236 
237 }
238 
239 
240 
241 //anr get result
Abayernr_GetProcResult_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_ProcResult_V2_t * pAbayernrResult)242 Abayernr_result_t Abayernr_GetProcResult_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_ProcResult_V2_t* pAbayernrResult)
243 {
244     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
245 
246     if(pAbayernrCtx == NULL || pAbayernrResult == NULL) {
247         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
248         return ABAYERNR_RET_INVALID_PARM;
249     }
250 
251     RK_Bayernr_2D_Params_V2_Select_t* st2DSelect = NULL;
252     RK_Bayernr_3D_Params_V2_Select_t* st3DSelect = NULL;
253     if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_AUTO) {
254         st2DSelect = &pAbayernrCtx->stAuto.st2DSelect;
255         st3DSelect = &pAbayernrCtx->stAuto.st3DSelect;
256     } else if(pAbayernrCtx->eMode == ABAYERNR_OP_MODE_MANUAL) {
257         //TODO
258         st2DSelect = &pAbayernrCtx->stManual.st2DSelect;
259         st3DSelect = &pAbayernrCtx->stManual.st3DSelect;
260         pAbayernrCtx->fRawnr_SF_Strength = 1.0;
261         pAbayernrCtx->fRawnr_TF_Strength = 1.0;
262     }
263 
264     //transfer to reg value
265     bayernr2D_fix_transfer_V2(st2DSelect, pAbayernrResult->st2DFix, pAbayernrCtx->fRawnr_SF_Strength, &pAbayernrCtx->stExpInfo);
266     bayernr3D_fix_transfer_V2(st3DSelect, pAbayernrResult->st3DFix, pAbayernrCtx->fRawnr_TF_Strength, &pAbayernrCtx->stExpInfo);
267 
268     LOGD_ANR("%s:%d xml:local:%d mode:%d  reg: local gain:%d  mfnr gain:%d mode:%d\n",
269              __FUNCTION__, __LINE__);
270 
271     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
272     return ABAYERNR_RET_SUCCESS;
273 }
274 
Abayernr_ConfigSettingParam_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_ParamMode_t eParamMode,int snr_mode)275 Abayernr_result_t Abayernr_ConfigSettingParam_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_ParamMode_t eParamMode, int snr_mode)
276 {
277     char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
278     char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
279     memset(param_mode_name, 0x00, sizeof(param_mode_name));
280     memset(snr_name, 0x00, sizeof(snr_name));
281 
282     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
283     if(pAbayernrCtx == NULL) {
284         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
285         return ABAYERNR_RET_INVALID_PARM;
286     }
287 
288     //select param mode first
289     if(eParamMode == ABAYERNR_PARAM_MODE_NORMAL) {
290         sprintf(param_mode_name, "%s", "normal");
291     } else if(eParamMode == ABAYERNR_PARAM_MODE_HDR) {
292         sprintf(param_mode_name, "%s", "hdr");
293     } else if(eParamMode == ABAYERNR_PARAM_MODE_GRAY) {
294         sprintf(param_mode_name, "%s", "gray");
295     } else {
296         LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
297         sprintf(param_mode_name, "%s", "normal");
298     }
299 
300     //then select snr mode next
301     if(snr_mode == 1) {
302         sprintf(snr_name, "%s", "HSNR");
303     } else if(snr_mode == 0) {
304         sprintf(snr_name, "%s", "LSNR");
305     } else {
306         LOGE_ANR("%s(%d): not support snr mode:%d!\n", __FUNCTION__, __LINE__, snr_mode);
307         sprintf(snr_name, "%s", "LSNR");
308     }
309 
310 #if (ABAYERNR_USE_JSON_FILE_V2)
311     bayernr2D_config_setting_param_json_V2(&pAbayernrCtx->stAuto.st2DParams, &pAbayernrCtx->bayernr_v2, param_mode_name, snr_name);
312     bayernr3D_config_setting_param_json_V2(&pAbayernrCtx->stAuto.st3DParams, &pAbayernrCtx->bayernr_v2, param_mode_name, snr_name);
313 #else
314     bayernr2D_config_setting_param_V2(&pAbayernrCtx->stAuto.st2DParams, pAbayernrCtx->list_bayernr_v2, param_mode_name, snr_name);
315     bayernr3D_config_setting_param_V2(&pAbayernrCtx->stAuto.st3DParams, pAbayernrCtx->list_bayernr_v2, param_mode_name, snr_name);
316 #endif
317     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
318     return ABAYERNR_RET_SUCCESS;
319 }
320 
Abayernr_ParamModeProcess_V2(Abayernr_Context_V2_t * pAbayernrCtx,Abayernr_ExpInfo_t * pExpInfo,Abayernr_ParamMode_t * mode)321 Abayernr_result_t Abayernr_ParamModeProcess_V2(Abayernr_Context_V2_t *pAbayernrCtx, Abayernr_ExpInfo_t *pExpInfo, Abayernr_ParamMode_t *mode) {
322     Abayernr_result_t res  = ABAYERNR_RET_SUCCESS;
323     *mode = pAbayernrCtx->eParamMode;
324 
325     if(pAbayernrCtx == NULL) {
326         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
327         return ABAYERNR_RET_INVALID_PARM;
328     }
329 
330     if(pAbayernrCtx->isGrayMode) {
331         *mode = ABAYERNR_PARAM_MODE_GRAY;
332     } else if(pExpInfo->hdr_mode == 0) {
333         *mode = ABAYERNR_PARAM_MODE_NORMAL;
334     } else if(pExpInfo->hdr_mode >= 1) {
335         *mode = ABAYERNR_PARAM_MODE_HDR;
336     } else {
337         *mode = ABAYERNR_PARAM_MODE_NORMAL;
338     }
339 
340     return res;
341 }
342 
343 
344 RKAIQ_END_DECLARE
345 
346 
347