xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/acnr/rk_aiq_acnr_algo_v1.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 
2 #include "rk_aiq_acnr_algo_v1.h"
3 #include "rk_aiq_acnr_algo_itf_v1.h"
4 #include "RkAiqCalibDbV2Helper.h"
5 
6 RKAIQ_BEGIN_DECLARE
7 
Acnr_Start_V1(Acnr_Context_V1_t * pAcnrCtx)8 Acnr_result_t Acnr_Start_V1(Acnr_Context_V1_t *pAcnrCtx)
9 {
10     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
11 
12     // initial checks
13     if (pAcnrCtx == NULL) {
14         return (ACNR_RET_NULL_POINTER);
15     }
16 
17     if ((ACNR_STATE_RUNNING == pAcnrCtx->eState)
18             || (ACNR_STATE_LOCKED == pAcnrCtx->eState)) {
19         return (ACNR_RET_FAILURE);
20     }
21 
22     pAcnrCtx->eState = ACNR_STATE_RUNNING;
23 
24     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
25     return (ACNR_RET_SUCCESS);
26 }
27 
28 
Acnr_Stop_V1(Acnr_Context_V1_t * pAcnrCtx)29 Acnr_result_t Acnr_Stop_V1(Acnr_Context_V1_t *pAcnrCtx)
30 {
31     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
32 
33     // initial checks
34     if (pAcnrCtx == NULL) {
35         return (ACNR_RET_NULL_POINTER);
36     }
37 
38     if (ACNR_STATE_LOCKED == pAcnrCtx->eState) {
39         return (ACNR_RET_FAILURE);
40     }
41 
42     pAcnrCtx->eState = ACNR_STATE_STOPPED;
43 
44     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
45     return (ACNR_RET_SUCCESS);
46 }
47 
48 
49 //anr inint
Acnr_Init_V1(Acnr_Context_V1_t ** ppAcnrCtx,void * pCalibDb)50 Acnr_result_t Acnr_Init_V1(Acnr_Context_V1_t **ppAcnrCtx, void *pCalibDb)
51 {
52     Acnr_Context_V1_t * pAcnrCtx;
53 
54     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
55 
56     pAcnrCtx = (Acnr_Context_V1_t *)malloc(sizeof(Acnr_Context_V1_t));
57     if(pAcnrCtx == NULL) {
58         LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
59         return ACNR_RET_NULL_POINTER;
60     }
61 
62     memset(pAcnrCtx, 0x00, sizeof(Acnr_Context_V1_t));
63 
64     //gain state init
65     pAcnrCtx->fCnr_SF_Strength = 1.0;
66 
67     pAcnrCtx->eState = ACNR_STATE_INITIALIZED;
68     *ppAcnrCtx = pAcnrCtx;
69 
70     pAcnrCtx->eMode = ACNR_OP_MODE_AUTO;
71     pAcnrCtx->isIQParaUpdate = false;
72     pAcnrCtx->isGrayMode = false;
73     pAcnrCtx->isReCalculate = 1;
74 
75 #if ACNR_USE_XML_FILE_V1
76     //read v1 params from xml
77 #if ACNR_USE_JSON_FILE_V1
78     pAcnrCtx->cnr_v1 =
79         *(CalibDbV2_CNR_t *)(CALIBDBV2_GET_MODULE_PTR(pCalibDb, cnr_v1));
80 #else
81     pAcnrCtx->list_cnr_v1 =
82         (struct list_head*)(CALIBDB_GET_MODULE_PTR(pCalibDb, list_cnr_v1));
83     printf("%s(%d): cnrV1 list:%p\n", __FUNCTION__, __LINE__, pAcnrCtx->list_cnr_v1);
84 #endif
85 #endif
86 
87 #if RK_SIMULATOR_HW
88     //just for v2 params from html
89 
90 #endif
91 
92 #if ACNR_USE_XML_FILE_V1
93     pAcnrCtx->stExpInfo.snr_mode = 1;
94     pAcnrCtx->eParamMode = ACNR_PARAM_MODE_NORMAL;
95     Acnr_ConfigSettingParam_V1(pAcnrCtx, pAcnrCtx->eParamMode, pAcnrCtx->stExpInfo.snr_mode);
96 #endif
97 
98     LOGD_ANR("%s(%d):", __FUNCTION__, __LINE__);
99 
100 
101     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
102     return ACNR_RET_SUCCESS;
103 }
104 
105 //anr release
Acnr_Release_V1(Acnr_Context_V1_t * pAcnrCtx)106 Acnr_result_t Acnr_Release_V1(Acnr_Context_V1_t *pAcnrCtx)
107 {
108     Acnr_result_t result = ACNR_RET_SUCCESS;
109     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
110     if(pAcnrCtx == NULL) {
111         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
112         return ACNR_RET_NULL_POINTER;
113     }
114 
115     result = Acnr_Stop_V1(pAcnrCtx);
116     if (result != ACNR_RET_SUCCESS) {
117         LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
118         return (result);
119     }
120 
121     // check state
122     if ((ACNR_STATE_RUNNING == pAcnrCtx->eState)
123             || (ACNR_STATE_LOCKED == pAcnrCtx->eState)) {
124         return (ACNR_RET_BUSY);
125     }
126 
127     memset(pAcnrCtx, 0x00, sizeof(Acnr_Context_V1_t));
128     free(pAcnrCtx);
129 
130     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
131     return ACNR_RET_SUCCESS;
132 }
133 
134 //anr config
Acnr_Prepare_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_Config_V1_t * pAcnrConfig)135 Acnr_result_t Acnr_Prepare_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_Config_V1_t* pAcnrConfig)
136 {
137     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
138 
139     if(pAcnrCtx == NULL || pAcnrConfig == NULL) {
140         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
141         return ACNR_RET_INVALID_PARM;
142     }
143 
144     if(!!(pAcnrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
145         Acnr_IQParaUpdate_V1(pAcnrCtx);
146     }
147 
148     pAcnrCtx->rawWidth = pAcnrConfig->rawWidth;
149     pAcnrCtx->rawHeight = pAcnrConfig->rawHeight;
150     Acnr_Start_V1(pAcnrCtx);
151 
152     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
153     return ACNR_RET_SUCCESS;
154 }
155 
156 //anr reconfig
Acnr_ReConfig_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_Config_V1_t * pAcnrConfig)157 Acnr_result_t Acnr_ReConfig_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_Config_V1_t* pAcnrConfig)
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 ACNR_RET_SUCCESS;
164 }
165 
166 //anr reconfig
Acnr_IQParaUpdate_V1(Acnr_Context_V1_t * pAcnrCtx)167 Acnr_result_t Acnr_IQParaUpdate_V1(Acnr_Context_V1_t *pAcnrCtx)
168 {
169     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
170     //need todo what?
171 
172     if(pAcnrCtx->isIQParaUpdate) {
173         LOGD_ANR("IQ data reconfig\n");
174         Acnr_ConfigSettingParam_V1(pAcnrCtx, pAcnrCtx->eParamMode, pAcnrCtx->stExpInfo.snr_mode);
175         pAcnrCtx->isIQParaUpdate = false;
176     }
177 
178     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
179     return ACNR_RET_SUCCESS;
180 }
181 
182 
183 //anr preprocess
Acnr_PreProcess_V1(Acnr_Context_V1_t * pAcnrCtx)184 Acnr_result_t Acnr_PreProcess_V1(Acnr_Context_V1_t *pAcnrCtx)
185 {
186     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
187     //need todo what?
188 
189     Acnr_IQParaUpdate_V1(pAcnrCtx);
190 
191     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
192     return ACNR_RET_SUCCESS;
193 }
194 
195 //anr process
Acnr_Process_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_ExpInfo_t * pExpInfo)196 Acnr_result_t Acnr_Process_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ExpInfo_t *pExpInfo)
197 {
198     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
199     Acnr_ParamMode_t mode = ACNR_PARAM_MODE_INVALID;
200 
201     if(pAcnrCtx == NULL) {
202         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
203         return ACNR_RET_INVALID_PARM;
204     }
205 
206     if(pExpInfo == NULL) {
207         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
208         return ACNR_RET_INVALID_PARM;
209     }
210 
211     if(pAcnrCtx->eState != ACNR_STATE_RUNNING) {
212         return ACNR_RET_SUCCESS;
213     }
214 
215 
216     Acnr_ParamModeProcess_V1(pAcnrCtx, pExpInfo, &mode);
217 
218     if(pAcnrCtx->eMode == ACNR_OP_MODE_AUTO) {
219 
220         LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
221 
222 #if ACNR_USE_XML_FILE_V1
223         if(pExpInfo->snr_mode != pAcnrCtx->stExpInfo.snr_mode || pAcnrCtx->eParamMode != mode) {
224             LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
225             pAcnrCtx->eParamMode = mode;
226             Acnr_ConfigSettingParam_V1(pAcnrCtx, pAcnrCtx->eParamMode, pExpInfo->snr_mode);
227         }
228 #endif
229 
230         //select param
231         cnr_select_params_by_ISO_V1(&pAcnrCtx->stAuto.stParams, &pAcnrCtx->stAuto.stSelect, pExpInfo);
232 
233     } else if(pAcnrCtx->eMode == ACNR_OP_MODE_MANUAL) {
234         //TODO
235     }
236 
237     memcpy(&pAcnrCtx->stExpInfo, pExpInfo, sizeof(Acnr_ExpInfo_t));
238     pAcnrCtx->stExpInfo.rawHeight = pAcnrCtx->rawHeight;
239     pAcnrCtx->stExpInfo.rawWidth = pAcnrCtx->rawWidth;
240 
241     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
242     return ACNR_RET_SUCCESS;
243 
244 }
245 
246 
247 
248 //anr get result
Acnr_GetProcResult_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_ProcResult_V1_t * pAcnrResult)249 Acnr_result_t Acnr_GetProcResult_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ProcResult_V1_t* pAcnrResult)
250 {
251     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
252 
253     if(pAcnrCtx == NULL) {
254         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
255         return ACNR_RET_INVALID_PARM;
256     }
257 
258     if(pAcnrResult == NULL) {
259         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
260         return ACNR_RET_INVALID_PARM;
261     }
262 
263     RK_CNR_Params_V1_Select_t* stSelect = NULL;
264     if(pAcnrCtx->eMode == ACNR_OP_MODE_AUTO) {
265         stSelect = &pAcnrCtx->stAuto.stSelect;
266     } else if(pAcnrCtx->eMode == ACNR_OP_MODE_MANUAL) {
267         //TODO
268         stSelect = &pAcnrCtx->stManual.stSelect;
269         pAcnrCtx->fCnr_SF_Strength = 1.0;
270     }
271 
272     //transfer to reg value
273     cnr_fix_transfer_V1(stSelect, pAcnrResult->stFix,  &pAcnrCtx->stExpInfo, pAcnrCtx->fCnr_SF_Strength);
274 
275     LOGD_ANR("%s:%d xml:local:%d mode:%d  reg: local gain:%d  mfnr gain:%d mode:%d\n",
276              __FUNCTION__, __LINE__);
277 
278     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
279     return ACNR_RET_SUCCESS;
280 }
281 
Acnr_ConfigSettingParam_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_ParamMode_t eParamMode,int snr_mode)282 Acnr_result_t Acnr_ConfigSettingParam_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_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(pAcnrCtx == NULL) {
290         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
291         return ACNR_RET_INVALID_PARM;
292     }
293 
294     //select param mode first
295     if(eParamMode == ACNR_PARAM_MODE_NORMAL) {
296         sprintf(param_mode_name, "%s", "normal");
297     } else if(eParamMode == ACNR_PARAM_MODE_HDR) {
298         sprintf(param_mode_name, "%s", "hdr");
299     } else if(eParamMode == ACNR_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 ACNR_USE_JSON_FILE_V1
318     cnr_config_setting_param_json_V1(&pAcnrCtx->stAuto.stParams, &pAcnrCtx->cnr_v1, param_mode_name, snr_name);
319 #else
320     cnr_config_setting_param_V1(&pAcnrCtx->stAuto.stParams, pAcnrCtx->list_cnr_v1, param_mode_name, snr_name);
321 #endif
322 
323     return ACNR_RET_SUCCESS;
324 }
325 
Acnr_ParamModeProcess_V1(Acnr_Context_V1_t * pAcnrCtx,Acnr_ExpInfo_t * pExpInfo,Acnr_ParamMode_t * mode)326 Acnr_result_t Acnr_ParamModeProcess_V1(Acnr_Context_V1_t *pAcnrCtx, Acnr_ExpInfo_t *pExpInfo, Acnr_ParamMode_t *mode) {
327     Acnr_result_t res  = ACNR_RET_SUCCESS;
328     *mode = pAcnrCtx->eParamMode;
329 
330     if(pAcnrCtx == NULL) {
331         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
332         return ACNR_RET_INVALID_PARM;
333     }
334 
335     if(pAcnrCtx->isGrayMode) {
336         *mode = ACNR_PARAM_MODE_GRAY;
337     } else if(pExpInfo->hdr_mode == 0) {
338         *mode = ACNR_PARAM_MODE_NORMAL;
339     } else if(pExpInfo->hdr_mode >= 1) {
340         *mode = ACNR_PARAM_MODE_HDR;
341     } else {
342         *mode = ACNR_PARAM_MODE_NORMAL;
343     }
344 
345     return res;
346 }
347 
348 
349 RKAIQ_END_DECLARE
350 
351 
352