xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/algos/ablc/rk_aiq_ablc_algo.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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