1 
2 #include "rk_aiq_abayer2dnr_algo_v23.h"
3 #include "rk_aiq_abayer2dnr_algo_itf_v23.h"
4 
5 RKAIQ_BEGIN_DECLARE
6 
Abayer2dnr_Start_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx)7 Abayer2dnr_result_V23_t Abayer2dnr_Start_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx)
8 {
9     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
10 
11     // initial checks
12     if (pAbayernrCtx == NULL) {
13         return (ABAYER2DNR_V23_RET_NULL_POINTER);
14     }
15 
16     if ((ABAYER2DNR_V23_STATE_RUNNING == pAbayernrCtx->eState)
17             || (ABAYER2DNR_V23_STATE_LOCKED == pAbayernrCtx->eState)) {
18         return (ABAYER2DNR_V23_RET_FAILURE);
19     }
20 
21     pAbayernrCtx->eState = ABAYER2DNR_V23_STATE_RUNNING;
22 
23     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
24     return (ABAYER2DNR_V23_RET_SUCCESS);
25 }
26 
27 
Abayer2dnr_Stop_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx)28 Abayer2dnr_result_V23_t Abayer2dnr_Stop_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx)
29 {
30     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
31 
32     // initial checks
33     if (pAbayernrCtx == NULL) {
34         return (ABAYER2DNR_V23_RET_NULL_POINTER);
35     }
36 
37     if (ABAYER2DNR_V23_STATE_LOCKED == pAbayernrCtx->eState) {
38         return (ABAYER2DNR_V23_RET_FAILURE);
39     }
40 
41     pAbayernrCtx->eState = ABAYER2DNR_V23_STATE_STOPPED;
42 
43     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
44     return (ABAYER2DNR_V23_RET_SUCCESS);
45 }
46 
47 
48 //anr inint
Abayer2dnr_Init_V23(Abayer2dnr_Context_V23_t ** ppAbayernrCtx,void * pCalibDb)49 Abayer2dnr_result_V23_t Abayer2dnr_Init_V23(Abayer2dnr_Context_V23_t **ppAbayernrCtx, void *pCalibDb)
50 {
51     Abayer2dnr_Context_V23_t * pAbayernrCtx;
52 
53     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
54 
55     pAbayernrCtx = (Abayer2dnr_Context_V23_t *)malloc(sizeof(Abayer2dnr_Context_V23_t));
56     if(pAbayernrCtx == NULL) {
57         LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
58         return ABAYER2DNR_V23_RET_NULL_POINTER;
59     }
60 
61     memset(pAbayernrCtx, 0x00, sizeof(Abayer2dnr_Context_V23_t));
62 
63     //gain state init
64     pAbayernrCtx->stStrength.strength_enable = true;
65     pAbayernrCtx->stStrength.percent = 1.0;
66 
67     pAbayernrCtx->eState = ABAYER2DNR_V23_STATE_INITIALIZED;
68     *ppAbayernrCtx = pAbayernrCtx;
69 
70     pAbayernrCtx->eMode = ABAYER2DNR_V23_OP_MODE_AUTO;
71     pAbayernrCtx->isIQParaUpdate = false;
72     pAbayernrCtx->isGrayMode = false;
73     pAbayernrCtx->isReCalculate = 1;
74 
75     //read v1 params from xml
76 #if (ABAYER2DNR_USE_JSON_FILE_V23)
77     CalibDbV2_Bayer2dnrV23_t * pcalibdbV23_bayernr_v23 =
78         (CalibDbV2_Bayer2dnrV23_t *)(CALIBDBV2_GET_MODULE_PTR((CamCalibDbV2Context_t*)pCalibDb, bayer2dnr_v23));
79     pAbayernrCtx->bayernr_v23 = *pcalibdbV23_bayernr_v23;
80 #endif
81 
82 
83 #if 1
84     pAbayernrCtx->stExpInfo.snr_mode = 1;
85     pAbayernrCtx->eParamMode = ABAYER2DNR_V23_PARAM_MODE_NORMAL;
86     Abayer2dnr_ConfigSettingParam_V23(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
87 #endif
88 
89     LOGD_ANR("%s(%d):", __FUNCTION__, __LINE__);
90 
91 
92     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
93     return ABAYER2DNR_V23_RET_SUCCESS;
94 }
95 
96 //anr release
Abayer2dnr_Release_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx)97 Abayer2dnr_result_V23_t Abayer2dnr_Release_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx)
98 {
99     Abayer2dnr_result_V23_t result = ABAYER2DNR_V23_RET_SUCCESS;
100     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
101     if(pAbayernrCtx == NULL) {
102         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
103         return ABAYER2DNR_V23_RET_NULL_POINTER;
104     }
105 
106     result = Abayer2dnr_Stop_V23(pAbayernrCtx);
107     if (result != ABAYER2DNR_V23_RET_SUCCESS) {
108         LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
109         return (result);
110     }
111 
112     // check state
113     if ((ABAYER2DNR_V23_STATE_RUNNING == pAbayernrCtx->eState)
114             || (ABAYER2DNR_V23_STATE_LOCKED == pAbayernrCtx->eState)) {
115         return (ABAYER2DNR_V23_RET_BUSY);
116     }
117 
118     memset(pAbayernrCtx, 0x00, sizeof(Abayer2dnr_Context_V23_t));
119     free(pAbayernrCtx);
120 
121     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
122     return ABAYER2DNR_V23_RET_SUCCESS;
123 }
124 
125 //anr config
Abayer2dnr_Prepare_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_Config_V23_t * pAbayernrConfig)126 Abayer2dnr_result_V23_t Abayer2dnr_Prepare_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_Config_V23_t* pAbayernrConfig)
127 {
128     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
129 
130     if(pAbayernrCtx == NULL || pAbayernrConfig == NULL) {
131         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
132         return ABAYER2DNR_V23_RET_INVALID_PARM;
133     }
134 
135     if(!!(pAbayernrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
136         Abayer2dnr_IQParaUpdate_V23(pAbayernrCtx);
137     }
138 
139     Abayer2dnr_Start_V23(pAbayernrCtx);
140 
141     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
142     return ABAYER2DNR_V23_RET_SUCCESS;
143 }
144 
145 //anr reconfig
Abayer2dnr_ReConfig_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_Config_V23_t * pAbayernrConfig)146 Abayer2dnr_result_V23_t Abayer2dnr_ReConfig_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_Config_V23_t* pAbayernrConfig)
147 {
148     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
149     //need todo what?
150 
151     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
152     return ABAYER2DNR_V23_RET_SUCCESS;
153 }
154 
155 //anr reconfig
Abayer2dnr_IQParaUpdate_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx)156 Abayer2dnr_result_V23_t Abayer2dnr_IQParaUpdate_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx)
157 {
158     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
159     //need todo what?
160 
161     if(pAbayernrCtx->isIQParaUpdate) {
162         LOGD_ANR("IQ data reconfig\n");
163         Abayer2dnr_ConfigSettingParam_V23(pAbayernrCtx, pAbayernrCtx->eParamMode, pAbayernrCtx->stExpInfo.snr_mode);
164         pAbayernrCtx->isIQParaUpdate = false;
165     }
166 
167     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
168     return ABAYER2DNR_V23_RET_SUCCESS;
169 }
170 
171 
172 //anr preprocess
Abayer2dnr_PreProcess_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx)173 Abayer2dnr_result_V23_t Abayer2dnr_PreProcess_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx)
174 {
175     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
176     //need todo what?
177 
178     Abayer2dnr_IQParaUpdate_V23(pAbayernrCtx);
179 
180     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
181     return ABAYER2DNR_V23_RET_SUCCESS;
182 }
183 
184 //anr process
Abayer2dnr_Process_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_ExpInfo_V23_t * pExpInfo)185 Abayer2dnr_result_V23_t Abayer2dnr_Process_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_ExpInfo_V23_t *pExpInfo)
186 {
187     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
188     Abayer2dnr_ParamMode_V23_t mode = ABAYER2DNR_V23_PARAM_MODE_INVALID;
189 
190     if(pAbayernrCtx == NULL || pExpInfo == NULL) {
191         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
192         return ABAYER2DNR_V23_RET_INVALID_PARM;
193     }
194 
195     if(pAbayernrCtx->eState != ABAYER2DNR_V23_STATE_RUNNING) {
196         return ABAYER2DNR_V23_RET_SUCCESS;
197     }
198 
199     Abayer2dnr_ParamModeProcess_V23(pAbayernrCtx, pExpInfo, &mode);
200 
201     if(pAbayernrCtx->eMode == ABAYER2DNR_V23_OP_MODE_AUTO) {
202 
203 #if ABAYER2DNR_USE_JSON_FILE_V23
204         if(pExpInfo->snr_mode != pAbayernrCtx->stExpInfo.snr_mode || pAbayernrCtx->eParamMode != mode) {
205             LOGD_ANR("param mode:%d snr_mode:%d\n", mode, pExpInfo->snr_mode);
206             pAbayernrCtx->eParamMode = mode;
207             Abayer2dnr_ConfigSettingParam_V23(pAbayernrCtx, pAbayernrCtx->eParamMode, pExpInfo->snr_mode);
208         }
209 #endif
210 
211         //select param
212         bayer2dnr_select_params_by_ISO_V23(&pAbayernrCtx->stAuto.st2DParams, &pAbayernrCtx->stAuto.st2DSelect, pExpInfo);
213     } else if(pAbayernrCtx->eMode == ABAYER2DNR_V23_OP_MODE_MANUAL) {
214         //TODO
215     }
216 
217     memcpy(&pAbayernrCtx->stExpInfo, pExpInfo, sizeof(Abayer2dnr_ExpInfo_V23_t));
218 
219     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
220     return ABAYER2DNR_V23_RET_SUCCESS;
221 
222 }
223 
224 
225 
226 //anr get result
Abayer2dnr_GetProcResult_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_ProcResult_V23_t * pAbayernrResult)227 Abayer2dnr_result_V23_t Abayer2dnr_GetProcResult_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_ProcResult_V23_t* pAbayernrResult)
228 {
229     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
230 
231     if(pAbayernrCtx == NULL || pAbayernrResult == NULL) {
232         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
233         return ABAYER2DNR_V23_RET_INVALID_PARM;
234     }
235 
236     RK_Bayer2dnrV23_Params_Select_t* st2DSelect = NULL;
237     if(pAbayernrCtx->eMode == ABAYER2DNR_V23_OP_MODE_AUTO) {
238         st2DSelect = &pAbayernrCtx->stAuto.st2DSelect;
239     } else if(pAbayernrCtx->eMode == ABAYER2DNR_V23_OP_MODE_MANUAL) {
240         st2DSelect = &pAbayernrCtx->stManual.st2DSelect;
241     }
242 
243     //transfer to reg value
244     bayer2dnr_fix_transfer_V23(st2DSelect, pAbayernrResult->st2DFix, &pAbayernrCtx->stStrength, &pAbayernrCtx->stExpInfo);
245 
246     if(pAbayernrCtx->eMode == ABAYER2DNR_V23_OP_MODE_REG_MANUAL) {
247         *pAbayernrResult->st2DFix = pAbayernrCtx->stManual.st2Dfix;
248         pAbayernrCtx->stStrength.percent = 1.0;
249     }
250 
251     LOGD_ANR("%s:%d xml:local:%d mode:%d  reg: local gain:%d  mfnr gain:%d mode:%d\n",
252              __FUNCTION__, __LINE__);
253 
254     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
255     return ABAYER2DNR_V23_RET_SUCCESS;
256 }
257 
Abayer2dnr_ConfigSettingParam_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_ParamMode_V23_t eParamMode,int snr_mode)258 Abayer2dnr_result_V23_t Abayer2dnr_ConfigSettingParam_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_ParamMode_V23_t eParamMode, int snr_mode)
259 {
260     char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
261     char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
262     memset(param_mode_name, 0x00, sizeof(param_mode_name));
263     memset(snr_name, 0x00, sizeof(snr_name));
264 
265     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
266     if(pAbayernrCtx == NULL) {
267         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
268         return ABAYER2DNR_V23_RET_INVALID_PARM;
269     }
270 
271     //select param mode first
272     if(eParamMode == ABAYER2DNR_V23_PARAM_MODE_NORMAL) {
273         sprintf(param_mode_name, "%s", "normal");
274     } else if(eParamMode == ABAYER2DNR_V23_PARAM_MODE_HDR) {
275         sprintf(param_mode_name, "%s", "hdr");
276     } else if(eParamMode == ABAYER2DNR_V23_PARAM_MODE_GRAY) {
277         sprintf(param_mode_name, "%s", "gray");
278     } else {
279         LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
280         sprintf(param_mode_name, "%s", "normal");
281     }
282 
283     //then select snr mode next
284     if(snr_mode == 1) {
285         sprintf(snr_name, "%s", "HSNR");
286     } else if(snr_mode == 0) {
287         sprintf(snr_name, "%s", "LSNR");
288     } else {
289         LOGE_ANR("%s(%d): not support snr mode:%d!\n", __FUNCTION__, __LINE__, snr_mode);
290         sprintf(snr_name, "%s", "LSNR");
291     }
292 
293 #if (ABAYER2DNR_USE_JSON_FILE_V23)
294     bayer2dnr_config_setting_param_json_V23(&pAbayernrCtx->stAuto.st2DParams, &pAbayernrCtx->bayernr_v23, param_mode_name, snr_name);
295 #endif
296     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
297     return ABAYER2DNR_V23_RET_SUCCESS;
298 }
299 
Abayer2dnr_ParamModeProcess_V23(Abayer2dnr_Context_V23_t * pAbayernrCtx,Abayer2dnr_ExpInfo_V23_t * pExpInfo,Abayer2dnr_ParamMode_V23_t * mode)300 Abayer2dnr_result_V23_t Abayer2dnr_ParamModeProcess_V23(Abayer2dnr_Context_V23_t *pAbayernrCtx, Abayer2dnr_ExpInfo_V23_t *pExpInfo, Abayer2dnr_ParamMode_V23_t *mode) {
301     Abayer2dnr_result_V23_t res  = ABAYER2DNR_V23_RET_SUCCESS;
302     *mode = pAbayernrCtx->eParamMode;
303 
304     if(pAbayernrCtx == NULL) {
305         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
306         return ABAYER2DNR_V23_RET_INVALID_PARM;
307     }
308 
309     if(pAbayernrCtx->isGrayMode) {
310         *mode = ABAYER2DNR_V23_PARAM_MODE_GRAY;
311     } else if(pExpInfo->hdr_mode == 0) {
312         *mode = ABAYER2DNR_V23_PARAM_MODE_NORMAL;
313     } else if(pExpInfo->hdr_mode >= 1) {
314         *mode = ABAYER2DNR_V23_PARAM_MODE_HDR;
315     } else {
316         *mode = ABAYER2DNR_V23_PARAM_MODE_NORMAL;
317     }
318 
319     return res;
320 }
321 
322 
323 RKAIQ_END_DECLARE
324 
325 
326