xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/acnr2/rk_aiq_acnr_algo_v2.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 
2 #include "rk_aiq_acnr_algo_v2.h"
3 #include "rk_aiq_acnr_algo_itf_v2.h"
4 
5 RKAIQ_BEGIN_DECLARE
6 
Acnr_Start_V2(Acnr_Context_V2_t * pAcnrCtx)7 AcnrV2_result_t Acnr_Start_V2(Acnr_Context_V2_t *pAcnrCtx)
8 {
9     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
10 
11     // initial checks
12     if (pAcnrCtx == NULL) {
13         return (ACNRV2_RET_NULL_POINTER);
14     }
15 
16     if ((ACNRV2_STATE_RUNNING == pAcnrCtx->eState)
17             || (ACNRV2_STATE_LOCKED == pAcnrCtx->eState)) {
18         return (ACNRV2_RET_FAILURE);
19     }
20 
21     pAcnrCtx->eState = ACNRV2_STATE_RUNNING;
22 
23     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
24     return (ACNRV2_RET_SUCCESS);
25 }
26 
27 
Acnr_Stop_V2(Acnr_Context_V2_t * pAcnrCtx)28 AcnrV2_result_t Acnr_Stop_V2(Acnr_Context_V2_t *pAcnrCtx)
29 {
30     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
31 
32     // initial checks
33     if (pAcnrCtx == NULL) {
34         return (ACNRV2_RET_NULL_POINTER);
35     }
36 
37     if (ACNRV2_STATE_LOCKED == pAcnrCtx->eState) {
38         return (ACNRV2_RET_FAILURE);
39     }
40 
41     pAcnrCtx->eState = ACNRV2_STATE_STOPPED;
42 
43     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
44     return (ACNRV2_RET_SUCCESS);
45 }
46 
47 
48 //anr inint
Acnr_Init_V2(Acnr_Context_V2_t ** ppAcnrCtx,void * pCalibDb)49 AcnrV2_result_t Acnr_Init_V2(Acnr_Context_V2_t **ppAcnrCtx, void *pCalibDb)
50 {
51     Acnr_Context_V2_t * pAcnrCtx;
52 
53     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
54 
55     pAcnrCtx = (Acnr_Context_V2_t *)malloc(sizeof(Acnr_Context_V2_t));
56     if(pAcnrCtx == NULL) {
57         LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
58         return ACNRV2_RET_NULL_POINTER;
59     }
60 
61     memset(pAcnrCtx, 0x00, sizeof(Acnr_Context_V2_t));
62 
63     //gain state init
64     pAcnrCtx->stStrength.strength_enable = false;
65     pAcnrCtx->stStrength.percent = 1.0;
66 
67     pAcnrCtx->eState = ACNRV2_STATE_INITIALIZED;
68     *ppAcnrCtx = pAcnrCtx;
69 
70     pAcnrCtx->eMode = ACNRV2_OP_MODE_AUTO;
71     pAcnrCtx->isIQParaUpdate = false;
72     pAcnrCtx->isGrayMode = false;
73     pAcnrCtx->isReCalculate = 1;
74 
75 #if ACNR_USE_XML_FILE_V2
76     //read v2 params from xml
77 #if ACNR_USE_JSON_FILE_V2
78     pAcnrCtx->cnr_v2 =
79         *(CalibDbV2_CNRV2_t *)(CALIBDBV2_GET_MODULE_PTR(pCalibDb, cnr_v2));
80 #endif
81 
82 #endif
83 
84 #if RK_SIMULATOR_HW
85     //just for v2 params from html
86 
87 #endif
88 
89 #if ACNR_USE_XML_FILE_V2
90     pAcnrCtx->stExpInfo.snr_mode = 1;
91     pAcnrCtx->eParamMode = ACNRV2_PARAM_MODE_NORMAL;
92     Acnr_ConfigSettingParam_V2(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 ACNRV2_RET_SUCCESS;
100 }
101 
102 //anr release
Acnr_Release_V2(Acnr_Context_V2_t * pAcnrCtx)103 AcnrV2_result_t Acnr_Release_V2(Acnr_Context_V2_t *pAcnrCtx)
104 {
105     AcnrV2_result_t result = ACNRV2_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 ACNRV2_RET_NULL_POINTER;
110     }
111 
112     result = Acnr_Stop_V2(pAcnrCtx);
113     if (result != ACNRV2_RET_SUCCESS) {
114         LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
115         return (result);
116     }
117 
118     // check state
119     if ((ACNRV2_STATE_RUNNING == pAcnrCtx->eState)
120             || (ACNRV2_STATE_LOCKED == pAcnrCtx->eState)) {
121         return (ACNRV2_RET_BUSY);
122     }
123 
124     memset(pAcnrCtx, 0x00, sizeof(Acnr_Context_V2_t));
125     free(pAcnrCtx);
126 
127     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
128     return ACNRV2_RET_SUCCESS;
129 }
130 
131 //anr config
Acnr_Prepare_V2(Acnr_Context_V2_t * pAcnrCtx,Acnr_Config_V2_t * pAcnrConfig)132 AcnrV2_result_t Acnr_Prepare_V2(Acnr_Context_V2_t *pAcnrCtx, Acnr_Config_V2_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 ACNRV2_RET_INVALID_PARM;
139     }
140 
141     if(!!(pAcnrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
142         Acnr_IQParaUpdate_V2(pAcnrCtx);
143     }
144 
145     pAcnrCtx->rawWidth = pAcnrConfig->rawWidth;
146     pAcnrCtx->rawHeight = pAcnrConfig->rawHeight;
147     Acnr_Start_V2(pAcnrCtx);
148 
149     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
150     return ACNRV2_RET_SUCCESS;
151 }
152 
153 //anr reconfig
Acnr_ReConfig_V2(Acnr_Context_V2_t * pAcnrCtx,Acnr_Config_V2_t * pAcnrConfig)154 AcnrV2_result_t Acnr_ReConfig_V2(Acnr_Context_V2_t *pAcnrCtx, Acnr_Config_V2_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 ACNRV2_RET_SUCCESS;
161 }
162 
163 //anr reconfig
Acnr_IQParaUpdate_V2(Acnr_Context_V2_t * pAcnrCtx)164 AcnrV2_result_t Acnr_IQParaUpdate_V2(Acnr_Context_V2_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_V2(pAcnrCtx, pAcnrCtx->eParamMode, pAcnrCtx->stExpInfo.snr_mode);
172         pAcnrCtx->isIQParaUpdate = false;
173     }
174 
175     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
176     return ACNRV2_RET_SUCCESS;
177 }
178 
179 
180 //anr preprocess
Acnr_PreProcess_V2(Acnr_Context_V2_t * pAcnrCtx)181 AcnrV2_result_t Acnr_PreProcess_V2(Acnr_Context_V2_t *pAcnrCtx)
182 {
183     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
184     //need todo what?
185 
186     Acnr_IQParaUpdate_V2(pAcnrCtx);
187 
188     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
189     return ACNRV2_RET_SUCCESS;
190 }
191 
192 //anr process
Acnr_Process_V2(Acnr_Context_V2_t * pAcnrCtx,AcnrV2_ExpInfo_t * pExpInfo)193 AcnrV2_result_t Acnr_Process_V2(Acnr_Context_V2_t *pAcnrCtx, AcnrV2_ExpInfo_t *pExpInfo)
194 {
195     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
196     AcnrV2_ParamMode_t mode = ACNRV2_PARAM_MODE_INVALID;
197 
198     if(pAcnrCtx == NULL) {
199         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
200         return ACNRV2_RET_INVALID_PARM;
201     }
202 
203     if(pExpInfo == NULL) {
204         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
205         return ACNRV2_RET_INVALID_PARM;
206     }
207 
208     if(pAcnrCtx->eState != ACNRV2_STATE_RUNNING) {
209         return ACNRV2_RET_SUCCESS;
210     }
211 
212 
213     Acnr_ParamModeProcess_V2(pAcnrCtx, pExpInfo, &mode);
214 
215     if(pAcnrCtx->eMode == ACNRV2_OP_MODE_AUTO) {
216 
217         LOGD_ANR("%s(%d): \n", __FUNCTION__, __LINE__);
218 
219 #if ACNR_USE_XML_FILE_V2
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_V2(pAcnrCtx, pAcnrCtx->eParamMode, pExpInfo->snr_mode);
224         }
225 #endif
226 
227         //select param
228         cnr_select_params_by_ISO_V2(&pAcnrCtx->stAuto.stParams, &pAcnrCtx->stAuto.stSelect, pExpInfo);
229 
230     } else if(pAcnrCtx->eMode == ACNRV2_OP_MODE_MANUAL) {
231         //TODO
232     }
233 
234     memcpy(&pAcnrCtx->stExpInfo, pExpInfo, sizeof(AcnrV2_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 ACNRV2_RET_SUCCESS;
240 
241 }
242 
243 
244 
245 //anr get result
Acnr_GetProcResult_V2(Acnr_Context_V2_t * pAcnrCtx,Acnr_ProcResult_V2_t * pAcnrResult)246 AcnrV2_result_t Acnr_GetProcResult_V2(Acnr_Context_V2_t *pAcnrCtx, Acnr_ProcResult_V2_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 ACNRV2_RET_INVALID_PARM;
253     }
254 
255     if(pAcnrResult == NULL) {
256         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
257         return ACNRV2_RET_INVALID_PARM;
258     }
259 
260     RK_CNR_Params_V2_Select_t* stSelect = NULL;
261     if(pAcnrCtx->eMode == ACNRV2_OP_MODE_AUTO) {
262         stSelect = &pAcnrCtx->stAuto.stSelect;
263     } else if(pAcnrCtx->eMode == ACNRV2_OP_MODE_MANUAL) {
264         stSelect = &pAcnrCtx->stManual.stSelect;
265     }
266 
267     //transfer to reg value
268     cnr_fix_transfer_V2(stSelect, pAcnrResult->stFix,  &pAcnrCtx->stExpInfo, &pAcnrCtx->stStrength);
269 
270     if(pAcnrCtx->eMode == ACNRV2_OP_MODE_REG_MANUAL) {
271         *pAcnrResult->stFix = pAcnrCtx->stManual.stFix;
272         pAcnrCtx->stStrength.strength_enable = false;
273         pAcnrCtx->stStrength.percent = 1.0;
274     }
275 
276 
277     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
278     return ACNRV2_RET_SUCCESS;
279 }
280 
Acnr_ConfigSettingParam_V2(Acnr_Context_V2_t * pAcnrCtx,AcnrV2_ParamMode_t eParamMode,int snr_mode)281 AcnrV2_result_t Acnr_ConfigSettingParam_V2(Acnr_Context_V2_t *pAcnrCtx, AcnrV2_ParamMode_t eParamMode, int snr_mode)
282 {
283     char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
284     char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
285     memset(param_mode_name, 0x00, sizeof(param_mode_name));
286     memset(snr_name, 0x00, sizeof(snr_name));
287 
288     if(pAcnrCtx == NULL) {
289         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
290         return ACNRV2_RET_INVALID_PARM;
291     }
292 
293     //select param mode first
294     if(eParamMode == ACNRV2_PARAM_MODE_NORMAL) {
295         sprintf(param_mode_name, "%s", "normal");
296     } else if(eParamMode == ACNRV2_PARAM_MODE_HDR) {
297         sprintf(param_mode_name, "%s", "hdr");
298     } else if(eParamMode == ACNRV2_PARAM_MODE_GRAY) {
299         sprintf(param_mode_name, "%s", "gray");
300     } else {
301         LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
302         sprintf(param_mode_name, "%s", "normal");
303     }
304 
305 
306     //then select snr mode next
307     if(snr_mode == 1) {
308         sprintf(snr_name, "%s", "HSNR");
309     } else if(snr_mode == 0) {
310         sprintf(snr_name, "%s", "LSNR");
311     } else {
312         LOGE_ANR("%s(%d): not support snr mode:%d!\n", __FUNCTION__, __LINE__, snr_mode);
313         sprintf(snr_name, "%s", "LSNR");
314     }
315 
316 #if ACNR_USE_JSON_FILE_V2
317     cnr_config_setting_param_json_V2(&pAcnrCtx->stAuto.stParams, &pAcnrCtx->cnr_v2, param_mode_name, snr_name);
318 #endif
319 
320     return ACNRV2_RET_SUCCESS;
321 }
322 
Acnr_ParamModeProcess_V2(Acnr_Context_V2_t * pAcnrCtx,AcnrV2_ExpInfo_t * pExpInfo,AcnrV2_ParamMode_t * mode)323 AcnrV2_result_t Acnr_ParamModeProcess_V2(Acnr_Context_V2_t *pAcnrCtx, AcnrV2_ExpInfo_t *pExpInfo, AcnrV2_ParamMode_t *mode) {
324     AcnrV2_result_t res  = ACNRV2_RET_SUCCESS;
325     *mode = pAcnrCtx->eParamMode;
326 
327     if(pAcnrCtx == NULL) {
328         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
329         return ACNRV2_RET_INVALID_PARM;
330     }
331 
332     if(pAcnrCtx->isGrayMode) {
333         *mode = ACNRV2_PARAM_MODE_GRAY;
334     } else if(pExpInfo->hdr_mode == 0) {
335         *mode = ACNRV2_PARAM_MODE_NORMAL;
336     } else if(pExpInfo->hdr_mode >= 1) {
337         *mode = ACNRV2_PARAM_MODE_HDR;
338     } else {
339         *mode = ACNRV2_PARAM_MODE_NORMAL;
340     }
341 
342     return res;
343 }
344 
345 
346 RKAIQ_END_DECLARE
347 
348 
349