xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/aynr3/rk_aiq_aynr_algo_v3.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 
2 #include "rk_aiq_aynr_algo_v3.h"
3 #include "rk_aiq_aynr_algo_itf_v3.h"
4 
5 RKAIQ_BEGIN_DECLARE
6 
Aynr_Start_V3(Aynr_Context_V3_t * pAynrCtx)7 Aynr_result_V3_t Aynr_Start_V3(Aynr_Context_V3_t *pAynrCtx)
8 {
9     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
10 
11     // initial checks
12     if (pAynrCtx == NULL) {
13         return (AYNRV3_RET_NULL_POINTER);
14     }
15 
16     if ((AYNRV3_STATE_RUNNING == pAynrCtx->eState)
17             || (AYNRV3_STATE_LOCKED == pAynrCtx->eState)) {
18         return (AYNRV3_RET_FAILURE);
19     }
20 
21     pAynrCtx->eState = AYNRV3_STATE_RUNNING;
22 
23     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
24     return (AYNRV3_RET_SUCCESS);
25 }
26 
27 
Aynr_Stop_V3(Aynr_Context_V3_t * pAynrCtx)28 Aynr_result_V3_t Aynr_Stop_V3(Aynr_Context_V3_t *pAynrCtx)
29 {
30     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
31 
32     // initial checks
33     if (pAynrCtx == NULL) {
34         return (AYNRV3_RET_NULL_POINTER);
35     }
36 
37     if (AYNRV3_STATE_LOCKED == pAynrCtx->eState) {
38         return (AYNRV3_RET_FAILURE);
39     }
40 
41     pAynrCtx->eState = AYNRV3_STATE_STOPPED;
42 
43     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
44     return (AYNRV3_RET_SUCCESS);
45 }
46 
47 
48 //anr inint
Aynr_Init_V3(Aynr_Context_V3_t ** ppAynrCtx,void * pCalibDb)49 Aynr_result_V3_t Aynr_Init_V3(Aynr_Context_V3_t **ppAynrCtx, void *pCalibDb)
50 {
51     Aynr_Context_V3_t * pAynrCtx;
52 
53     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
54 
55     pAynrCtx = (Aynr_Context_V3_t *)malloc(sizeof(Aynr_Context_V3_t));
56     if(pAynrCtx == NULL) {
57         LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
58         return AYNRV3_RET_NULL_POINTER;
59     }
60 
61     memset(pAynrCtx, 0x00, sizeof(Aynr_Context_V3_t));
62 
63     //gain state init
64     pAynrCtx->stStrength.strength_enable = false;
65     pAynrCtx->stStrength.percent = 1.0;
66 
67     pAynrCtx->eState = AYNRV3_STATE_INITIALIZED;
68     *ppAynrCtx = pAynrCtx;
69 
70     pAynrCtx->eMode = AYNRV3_OP_MODE_AUTO;
71     pAynrCtx->isIQParaUpdate = false;
72     pAynrCtx->isGrayMode = false;
73     pAynrCtx->isReCalculate = 1;
74 
75 #if AYNR_USE_XML_FILE_V3
76     //read v1 params from xml
77 #if AYNR_USE_JSON_FILE_V3
78     pAynrCtx->ynr_v3 =
79         *(CalibDbV2_YnrV3_t *)(CALIBDBV2_GET_MODULE_PTR(pCalibDb, ynr_v3));
80 #endif
81 #endif
82 
83 
84 #if AYNR_USE_XML_FILE_V3
85     pAynrCtx->stExpInfo.snr_mode = 1;
86     pAynrCtx->eParamMode = AYNRV3_PARAM_MODE_NORMAL;
87     Aynr_ConfigSettingParam_V3(pAynrCtx, pAynrCtx->eParamMode, pAynrCtx->stExpInfo.snr_mode);
88 #endif
89 
90     LOGD_ANR("%s(%d):", __FUNCTION__, __LINE__);
91 
92 
93     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
94     return AYNRV3_RET_SUCCESS;
95 }
96 
97 //anr release
Aynr_Release_V3(Aynr_Context_V3_t * pAynrCtx)98 Aynr_result_V3_t Aynr_Release_V3(Aynr_Context_V3_t *pAynrCtx)
99 {
100     Aynr_result_V3_t result = AYNRV3_RET_SUCCESS;
101     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
102     if(pAynrCtx == NULL) {
103         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
104         return AYNRV3_RET_NULL_POINTER;
105     }
106 
107     result = Aynr_Stop_V3(pAynrCtx);
108     if (result != AYNRV3_RET_SUCCESS) {
109         LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
110         return (result);
111     }
112 
113     // check state
114     if ((AYNRV3_STATE_RUNNING == pAynrCtx->eState)
115             || (AYNRV3_STATE_LOCKED == pAynrCtx->eState)) {
116         return (AYNRV3_RET_BUSY);
117     }
118 
119     memset(pAynrCtx, 0x00, sizeof(Aynr_Context_V3_t));
120     free(pAynrCtx);
121 
122     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
123     return AYNRV3_RET_SUCCESS;
124 }
125 
126 //anr config
Aynr_Prepare_V3(Aynr_Context_V3_t * pAynrCtx,Aynr_Config_V3_t * pAynrConfig)127 Aynr_result_V3_t Aynr_Prepare_V3(Aynr_Context_V3_t *pAynrCtx, Aynr_Config_V3_t* pAynrConfig)
128 {
129     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
130 
131     if(pAynrCtx == NULL) {
132         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
133         return AYNRV3_RET_INVALID_PARM;
134     }
135 
136     if(pAynrConfig == NULL) {
137         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
138         return AYNRV3_RET_INVALID_PARM;
139     }
140 
141     if(!!(pAynrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
142         Aynr_IQParaUpdate_V3(pAynrCtx);
143     }
144 
145     pAynrCtx->rawWidth = pAynrConfig->rawWidth;
146     pAynrCtx->rawHeight = pAynrConfig->rawHeight;
147     Aynr_Start_V3(pAynrCtx);
148 
149     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
150     return AYNRV3_RET_SUCCESS;
151 }
152 
153 //anr reconfig
Aynr_ReConfig_V3(Aynr_Context_V3_t * pAynrCtx,Aynr_Config_V3_t * pAynrConfig)154 Aynr_result_V3_t Aynr_ReConfig_V3(Aynr_Context_V3_t *pAynrCtx, Aynr_Config_V3_t* pAynrConfig)
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 AYNRV3_RET_SUCCESS;
161 }
162 
163 //anr reconfig
Aynr_IQParaUpdate_V3(Aynr_Context_V3_t * pAynrCtx)164 Aynr_result_V3_t Aynr_IQParaUpdate_V3(Aynr_Context_V3_t *pAynrCtx)
165 {
166     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
167     //need todo what?
168 
169     if(pAynrCtx->isIQParaUpdate) {
170         LOGD_ANR("IQ data reconfig\n");
171         Aynr_ConfigSettingParam_V3(pAynrCtx, pAynrCtx->eParamMode, pAynrCtx->stExpInfo.snr_mode);
172         pAynrCtx->isIQParaUpdate = false;
173     }
174 
175     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
176     return AYNRV3_RET_SUCCESS;
177 }
178 
179 
180 //anr preprocess
Aynr_PreProcess_V3(Aynr_Context_V3_t * pAynrCtx)181 Aynr_result_V3_t Aynr_PreProcess_V3(Aynr_Context_V3_t *pAynrCtx)
182 {
183     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
184     //need todo what?
185 
186     Aynr_IQParaUpdate_V3(pAynrCtx);
187 
188     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
189     return AYNRV3_RET_SUCCESS;
190 }
191 
192 //anr process
Aynr_Process_V3(Aynr_Context_V3_t * pAynrCtx,Aynr_ExpInfo_V3_t * pExpInfo)193 Aynr_result_V3_t Aynr_Process_V3(Aynr_Context_V3_t *pAynrCtx, Aynr_ExpInfo_V3_t *pExpInfo)
194 {
195     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
196     Aynr_ParamMode_V3_t mode = AYNRV3_PARAM_MODE_INVALID;
197 
198     if(pAynrCtx == NULL) {
199         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
200         return AYNRV3_RET_INVALID_PARM;
201     }
202 
203     if(pExpInfo == NULL) {
204         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
205         return AYNRV3_RET_INVALID_PARM;
206     }
207 
208     if(pAynrCtx->eState != AYNRV3_STATE_RUNNING) {
209         return AYNRV3_RET_SUCCESS;
210     }
211 
212 
213     Aynr_ParamModeProcess_V3(pAynrCtx, pExpInfo, &mode);
214 
215     if(pAynrCtx->eMode == AYNRV3_OP_MODE_AUTO) {
216 
217         LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
218 
219 #if AYNR_USE_XML_FILE_V3
220         if(pExpInfo->snr_mode != pAynrCtx->stExpInfo.snr_mode || pAynrCtx->eParamMode != mode) {
221             LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
222             pAynrCtx->eParamMode = mode;
223             Aynr_ConfigSettingParam_V3(pAynrCtx, pAynrCtx->eParamMode, pExpInfo->snr_mode);
224         }
225 #endif
226 
227         //select param
228         ynr_select_params_by_ISO_V3(&pAynrCtx->stAuto.stParams, &pAynrCtx->stAuto.stSelect, pExpInfo);
229 
230     } else if(pAynrCtx->eMode == AYNRV3_OP_MODE_MANUAL) {
231         //TODO
232     }
233 
234     memcpy(&pAynrCtx->stExpInfo, pExpInfo, sizeof(Aynr_ExpInfo_V3_t));
235     pAynrCtx->stExpInfo.rawHeight = pAynrCtx->rawHeight;
236     pAynrCtx->stExpInfo.rawWidth = pAynrCtx->rawWidth;
237 
238     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
239     return AYNRV3_RET_SUCCESS;
240 
241 }
242 
243 
244 
245 //anr get result
Aynr_GetProcResult_V3(Aynr_Context_V3_t * pAynrCtx,Aynr_ProcResult_V3_t * pAynrResult)246 Aynr_result_V3_t Aynr_GetProcResult_V3(Aynr_Context_V3_t *pAynrCtx, Aynr_ProcResult_V3_t* pAynrResult)
247 {
248     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
249 
250     if(pAynrCtx == NULL) {
251         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
252         return AYNRV3_RET_INVALID_PARM;
253     }
254 
255     if(pAynrResult == NULL) {
256         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
257         return AYNRV3_RET_INVALID_PARM;
258     }
259 
260     if(pAynrCtx->eMode == AYNRV3_OP_MODE_AUTO) {
261         pAynrResult->stSelect = &pAynrCtx->stAuto.stSelect;
262     } else if(pAynrCtx->eMode == AYNRV3_OP_MODE_MANUAL) {
263         //TODO
264         pAynrResult->stSelect = &pAynrCtx->stManual.stSelect;
265     }
266 
267     //transfer to reg value
268     ynr_fix_transfer_V3(pAynrResult->stSelect, pAynrResult->stFix, &pAynrCtx->stStrength, &pAynrCtx->stExpInfo);
269 
270     if(pAynrCtx->eMode == AYNRV3_OP_MODE_REG_MANUAL) {
271         *pAynrResult->stFix = pAynrCtx->stManual.stFix;
272         pAynrCtx->stStrength.strength_enable = false;
273         pAynrCtx->stStrength.percent = 1.0;
274     }
275 
276     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
277     return AYNRV3_RET_SUCCESS;
278 }
279 
Aynr_ConfigSettingParam_V3(Aynr_Context_V3_t * pAynrCtx,Aynr_ParamMode_V3_t eParamMode,int snr_mode)280 Aynr_result_V3_t Aynr_ConfigSettingParam_V3(Aynr_Context_V3_t *pAynrCtx, Aynr_ParamMode_V3_t eParamMode, int snr_mode)
281 {
282     char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
283     char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
284     memset(param_mode_name, 0x00, sizeof(param_mode_name));
285     memset(snr_name, 0x00, sizeof(snr_name));
286 
287     if(pAynrCtx == NULL) {
288         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
289         return AYNRV3_RET_INVALID_PARM;
290     }
291 
292     //select param mode first
293     if(eParamMode == AYNRV3_PARAM_MODE_NORMAL) {
294         sprintf(param_mode_name, "%s", "normal");
295     } else if(eParamMode == AYNRV3_PARAM_MODE_HDR) {
296         sprintf(param_mode_name, "%s", "hdr");
297     } else if(eParamMode == AYNRV3_PARAM_MODE_GRAY) {
298         sprintf(param_mode_name, "%s", "gray");
299     } else {
300         LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
301         sprintf(param_mode_name, "%s", "normal");
302     }
303 
304 
305     //then select snr mode next
306     if(snr_mode == 1) {
307         sprintf(snr_name, "%s", "HSNR");
308     } else if(snr_mode == 0) {
309         sprintf(snr_name, "%s", "LSNR");
310     } else {
311         LOGE_ANR("%s(%d): not support snr mode:%d!\n", __FUNCTION__, __LINE__, snr_mode);
312         sprintf(snr_name, "%s", "LSNR");
313     }
314 
315 #if AYNR_USE_JSON_FILE_V3
316     ynr_config_setting_param_json_V3(&pAynrCtx->stAuto.stParams, &pAynrCtx->ynr_v3, param_mode_name, snr_name);
317 #endif
318 
319     return AYNRV3_RET_SUCCESS;
320 }
321 
Aynr_ParamModeProcess_V3(Aynr_Context_V3_t * pAynrCtx,Aynr_ExpInfo_V3_t * pExpInfo,Aynr_ParamMode_V3_t * mode)322 Aynr_result_V3_t Aynr_ParamModeProcess_V3(Aynr_Context_V3_t *pAynrCtx, Aynr_ExpInfo_V3_t *pExpInfo, Aynr_ParamMode_V3_t *mode) {
323     Aynr_result_V3_t res  = AYNRV3_RET_SUCCESS;
324     *mode = pAynrCtx->eParamMode;
325 
326     if(pAynrCtx == NULL) {
327         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
328         return AYNRV3_RET_INVALID_PARM;
329     }
330 
331     if(pAynrCtx->isGrayMode) {
332         *mode = AYNRV3_PARAM_MODE_GRAY;
333     } else if(pExpInfo->hdr_mode == 0) {
334         *mode = AYNRV3_PARAM_MODE_NORMAL;
335     } else if(pExpInfo->hdr_mode >= 1) {
336         *mode = AYNRV3_PARAM_MODE_HDR;
337     } else {
338         *mode = AYNRV3_PARAM_MODE_NORMAL;
339     }
340 
341     return res;
342 }
343 
344 
345 RKAIQ_END_DECLARE
346 
347 
348