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