xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/aynr2/rk_aiq_aynr_algo_v2.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 
2 #include "rk_aiq_aynr_algo_v2.h"
3 #include "rk_aiq_aynr_algo_itf_v2.h"
4 #include "RkAiqCalibDbV2Helper.h"
5 
6 RKAIQ_BEGIN_DECLARE
7 
Aynr_Start_V2(Aynr_Context_V2_t * pAynrCtx)8 Aynr_result_t Aynr_Start_V2(Aynr_Context_V2_t *pAynrCtx)
9 {
10     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
11 
12     // initial checks
13     if (pAynrCtx == NULL) {
14         return (AYNR_RET_NULL_POINTER);
15     }
16 
17     if ((AYNR_STATE_RUNNING == pAynrCtx->eState)
18             || (AYNR_STATE_LOCKED == pAynrCtx->eState)) {
19         return (AYNR_RET_FAILURE);
20     }
21 
22     pAynrCtx->eState = AYNR_STATE_RUNNING;
23 
24     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
25     return (AYNR_RET_SUCCESS);
26 }
27 
28 
Aynr_Stop_V2(Aynr_Context_V2_t * pAynrCtx)29 Aynr_result_t Aynr_Stop_V2(Aynr_Context_V2_t *pAynrCtx)
30 {
31     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
32 
33     // initial checks
34     if (pAynrCtx == NULL) {
35         return (AYNR_RET_NULL_POINTER);
36     }
37 
38     if (AYNR_STATE_LOCKED == pAynrCtx->eState) {
39         return (AYNR_RET_FAILURE);
40     }
41 
42     pAynrCtx->eState = AYNR_STATE_STOPPED;
43 
44     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
45     return (AYNR_RET_SUCCESS);
46 }
47 
48 
49 //anr inint
Aynr_Init_V2(Aynr_Context_V2_t ** ppAynrCtx,void * pCalibDb)50 Aynr_result_t Aynr_Init_V2(Aynr_Context_V2_t **ppAynrCtx, void *pCalibDb)
51 {
52     Aynr_Context_V2_t * pAynrCtx;
53 
54     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
55 
56     pAynrCtx = (Aynr_Context_V2_t *)malloc(sizeof(Aynr_Context_V2_t));
57     if(pAynrCtx == NULL) {
58         LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
59         return AYNR_RET_NULL_POINTER;
60     }
61 
62     memset(pAynrCtx, 0x00, sizeof(Aynr_Context_V2_t));
63 
64     //gain state init
65     pAynrCtx->fYnr_SF_Strength = 1.0;
66 
67     pAynrCtx->eState = AYNR_STATE_INITIALIZED;
68     *ppAynrCtx = pAynrCtx;
69 
70     pAynrCtx->eMode = AYNR_OP_MODE_AUTO;
71     pAynrCtx->isIQParaUpdate = false;
72     pAynrCtx->isGrayMode = false;
73     pAynrCtx->isReCalculate = 1;
74 
75 #if AYNR_USE_XML_FILE_V2
76     //read v1 params from xml
77 #if AYNR_USE_JSON_FILE_V2
78     pAynrCtx->ynr_v2 =
79         *(CalibDbV2_YnrV2_t *)(CALIBDBV2_GET_MODULE_PTR(pCalibDb, ynr_v2));
80 #else
81     pAynrCtx->list_ynr_v2 =
82         (struct list_head*)(CALIBDB_GET_MODULE_PTR(pCalibDb, list_ynr_v2));
83     printf("%s(%d): bayernr list: %p\n", __FUNCTION__, __LINE__,
84            pAynrCtx->list_ynr_v2);
85 #endif
86 #endif
87 
88 
89 #if AYNR_USE_XML_FILE_V2
90     pAynrCtx->stExpInfo.snr_mode = 1;
91     pAynrCtx->eParamMode = AYNR_PARAM_MODE_NORMAL;
92     Aynr_ConfigSettingParam_V2(pAynrCtx, pAynrCtx->eParamMode, pAynrCtx->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 AYNR_RET_SUCCESS;
100 }
101 
102 //anr release
Aynr_Release_V2(Aynr_Context_V2_t * pAynrCtx)103 Aynr_result_t Aynr_Release_V2(Aynr_Context_V2_t *pAynrCtx)
104 {
105     Aynr_result_t result = AYNR_RET_SUCCESS;
106     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
107     if(pAynrCtx == NULL) {
108         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
109         return AYNR_RET_NULL_POINTER;
110     }
111 
112     result = Aynr_Stop_V2(pAynrCtx);
113     if (result != AYNR_RET_SUCCESS) {
114         LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
115         return (result);
116     }
117 
118     // check state
119     if ((AYNR_STATE_RUNNING == pAynrCtx->eState)
120             || (AYNR_STATE_LOCKED == pAynrCtx->eState)) {
121         return (AYNR_RET_BUSY);
122     }
123 
124     memset(pAynrCtx, 0x00, sizeof(Aynr_Context_V2_t));
125     free(pAynrCtx);
126 
127     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
128     return AYNR_RET_SUCCESS;
129 }
130 
131 //anr config
Aynr_Prepare_V2(Aynr_Context_V2_t * pAynrCtx,Aynr_Config_V2_t * pAynrConfig)132 Aynr_result_t Aynr_Prepare_V2(Aynr_Context_V2_t *pAynrCtx, Aynr_Config_V2_t* pAynrConfig)
133 {
134     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
135 
136     if(pAynrCtx == NULL) {
137         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
138         return AYNR_RET_INVALID_PARM;
139     }
140 
141     if(pAynrConfig == NULL) {
142         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
143         return AYNR_RET_INVALID_PARM;
144     }
145 
146     if(!!(pAynrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
147         Aynr_IQParaUpdate_V2(pAynrCtx);
148     }
149 
150     pAynrCtx->rawWidth = pAynrConfig->rawWidth;
151     pAynrCtx->rawHeight = pAynrConfig->rawHeight;
152     Aynr_Start_V2(pAynrCtx);
153 
154     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
155     return AYNR_RET_SUCCESS;
156 }
157 
158 //anr reconfig
Aynr_ReConfig_V2(Aynr_Context_V2_t * pAynrCtx,Aynr_Config_V2_t * pAynrConfig)159 Aynr_result_t Aynr_ReConfig_V2(Aynr_Context_V2_t *pAynrCtx, Aynr_Config_V2_t* pAynrConfig)
160 {
161     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
162     //need todo what?
163 
164     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
165     return AYNR_RET_SUCCESS;
166 }
167 
168 //anr reconfig
Aynr_IQParaUpdate_V2(Aynr_Context_V2_t * pAynrCtx)169 Aynr_result_t Aynr_IQParaUpdate_V2(Aynr_Context_V2_t *pAynrCtx)
170 {
171     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
172     //need todo what?
173 
174     if(pAynrCtx->isIQParaUpdate) {
175         LOGD_ANR("IQ data reconfig\n");
176         Aynr_ConfigSettingParam_V2(pAynrCtx, pAynrCtx->eParamMode, pAynrCtx->stExpInfo.snr_mode);
177         pAynrCtx->isIQParaUpdate = false;
178     }
179 
180     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
181     return AYNR_RET_SUCCESS;
182 }
183 
184 
185 //anr preprocess
Aynr_PreProcess_V2(Aynr_Context_V2_t * pAynrCtx)186 Aynr_result_t Aynr_PreProcess_V2(Aynr_Context_V2_t *pAynrCtx)
187 {
188     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
189     //need todo what?
190 
191     Aynr_IQParaUpdate_V2(pAynrCtx);
192 
193     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
194     return AYNR_RET_SUCCESS;
195 }
196 
197 //anr process
Aynr_Process_V2(Aynr_Context_V2_t * pAynrCtx,Aynr_ExpInfo_t * pExpInfo)198 Aynr_result_t Aynr_Process_V2(Aynr_Context_V2_t *pAynrCtx, Aynr_ExpInfo_t *pExpInfo)
199 {
200     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
201     Aynr_ParamMode_t mode = AYNR_PARAM_MODE_INVALID;
202 
203     if(pAynrCtx == NULL) {
204         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
205         return AYNR_RET_INVALID_PARM;
206     }
207 
208     if(pExpInfo == NULL) {
209         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
210         return AYNR_RET_INVALID_PARM;
211     }
212 
213     if(pAynrCtx->eState != AYNR_STATE_RUNNING) {
214         return AYNR_RET_SUCCESS;
215     }
216 
217 
218     Aynr_ParamModeProcess_V2(pAynrCtx, pExpInfo, &mode);
219 
220     if(pAynrCtx->eMode == AYNR_OP_MODE_AUTO) {
221 
222         LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
223 
224 #if AYNR_USE_XML_FILE_V2
225         if(pExpInfo->snr_mode != pAynrCtx->stExpInfo.snr_mode || pAynrCtx->eParamMode != mode) {
226             LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
227             pAynrCtx->eParamMode = mode;
228             Aynr_ConfigSettingParam_V2(pAynrCtx, pAynrCtx->eParamMode, pExpInfo->snr_mode);
229         }
230 #endif
231 
232         //select param
233         ynr_select_params_by_ISO_V2(&pAynrCtx->stAuto.stParams, &pAynrCtx->stAuto.stSelect, pExpInfo);
234 
235     } else if(pAynrCtx->eMode == AYNR_OP_MODE_MANUAL) {
236         //TODO
237     }
238 
239     memcpy(&pAynrCtx->stExpInfo, pExpInfo, sizeof(Aynr_ExpInfo_t));
240     pAynrCtx->stExpInfo.rawHeight = pAynrCtx->rawHeight;
241     pAynrCtx->stExpInfo.rawWidth = pAynrCtx->rawWidth;
242 
243     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
244     return AYNR_RET_SUCCESS;
245 
246 }
247 
248 
249 
250 //anr get result
Aynr_GetProcResult_V2(Aynr_Context_V2_t * pAynrCtx,Aynr_ProcResult_V2_t * pAynrResult)251 Aynr_result_t Aynr_GetProcResult_V2(Aynr_Context_V2_t *pAynrCtx, Aynr_ProcResult_V2_t* pAynrResult)
252 {
253     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
254 
255     if(pAynrCtx == NULL) {
256         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
257         return AYNR_RET_INVALID_PARM;
258     }
259 
260     if(pAynrResult == NULL) {
261         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
262         return AYNR_RET_INVALID_PARM;
263     }
264 
265     RK_YNR_Params_V2_Select_t* stSelect = NULL;
266     if(pAynrCtx->eMode == AYNR_OP_MODE_AUTO) {
267         stSelect = &pAynrCtx->stAuto.stSelect;
268     } else if(pAynrCtx->eMode == AYNR_OP_MODE_MANUAL) {
269         //TODO
270         stSelect = &pAynrCtx->stManual.stSelect;
271         pAynrCtx->fYnr_SF_Strength = 1.0;
272     }
273 
274     //transfer to reg value
275     ynr_fix_transfer_V2(stSelect, pAynrResult->stFix, pAynrCtx->fYnr_SF_Strength, &pAynrCtx->stExpInfo);
276 
277 
278     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
279     return AYNR_RET_SUCCESS;
280 }
281 
Aynr_ConfigSettingParam_V2(Aynr_Context_V2_t * pAynrCtx,Aynr_ParamMode_t eParamMode,int snr_mode)282 Aynr_result_t Aynr_ConfigSettingParam_V2(Aynr_Context_V2_t *pAynrCtx, Aynr_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(pAynrCtx == NULL) {
290         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
291         return AYNR_RET_INVALID_PARM;
292     }
293 
294     //select param mode first
295     if(eParamMode == AYNR_PARAM_MODE_NORMAL) {
296         sprintf(param_mode_name, "%s", "normal");
297     } else if(eParamMode == AYNR_PARAM_MODE_HDR) {
298         sprintf(param_mode_name, "%s", "hdr");
299     } else if(eParamMode == AYNR_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 AYNR_USE_JSON_FILE_V2
318     ynr_config_setting_param_json_V2(&pAynrCtx->stAuto.stParams, &pAynrCtx->ynr_v2, param_mode_name, snr_name);
319 #else
320     ynr_config_setting_param_V2(&pAynrCtx->stAuto.stParams, pAynrCtx->list_ynr_v2, param_mode_name, snr_name);
321 #endif
322 
323     return AYNR_RET_SUCCESS;
324 }
325 
Aynr_ParamModeProcess_V2(Aynr_Context_V2_t * pAynrCtx,Aynr_ExpInfo_t * pExpInfo,Aynr_ParamMode_t * mode)326 Aynr_result_t Aynr_ParamModeProcess_V2(Aynr_Context_V2_t *pAynrCtx, Aynr_ExpInfo_t *pExpInfo, Aynr_ParamMode_t *mode) {
327     Aynr_result_t res  = AYNR_RET_SUCCESS;
328     *mode = pAynrCtx->eParamMode;
329 
330     if(pAynrCtx == NULL) {
331         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
332         return AYNR_RET_INVALID_PARM;
333     }
334 
335     if(pAynrCtx->isGrayMode) {
336         *mode = AYNR_PARAM_MODE_GRAY;
337     } else if(pExpInfo->hdr_mode == 0) {
338         *mode = AYNR_PARAM_MODE_NORMAL;
339     } else if(pExpInfo->hdr_mode >= 1) {
340         *mode = AYNR_PARAM_MODE_HDR;
341     } else {
342         *mode = AYNR_PARAM_MODE_NORMAL;
343     }
344 
345     return res;
346 }
347 
348 
349 RKAIQ_END_DECLARE
350 
351 
352