1 
2 #include "rk_aiq_abayer2dnr_algo_v2.h"
3 #include "rk_aiq_abayer2dnr_algo_itf_v2.h"
4 
5 RKAIQ_BEGIN_DECLARE
6 
Abayer2dnr_Start_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx)7 Abayer2dnr_result_V2_t Abayer2dnr_Start_V2(Abayer2dnr_Context_V2_t *pAbayernrCtx)
8 {
9     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
10 
11     // initial checks
12     if (pAbayernrCtx == NULL) {
13         return (ABAYER2DNR_RET_NULL_POINTER);
14     }
15 
16     if ((ABAYER2DNR_STATE_RUNNING == pAbayernrCtx->eState)
17             || (ABAYER2DNR_STATE_LOCKED == pAbayernrCtx->eState)) {
18         return (ABAYER2DNR_RET_FAILURE);
19     }
20 
21     pAbayernrCtx->eState = ABAYER2DNR_STATE_RUNNING;
22 
23     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
24     return (ABAYER2DNR_RET_SUCCESS);
25 }
26 
27 
Abayer2dnr_Stop_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx)28 Abayer2dnr_result_V2_t Abayer2dnr_Stop_V2(Abayer2dnr_Context_V2_t *pAbayernrCtx)
29 {
30     LOGI_ANR( "%s:enter!\n", __FUNCTION__);
31 
32     // initial checks
33     if (pAbayernrCtx == NULL) {
34         return (ABAYER2DNR_RET_NULL_POINTER);
35     }
36 
37     if (ABAYER2DNR_STATE_LOCKED == pAbayernrCtx->eState) {
38         return (ABAYER2DNR_RET_FAILURE);
39     }
40 
41     pAbayernrCtx->eState = ABAYER2DNR_STATE_STOPPED;
42 
43     LOGI_ANR( "%s:exit!\n", __FUNCTION__);
44     return (ABAYER2DNR_RET_SUCCESS);
45 }
46 
47 
48 //anr inint
Abayer2dnr_Init_V2(Abayer2dnr_Context_V2_t ** ppAbayernrCtx,void * pCalibDb)49 Abayer2dnr_result_V2_t Abayer2dnr_Init_V2(Abayer2dnr_Context_V2_t **ppAbayernrCtx, void *pCalibDb)
50 {
51     Abayer2dnr_Context_V2_t * pAbayernrCtx;
52 
53     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
54 
55     pAbayernrCtx = (Abayer2dnr_Context_V2_t *)malloc(sizeof(Abayer2dnr_Context_V2_t));
56     if(pAbayernrCtx == NULL) {
57         LOGE_ANR("%s(%d): malloc fail\n", __FUNCTION__, __LINE__);
58         return ABAYER2DNR_RET_NULL_POINTER;
59     }
60 
61     memset(pAbayernrCtx, 0x00, sizeof(Abayer2dnr_Context_V2_t));
62 
63     //gain state init
64     pAbayernrCtx->stStrength.strength_enable = false;
65     pAbayernrCtx->stStrength.percent = 1.0;
66 
67     pAbayernrCtx->eState = ABAYER2DNR_STATE_INITIALIZED;
68     *ppAbayernrCtx = pAbayernrCtx;
69 
70     pAbayernrCtx->eMode = ABAYER2DNR_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_V2)
77     CalibDbV2_Bayer2dnrV2_t * pcalibdbV2_bayernr_v2 =
78         (CalibDbV2_Bayer2dnrV2_t *)(CALIBDBV2_GET_MODULE_PTR((CamCalibDbV2Context_t*)pCalibDb, bayer2dnr_v2));
79     pAbayernrCtx->bayernr_v2 = *pcalibdbV2_bayernr_v2;
80 #endif
81 
82 
83 #if 1
84     pAbayernrCtx->stExpInfo.snr_mode = 1;
85     pAbayernrCtx->eParamMode = ABAYER2DNR_PARAM_MODE_NORMAL;
86     Abayer2dnr_ConfigSettingParam_V2(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_RET_SUCCESS;
94 }
95 
96 //anr release
Abayer2dnr_Release_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx)97 Abayer2dnr_result_V2_t Abayer2dnr_Release_V2(Abayer2dnr_Context_V2_t *pAbayernrCtx)
98 {
99     Abayer2dnr_result_V2_t result = ABAYER2DNR_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_RET_NULL_POINTER;
104     }
105 
106     result = Abayer2dnr_Stop_V2(pAbayernrCtx);
107     if (result != ABAYER2DNR_RET_SUCCESS) {
108         LOGE_ANR( "%s: ANRStop() failed!\n", __FUNCTION__);
109         return (result);
110     }
111 
112     // check state
113     if ((ABAYER2DNR_STATE_RUNNING == pAbayernrCtx->eState)
114             || (ABAYER2DNR_STATE_LOCKED == pAbayernrCtx->eState)) {
115         return (ABAYER2DNR_RET_BUSY);
116     }
117 
118     memset(pAbayernrCtx, 0x00, sizeof(Abayer2dnr_Context_V2_t));
119     free(pAbayernrCtx);
120 
121     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
122     return ABAYER2DNR_RET_SUCCESS;
123 }
124 
125 //anr config
Abayer2dnr_Prepare_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx,Abayer2dnr_Config_V2_t * pAbayernrConfig)126 Abayer2dnr_result_V2_t Abayer2dnr_Prepare_V2(Abayer2dnr_Context_V2_t *pAbayernrCtx, Abayer2dnr_Config_V2_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_RET_INVALID_PARM;
133     }
134 
135     if(!!(pAbayernrCtx->prepare_type & RK_AIQ_ALGO_CONFTYPE_UPDATECALIB)) {
136         Abayer2dnr_IQParaUpdate_V2(pAbayernrCtx);
137     }
138 
139     Abayer2dnr_Start_V2(pAbayernrCtx);
140 
141     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
142     return ABAYER2DNR_RET_SUCCESS;
143 }
144 
145 //anr reconfig
Abayer2dnr_ReConfig_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx,Abayer2dnr_Config_V2_t * pAbayernrConfig)146 Abayer2dnr_result_V2_t Abayer2dnr_ReConfig_V2(Abayer2dnr_Context_V2_t *pAbayernrCtx, Abayer2dnr_Config_V2_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_RET_SUCCESS;
153 }
154 
155 //anr reconfig
Abayer2dnr_IQParaUpdate_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx)156 Abayer2dnr_result_V2_t Abayer2dnr_IQParaUpdate_V2(Abayer2dnr_Context_V2_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_V2(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_RET_SUCCESS;
169 }
170 
171 
172 //anr preprocess
Abayer2dnr_PreProcess_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx)173 Abayer2dnr_result_V2_t Abayer2dnr_PreProcess_V2(Abayer2dnr_Context_V2_t *pAbayernrCtx)
174 {
175     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
176     //need todo what?
177 
178     Abayer2dnr_IQParaUpdate_V2(pAbayernrCtx);
179 
180     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
181     return ABAYER2DNR_RET_SUCCESS;
182 }
183 
184 //anr process
Abayer2dnr_Process_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx,Abayer2dnr_ExpInfo_V2_t * pExpInfo)185 Abayer2dnr_result_V2_t Abayer2dnr_Process_V2(Abayer2dnr_Context_V2_t *pAbayernrCtx, Abayer2dnr_ExpInfo_V2_t *pExpInfo)
186 {
187     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
188     Abayer2dnr_ParamMode_V2_t mode = ABAYER2DNR_PARAM_MODE_INVALID;
189 
190     if(pAbayernrCtx == NULL || pExpInfo == NULL) {
191         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
192         return ABAYER2DNR_RET_INVALID_PARM;
193     }
194 
195     if(pAbayernrCtx->eState != ABAYER2DNR_STATE_RUNNING) {
196         return ABAYER2DNR_RET_SUCCESS;
197     }
198 
199     Abayer2dnr_ParamModeProcess_V2(pAbayernrCtx, pExpInfo, &mode);
200 
201     if(pAbayernrCtx->eMode == ABAYER2DNR_OP_MODE_AUTO) {
202 
203 #if ABAYER2DNR_USE_JSON_FILE_V2
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_V2(pAbayernrCtx, pAbayernrCtx->eParamMode, pExpInfo->snr_mode);
208         }
209 #endif
210 
211         //select param
212         bayer2dnr_select_params_by_ISO_V2(&pAbayernrCtx->stAuto.st2DParams, &pAbayernrCtx->stAuto.st2DSelect, pExpInfo);
213     } else if(pAbayernrCtx->eMode == ABAYER2DNR_OP_MODE_MANUAL) {
214         //TODO
215     }
216 
217     memcpy(&pAbayernrCtx->stExpInfo, pExpInfo, sizeof(Abayer2dnr_ExpInfo_V2_t));
218 
219     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
220     return ABAYER2DNR_RET_SUCCESS;
221 
222 }
223 
224 
225 
226 //anr get result
Abayer2dnr_GetProcResult_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx,Abayer2dnr_ProcResult_V2_t * pAbayernrResult)227 Abayer2dnr_result_V2_t Abayer2dnr_GetProcResult_V2(Abayer2dnr_Context_V2_t *pAbayernrCtx, Abayer2dnr_ProcResult_V2_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_RET_INVALID_PARM;
234     }
235 
236     RK_Bayer2dnr_Params_V2_Select_t* st2DSelect = NULL;
237     if(pAbayernrCtx->eMode == ABAYER2DNR_OP_MODE_AUTO) {
238         st2DSelect = &pAbayernrCtx->stAuto.st2DSelect;
239     } else if(pAbayernrCtx->eMode == ABAYER2DNR_OP_MODE_MANUAL) {
240         st2DSelect = &pAbayernrCtx->stManual.st2DSelect;
241     }
242 
243     //transfer to reg value
244     bayer2dnr_fix_transfer_V2(st2DSelect, pAbayernrResult->st2DFix, &pAbayernrCtx->stStrength, &pAbayernrCtx->stExpInfo);
245 
246     if(pAbayernrCtx->eMode == ABAYER2DNR_OP_MODE_REG_MANUAL) {
247         *pAbayernrResult->st2DFix = pAbayernrCtx->stManual.st2Dfix;
248         pAbayernrCtx->stStrength.percent = 1.0;
249         pAbayernrCtx->stStrength.strength_enable = false;
250     }
251 
252     LOGD_ANR("%s:%d xml:local:%d mode:%d  reg: local gain:%d  mfnr gain:%d mode:%d\n",
253              __FUNCTION__, __LINE__);
254 
255     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
256     return ABAYER2DNR_RET_SUCCESS;
257 }
258 
Abayer2dnr_ConfigSettingParam_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx,Abayer2dnr_ParamMode_V2_t eParamMode,int snr_mode)259 Abayer2dnr_result_V2_t Abayer2dnr_ConfigSettingParam_V2(Abayer2dnr_Context_V2_t *pAbayernrCtx, Abayer2dnr_ParamMode_V2_t eParamMode, int snr_mode)
260 {
261     char snr_name[CALIBDB_NR_SHARP_NAME_LENGTH];
262     char param_mode_name[CALIBDB_MAX_MODE_NAME_LENGTH];
263     memset(param_mode_name, 0x00, sizeof(param_mode_name));
264     memset(snr_name, 0x00, sizeof(snr_name));
265 
266     LOGI_ANR("%s(%d): enter!\n", __FUNCTION__, __LINE__);
267     if(pAbayernrCtx == NULL) {
268         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
269         return ABAYER2DNR_RET_INVALID_PARM;
270     }
271 
272     //select param mode first
273     if(eParamMode == ABAYER2DNR_PARAM_MODE_NORMAL) {
274         sprintf(param_mode_name, "%s", "normal");
275     } else if(eParamMode == ABAYER2DNR_PARAM_MODE_HDR) {
276         sprintf(param_mode_name, "%s", "hdr");
277     } else if(eParamMode == ABAYER2DNR_PARAM_MODE_GRAY) {
278         sprintf(param_mode_name, "%s", "gray");
279     } else {
280         LOGE_ANR("%s(%d): not support param mode!\n", __FUNCTION__, __LINE__);
281         sprintf(param_mode_name, "%s", "normal");
282     }
283 
284     //then select snr mode next
285     if(snr_mode == 1) {
286         sprintf(snr_name, "%s", "HSNR");
287     } else if(snr_mode == 0) {
288         sprintf(snr_name, "%s", "LSNR");
289     } else {
290         LOGE_ANR("%s(%d): not support snr mode:%d!\n", __FUNCTION__, __LINE__, snr_mode);
291         sprintf(snr_name, "%s", "LSNR");
292     }
293 
294 #if (ABAYER2DNR_USE_JSON_FILE_V2)
295     bayer2dnr_config_setting_param_json_V2(&pAbayernrCtx->stAuto.st2DParams, &pAbayernrCtx->bayernr_v2, param_mode_name, snr_name);
296 #endif
297     LOGI_ANR("%s(%d): exit!\n", __FUNCTION__, __LINE__);
298     return ABAYER2DNR_RET_SUCCESS;
299 }
300 
Abayer2dnr_ParamModeProcess_V2(Abayer2dnr_Context_V2_t * pAbayernrCtx,Abayer2dnr_ExpInfo_V2_t * pExpInfo,Abayer2dnr_ParamMode_V2_t * mode)301 Abayer2dnr_result_V2_t Abayer2dnr_ParamModeProcess_V2(Abayer2dnr_Context_V2_t *pAbayernrCtx, Abayer2dnr_ExpInfo_V2_t *pExpInfo, Abayer2dnr_ParamMode_V2_t *mode) {
302     Abayer2dnr_result_V2_t res  = ABAYER2DNR_RET_SUCCESS;
303     *mode = pAbayernrCtx->eParamMode;
304 
305     if(pAbayernrCtx == NULL) {
306         LOGE_ANR("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
307         return ABAYER2DNR_RET_INVALID_PARM;
308     }
309 
310     if(pAbayernrCtx->isGrayMode) {
311         *mode = ABAYER2DNR_PARAM_MODE_GRAY;
312     } else if(pExpInfo->hdr_mode == 0) {
313         *mode = ABAYER2DNR_PARAM_MODE_NORMAL;
314     } else if(pExpInfo->hdr_mode >= 1) {
315         *mode = ABAYER2DNR_PARAM_MODE_HDR;
316     } else {
317         *mode = ABAYER2DNR_PARAM_MODE_NORMAL;
318     }
319 
320     return res;
321 }
322 
323 
324 RKAIQ_END_DECLARE
325 
326 
327