1 #include "rk_aiq_algo_ablc_itf.h"
2 #include "rk_aiq_ablc_algo.h"
3
AblcJsonParamInit(AblcParams_t * pParams,AblcParaV2_t * pBlcCalibParams)4 AblcResult_t AblcJsonParamInit(AblcParams_t *pParams, AblcParaV2_t* pBlcCalibParams)
5 {
6 AblcResult_t res = ABLC_RET_SUCCESS;
7
8 if(pParams == NULL || pBlcCalibParams == NULL) {
9 LOGE_ABLC("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
10 return ABLC_RET_NULL_POINTER;
11 }
12
13 pParams->enable = pBlcCalibParams->enable;
14 for(int i = 0; i < ABLC_MAX_ISO_LEVEL; i++) {
15 pParams->iso[i] = pBlcCalibParams->BLC_Data.ISO[i];
16 pParams->blc_r[i] = pBlcCalibParams->BLC_Data.R_Channel[i];
17 pParams->blc_gr[i] = pBlcCalibParams->BLC_Data.Gr_Channel[i];
18 pParams->blc_gb[i] = pBlcCalibParams->BLC_Data.Gb_Channel[i];
19 pParams->blc_b[i] = pBlcCalibParams->BLC_Data.B_Channel[i];
20
21 LOGD_ABLC("%s(%d): Ablc en:%d iso:%d blc:%f %f %f %f \n",
22 __FUNCTION__, __LINE__,
23 pParams->enable,
24 pParams->iso[i],
25 pParams->blc_r[i],
26 pParams->blc_gr[i],
27 pParams->blc_gb[i],
28 pParams->blc_b[i]);
29 }
30
31 LOG1_ABLC("%s(%d)\n", __FUNCTION__, __LINE__);
32 return res;
33 }
34
35
Ablc_Select_Params_By_ISO(AblcParams_t * pParams,AblcSelect_t * pSelect,AblcExpInfo_t * pExpInfo)36 AblcResult_t Ablc_Select_Params_By_ISO(AblcParams_t *pParams, AblcSelect_t *pSelect, AblcExpInfo_t *pExpInfo)
37 {
38 LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
39
40 int isoLowlevel = 0;
41 int isoHighlevel = 0;
42 int lowIso = 0;
43 int highIso = 0;
44 float ratio = 0.0f;
45 int isoValue = 50;
46 int i = 0;
47
48 if(pParams == NULL) {
49 LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
50 return ABLC_RET_NULL_POINTER;
51 }
52
53 if(pSelect == NULL) {
54 LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
55 return ABLC_RET_NULL_POINTER;
56 }
57
58 if(pExpInfo == NULL) {
59 LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
60 return ABLC_RET_NULL_POINTER;
61 }
62
63
64 isoValue = pExpInfo->arIso[pExpInfo->hdr_mode];
65 for(i = 0; i < ABLC_MAX_ISO_LEVEL - 1; i++)
66 {
67 if(isoValue >= pParams->iso[i] && isoValue <= pParams->iso[i + 1])
68 {
69 isoLowlevel = i;
70 isoHighlevel = i + 1;
71 lowIso = pParams->iso[i];
72 highIso = pParams->iso[i + 1];
73 ratio = (isoValue - lowIso ) / (float)(highIso - lowIso);
74
75 LOG1_ABLC("%s:%d iso: %d %d isovalue:%d ratio:%f \n",
76 __FUNCTION__, __LINE__,
77 lowIso, highIso, isoValue, ratio);
78 break;
79 }
80 }
81
82 if(i == ABLC_MAX_ISO_LEVEL - 1) {
83 if(isoValue < pParams->iso[0])
84 {
85 isoLowlevel = 0;
86 isoHighlevel = 1;
87 ratio = 0;
88 }
89
90 if(isoValue > pParams->iso[ABLC_MAX_ISO_LEVEL - 1])
91 {
92 isoLowlevel = ABLC_MAX_ISO_LEVEL - 2;
93 isoHighlevel = ABLC_MAX_ISO_LEVEL - 1;
94 ratio = 0;
95 }
96 }
97
98 pExpInfo->isoHigh = pParams->iso[isoHighlevel];
99 pExpInfo->isoLow = pParams->iso[isoLowlevel];
100
101 pSelect->enable = pParams->enable;
102
103 pSelect->blc_r = (ratio * (pParams->blc_r[isoHighlevel] - pParams->blc_r[isoLowlevel])
104 + pParams->blc_r[isoLowlevel]);
105 pSelect->blc_gr = (ratio * (pParams->blc_gr[isoHighlevel] - pParams->blc_gr[isoLowlevel])
106 + pParams->blc_gr[isoLowlevel]);
107 pSelect->blc_gb = (ratio * (pParams->blc_gb[isoHighlevel] - pParams->blc_gb[isoLowlevel])
108 + pParams->blc_gb[isoLowlevel]);
109 pSelect->blc_b = (ratio * (pParams->blc_b[isoHighlevel] - pParams->blc_b[isoLowlevel])
110 + pParams->blc_b[isoLowlevel]);
111
112 LOGD_ABLC("%s:(%d) Ablc En:%d ISO:%d isoLowlevel:%d isoHighlevel:%d rggb: %f %f %f %f \n",
113 __FUNCTION__, __LINE__,
114 pSelect->enable, isoValue,
115 isoLowlevel, isoHighlevel,
116 pSelect->blc_r, pSelect->blc_gr,
117 pSelect->blc_gb, pSelect->blc_b);
118
119 LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__);
120 return ABLC_RET_SUCCESS;
121 }
122
AblcParamsUpdate(AblcContext_t * pAblcCtx,CalibDbV2_Ablc_t * pCalibDb)123 AblcResult_t AblcParamsUpdate(AblcContext_t *pAblcCtx, CalibDbV2_Ablc_t *pCalibDb)
124 {
125 LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
126 AblcResult_t ret = ABLC_RET_SUCCESS;
127
128 if(pAblcCtx == NULL || pCalibDb == NULL) {
129 LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
130 return ABLC_RET_NULL_POINTER;
131 }
132
133 //blc0
134 AblcJsonParamInit(&pAblcCtx->stBlc0Params, &pCalibDb->BlcTuningPara);
135
136 //blc1
137 if (CHECK_ISP_HW_V3X()) {
138 AblcJsonParamInit(&pAblcCtx->stBlc1Params, &pCalibDb->Blc1TuningPara);
139 }
140
141 return ret;
142 LOG1_ABLC( "%s:exit!\n", __FUNCTION__);
143 }
144
AblcInit(AblcContext_t ** ppAblcCtx,CamCalibDbV2Context_t * pCalibDb)145 AblcResult_t AblcInit(AblcContext_t **ppAblcCtx, CamCalibDbV2Context_t *pCalibDb)
146 {
147 AblcContext_t * pAblcCtx;
148
149 LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
150
151 pAblcCtx = (AblcContext_t *)malloc(sizeof(AblcContext_t));
152 if(pAblcCtx == NULL) {
153 LOGE_ABLC("%s(%d): NULL pointer\n", __FUNCTION__, __LINE__);
154 return ABLC_RET_NULL_POINTER;
155 }
156
157 memset(pAblcCtx, 0x00, sizeof(AblcContext_t));
158 pAblcCtx->eState = ABLC_STATE_INITIALIZED;
159
160 *ppAblcCtx = pAblcCtx;
161
162 //init params for algo work
163 pAblcCtx->eMode = ABLC_OP_MODE_AUTO;
164 pAblcCtx->isReCalculate |= 1;
165 pAblcCtx->isUpdateParam = true;
166
167
168 CalibDbV2_Ablc_t* ablc_calib =
169 (CalibDbV2_Ablc_t*)(CALIBDBV2_GET_MODULE_PTR((void*)pCalibDb, ablc_calib));
170
171 memcpy(&pAblcCtx->stBlcCalib, ablc_calib, sizeof(pAblcCtx->stBlcCalib));
172 AblcParamsUpdate(pAblcCtx, ablc_calib);
173
174 LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__);
175 return ABLC_RET_SUCCESS;
176 }
177
AblcRelease(AblcContext_t * pAblcCtx)178 AblcResult_t AblcRelease(AblcContext_t *pAblcCtx)
179 {
180 LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
181 if(pAblcCtx == NULL) {
182 LOGE_ABLC("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
183 return ABLC_RET_NULL_POINTER;
184 }
185
186 memset(pAblcCtx, 0x00, sizeof(AblcContext_t));
187 free(pAblcCtx);
188
189 LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__);
190 return ABLC_RET_SUCCESS;
191
192 }
193
AblcProcess(AblcContext_t * pAblcCtx,AblcExpInfo_t * pExpInfo)194 AblcResult_t AblcProcess(AblcContext_t *pAblcCtx, AblcExpInfo_t *pExpInfo)
195 {
196 LOG1_ABLC("%s(%d): enter!\n", __FUNCTION__, __LINE__);
197 AblcResult_t ret = ABLC_RET_SUCCESS;
198
199 if(pAblcCtx == NULL) {
200 LOGE_ABLC("%s(%d): null pointer\n", __FUNCTION__, __LINE__);
201 return ABLC_RET_NULL_POINTER;
202 }
203
204 if(pExpInfo == NULL) {
205 LOGE_ABLC("%s(%d): null pointer \n", __FUNCTION__, __LINE__);
206 return ABLC_RET_NULL_POINTER;
207 }
208
209 if(pAblcCtx->eMode == ABLC_OP_MODE_AUTO) {
210 LOGD_ABLC("%s:(%d) Ablc auto !!! \n", __FUNCTION__, __LINE__);
211 ret = Ablc_Select_Params_By_ISO(&pAblcCtx->stBlc0Params, &pAblcCtx->stBlc0Select, pExpInfo);
212 pAblcCtx->ProcRes.enable = pAblcCtx->stBlc0Select.enable;
213 pAblcCtx->ProcRes.blc_r = (uint16_t)(pAblcCtx->stBlc0Select.blc_r + 0.5);
214 pAblcCtx->ProcRes.blc_gr = (uint16_t)(pAblcCtx->stBlc0Select.blc_gr + 0.5);
215 pAblcCtx->ProcRes.blc_gb = (uint16_t)(pAblcCtx->stBlc0Select.blc_gb + 0.5);
216 pAblcCtx->ProcRes.blc_b = (uint16_t)(pAblcCtx->stBlc0Select.blc_b + 0.5);
217
218 if (CHECK_ISP_HW_V3X()) {
219 if(pExpInfo->hdr_mode == 0) {
220 //normal mode allow blc1 enable
221 if(pAblcCtx->stBlc1Params.enable) {
222 ret = Ablc_Select_Params_By_ISO(&pAblcCtx->stBlc1Params, &pAblcCtx->stBlc1Select, pExpInfo);
223 }
224 pAblcCtx->stBlc1Select.enable = pAblcCtx->stBlc1Params.enable;
225 pAblcCtx->ProcRes.blc1_enable = pAblcCtx->stBlc1Select.enable;
226 pAblcCtx->ProcRes.blc1_r = pAblcCtx->stBlc1Select.blc_r;
227 pAblcCtx->ProcRes.blc1_gr = pAblcCtx->stBlc1Select.blc_gr;
228 pAblcCtx->ProcRes.blc1_gb = pAblcCtx->stBlc1Select.blc_gb;
229 pAblcCtx->ProcRes.blc1_b = pAblcCtx->stBlc1Select.blc_b;
230 } else {
231 //hdr mode blc1 must disable
232 pAblcCtx->stBlc1Select.enable = 0;
233 pAblcCtx->ProcRes.blc1_enable = 0;
234 pAblcCtx->ProcRes.blc1_r = 0;
235 pAblcCtx->ProcRes.blc1_gr = 0;
236 pAblcCtx->ProcRes.blc1_gb = 0;
237 pAblcCtx->ProcRes.blc1_b = 0;
238 }
239 }
240 } else if(pAblcCtx->eMode == ABLC_OP_MODE_MANUAL) {
241 LOGD_ABLC("%s:(%d) Ablc manual !!! \n", __FUNCTION__, __LINE__);
242 pAblcCtx->ProcRes.enable = pAblcCtx->stBlc0Manual.enable;
243 pAblcCtx->ProcRes.blc_r = (uint16_t)(pAblcCtx->stBlc0Manual.blc_r + 0.5);
244 pAblcCtx->ProcRes.blc_gr = (uint16_t)(pAblcCtx->stBlc0Manual.blc_gr + 0.5);
245 pAblcCtx->ProcRes.blc_gb = (uint16_t)(pAblcCtx->stBlc0Manual.blc_gb + 0.5);
246 pAblcCtx->ProcRes.blc_b = (uint16_t)(pAblcCtx->stBlc0Manual.blc_b + 0.5);
247
248
249 if (CHECK_ISP_HW_V3X()) {
250 if(pExpInfo->hdr_mode == 0) {
251 //normal mode allow blc1 enable
252 pAblcCtx->ProcRes.blc1_enable = pAblcCtx->stBlc1Manual.enable;
253 pAblcCtx->ProcRes.blc1_r = pAblcCtx->stBlc1Manual.blc_r;
254 pAblcCtx->ProcRes.blc1_gr = pAblcCtx->stBlc1Manual.blc_gr;
255 pAblcCtx->ProcRes.blc1_gb = pAblcCtx->stBlc1Manual.blc_gb;
256 pAblcCtx->ProcRes.blc1_b = pAblcCtx->stBlc1Manual.blc_b;
257 } else {
258 //hdr mode blc1 must disable
259 pAblcCtx->ProcRes.blc1_enable = 0;
260 pAblcCtx->ProcRes.blc1_r = 0;
261 pAblcCtx->ProcRes.blc1_gr = 0;
262 pAblcCtx->ProcRes.blc1_gb = 0;
263 pAblcCtx->ProcRes.blc1_b = 0;
264 }
265 }
266 } else {
267 LOGE_ABLC("%s(%d): not support mode:%d!\n", __FUNCTION__, __LINE__, pAblcCtx->eMode);
268 }
269
270
271 memcpy(&pAblcCtx->stExpInfo, pExpInfo, sizeof(AblcExpInfo_t));
272
273 LOGD_ABLC("%s(%d): Ablc en:%d blc:%d %d %d %d \n",
274 __FUNCTION__, __LINE__,
275 pAblcCtx->ProcRes.enable,
276 pAblcCtx->ProcRes.blc_r,
277 pAblcCtx->ProcRes.blc_gr,
278 pAblcCtx->ProcRes.blc_gb,
279 pAblcCtx->ProcRes.blc_b);
280
281 if (CHECK_ISP_HW_V3X()) {
282 LOGD_ABLC("%s(%d): Ablc1 en:%d blc:%f %f %f %f \n",
283 __FUNCTION__, __LINE__,
284 pAblcCtx->ProcRes.blc1_enable,
285 pAblcCtx->ProcRes.blc1_r,
286 pAblcCtx->ProcRes.blc1_gr,
287 pAblcCtx->ProcRes.blc1_gb,
288 pAblcCtx->ProcRes.blc1_b);
289 }
290
291 LOG1_ABLC("%s(%d): exit!\n", __FUNCTION__, __LINE__);
292 return ABLC_RET_SUCCESS;
293 }
294
295
296