xref: /OK3568_Linux_fs/external/camera_engine_rkaiq/rkaiq/iq_parser/RkAiqCalibDb.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *  Copyright (c) 2019 Rockchip Corporation
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include "RkAiqCalibDb.h"
20*4882a593Smuzhiyun #include <unistd.h>
21*4882a593Smuzhiyun #include <sys/types.h>
22*4882a593Smuzhiyun #include <sys/stat.h>
23*4882a593Smuzhiyun #include <fcntl.h>
24*4882a593Smuzhiyun #include <stdio.h>
25*4882a593Smuzhiyun #include "RkAiqCalibApi.h"
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define FUNC_ENTER LOG1("%s enter", __FUNCTION__);
29*4882a593Smuzhiyun #define FUNC_EXIT LOG1("%s exit", __FUNCTION__);
30*4882a593Smuzhiyun #define CALIBDB_PATH_LEN      256
31*4882a593Smuzhiyun #define CALIBDB_ENV_PATH_STR  "rkaiq_calibdb_path"
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun namespace RkCam {
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun namespace {
36*4882a593Smuzhiyun // TODO: implement ops for different isp hw
calibdbV1_ctx_size(CamCalibDbContext_t * ctx)37*4882a593Smuzhiyun static inline size_t calibdbV1_ctx_size(CamCalibDbContext_t* ctx) {
38*4882a593Smuzhiyun     if (CHECK_ISP_HW_V20())
39*4882a593Smuzhiyun         return sizeof(CamCalibDbContextIsp20_t);
40*4882a593Smuzhiyun     else if (CHECK_ISP_HW_V21())
41*4882a593Smuzhiyun         return sizeof(CamCalibDbContextIsp21_t);
42*4882a593Smuzhiyun     else
43*4882a593Smuzhiyun         return sizeof(CamCalibDbContextIsp20_t);
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
calibdbV1_ctx_new()46*4882a593Smuzhiyun static inline CamCalibDbContext_t* calibdbV1_ctx_new() {
47*4882a593Smuzhiyun     if (CHECK_ISP_HW_V20())
48*4882a593Smuzhiyun         return new (CamCalibDbContextIsp20_t);
49*4882a593Smuzhiyun     else if (CHECK_ISP_HW_V21())
50*4882a593Smuzhiyun         return new (CamCalibDbContextIsp21_t);
51*4882a593Smuzhiyun     else
52*4882a593Smuzhiyun         return NULL;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun 
calibdbV1_ctx_delete(CamCalibDbContext_t * ctx)55*4882a593Smuzhiyun static inline void calibdbV1_ctx_delete(CamCalibDbContext_t* ctx) {
56*4882a593Smuzhiyun     if (CHECK_ISP_HW_V20())
57*4882a593Smuzhiyun         delete (CamCalibDbContextIsp20_t*)ctx;
58*4882a593Smuzhiyun     else if (CHECK_ISP_HW_V21())
59*4882a593Smuzhiyun         delete (CamCalibDbContextIsp21_t*)ctx;
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun } // namespace
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun map<string, CamCalibDbContext_t*> RkAiqCalibDb::mCalibDbsMap;
65*4882a593Smuzhiyun XCam::Mutex RkAiqCalibDb::mMutex{false};
66*4882a593Smuzhiyun 
calibGetEnviromentPath(const char * variable,char * value)67*4882a593Smuzhiyun static bool calibGetEnviromentPath(const char* variable, char* value)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun     if (!variable || !value) {
70*4882a593Smuzhiyun         return false;
71*4882a593Smuzhiyun     }
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun     char* valueStr = getenv(variable);
74*4882a593Smuzhiyun     if (valueStr) {
75*4882a593Smuzhiyun         strncpy(value, valueStr, CALIBDB_PATH_LEN - 100 - 2);
76*4882a593Smuzhiyun         return true;
77*4882a593Smuzhiyun     }
78*4882a593Smuzhiyun     return false;
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
getFilePathName(char * iqFile,char * location)81*4882a593Smuzhiyun static void getFilePathName(char* iqFile, char *location)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun     char dir[CALIBDB_PATH_LEN - 100 - 1];
84*4882a593Smuzhiyun     char name[100 - 1 - 5];
85*4882a593Smuzhiyun     char *srcfile = strdup(iqFile);
86*4882a593Smuzhiyun     char *pstart = strrchr(srcfile, '/');
87*4882a593Smuzhiyun     char *pend = strrchr(srcfile, '.');
88*4882a593Smuzhiyun     *pend = '\0';
89*4882a593Smuzhiyun     strcpy(name, pstart + 1);
90*4882a593Smuzhiyun     if (calibGetEnviromentPath(CALIBDB_ENV_PATH_STR, dir)) {
91*4882a593Smuzhiyun         snprintf(location, CALIBDB_PATH_LEN, "%s/%s.bin", dir, name);
92*4882a593Smuzhiyun     } else {
93*4882a593Smuzhiyun         snprintf(location, CALIBDB_PATH_LEN, "%s.bin", srcfile);
94*4882a593Smuzhiyun     }
95*4882a593Smuzhiyun     free(srcfile);
96*4882a593Smuzhiyun     LOGD("calibdb file is %s", location);
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
getFilePathName2(char * iqFile,char * newName)99*4882a593Smuzhiyun static void getFilePathName2(char* iqFile, char *newName)
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun     char dir[CALIBDB_PATH_LEN - 100 - 1];
102*4882a593Smuzhiyun     char name[100 - 1 - 10];
103*4882a593Smuzhiyun     char *srcfile = strdup(iqFile);
104*4882a593Smuzhiyun     char *pstart = strrchr(srcfile, '/');
105*4882a593Smuzhiyun     char *pend = strrchr(srcfile, '.');
106*4882a593Smuzhiyun     *pend = '\0';
107*4882a593Smuzhiyun     strcpy(name, pstart + 1);
108*4882a593Smuzhiyun     if (calibGetEnviromentPath(CALIBDB_ENV_PATH_STR, dir)) {
109*4882a593Smuzhiyun         snprintf(newName, CALIBDB_PATH_LEN, "%s/%s_write.xml", dir, name);
110*4882a593Smuzhiyun     } else {
111*4882a593Smuzhiyun         snprintf(newName, CALIBDB_PATH_LEN, "%s_write.xml", srcfile);
112*4882a593Smuzhiyun     }
113*4882a593Smuzhiyun     free(srcfile);
114*4882a593Smuzhiyun     LOGD("calibdb file is %s", newName);
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun 
isDataBinExist(char * iqFile)117*4882a593Smuzhiyun static bool isDataBinExist(char* iqFile) {
118*4882a593Smuzhiyun     char path[CALIBDB_PATH_LEN];
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun     getFilePathName(iqFile, path);
121*4882a593Smuzhiyun     if (0 == access(path, F_OK))
122*4882a593Smuzhiyun         return true;
123*4882a593Smuzhiyun     else
124*4882a593Smuzhiyun         return false;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun 
persist(int fd,int payload_size,char * payload_ptr)127*4882a593Smuzhiyun static int persist(int fd, int payload_size, char* payload_ptr) {
128*4882a593Smuzhiyun     int ret = true;
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun     LOGD("persist payload_size %d bytes", payload_size);
131*4882a593Smuzhiyun     if (write(fd, payload_ptr, payload_size) <= 0) {
132*4882a593Smuzhiyun         LOGE("persist cell failed\n");
133*4882a593Smuzhiyun         return -1;
134*4882a593Smuzhiyun     }
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun     return 0;
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun 
reconstruct(int fd,int payload_size,char ** payload_ptr)139*4882a593Smuzhiyun static int reconstruct(int fd, int payload_size, char** payload_ptr) {
140*4882a593Smuzhiyun     *payload_ptr = (char*)malloc(payload_size);
141*4882a593Smuzhiyun     if (*payload_ptr == NULL)
142*4882a593Smuzhiyun         return -1;
143*4882a593Smuzhiyun     LOGD("malloc payload_ptr %p, size %d bytes", *payload_ptr, payload_size);
144*4882a593Smuzhiyun     if (read(fd, *payload_ptr, payload_size) <= 0) {
145*4882a593Smuzhiyun         LOGE("reconstruct cell failed %s!\n", strerror(errno));
146*4882a593Smuzhiyun         free(*payload_ptr);
147*4882a593Smuzhiyun         return -1;
148*4882a593Smuzhiyun     }
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun     return 0;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun 
persistCalib(int fd,CamCalibDbContext_t * pcalib)153*4882a593Smuzhiyun static int persistCalib(int fd, CamCalibDbContext_t* pcalib) {
154*4882a593Smuzhiyun     int ret = 0;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun     if (!CHECK_ISP_HW_V20()) {
157*4882a593Smuzhiyun         LOGE("only support isp20 calibv1 !");
158*4882a593Smuzhiyun         return -1;
159*4882a593Smuzhiyun     }
160*4882a593Smuzhiyun     CamCalibDbContextIsp20_t* calib = TO_CALIBDBV1_ISP20(pcalib);
161*4882a593Smuzhiyun     ret |= persist(fd, sizeof(CamCalibDbContextIsp20_t), (char*)calib);
162*4882a593Smuzhiyun     LOGD("CamCalibDbContextIsp20_t size %d bytes", sizeof(CamCalibDbContextIsp20_t));
163*4882a593Smuzhiyun     // points
164*4882a593Smuzhiyun     ret |= persist(fd,
165*4882a593Smuzhiyun                    sizeof(CalibDb_BayerNr_ModeCell_t) * calib->bayerNr.mode_num,
166*4882a593Smuzhiyun                    (char*)(calib->bayerNr.mode_cell));
167*4882a593Smuzhiyun     ret |= persist(fd,
168*4882a593Smuzhiyun                    sizeof(CalibDb_LscTableProfile_t) * calib->lsc.tableAllNum,
169*4882a593Smuzhiyun                    (char*)(calib->lsc.tableAll));
170*4882a593Smuzhiyun     ret |= persist(fd,
171*4882a593Smuzhiyun                    sizeof(CalibDb_UVNR_ModeCell_t) * calib->uvnr.mode_num,
172*4882a593Smuzhiyun                    (char*)(calib->uvnr.mode_cell));
173*4882a593Smuzhiyun     ret |= persist(fd,
174*4882a593Smuzhiyun                    sizeof(CalibDb_YNR_ModeCell_t) * calib->ynr.mode_num,
175*4882a593Smuzhiyun                    (char*)(calib->ynr.mode_cell));
176*4882a593Smuzhiyun     ret |= persist(fd,
177*4882a593Smuzhiyun                    sizeof(CalibDb_MFNR_ModeCell_t) * calib->mfnr.mode_num,
178*4882a593Smuzhiyun                    (char*)(calib->mfnr.mode_cell));
179*4882a593Smuzhiyun     ret |= persist(fd,
180*4882a593Smuzhiyun                    sizeof(CalibDb_Sharp_ModeCell_t) * calib->sharp.mode_num,
181*4882a593Smuzhiyun                    (char*)(calib->sharp.mode_cell));
182*4882a593Smuzhiyun     ret |= persist(fd,
183*4882a593Smuzhiyun                    sizeof(CalibDb_EdgeFilter_ModeCell_t) * calib->edgeFilter.mode_num,
184*4882a593Smuzhiyun                    (char*)(calib->edgeFilter.mode_cell));
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun     return ret;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun 
reconstructCalib(int fd,CamCalibDbContext_t * pcalib)189*4882a593Smuzhiyun static int reconstructCalib(int fd, CamCalibDbContext_t* pcalib) {
190*4882a593Smuzhiyun     int ret = 0;
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun     if (!CHECK_ISP_HW_V20()) {
193*4882a593Smuzhiyun         LOGE("only support isp20 calibv1 !");
194*4882a593Smuzhiyun         return -1;
195*4882a593Smuzhiyun     }
196*4882a593Smuzhiyun     CamCalibDbContextIsp20_t* calib = TO_CALIBDBV1_ISP20(pcalib);
197*4882a593Smuzhiyun     if (read(fd, calib, sizeof(CamCalibDbContextIsp20_t)) <= 0)
198*4882a593Smuzhiyun         return -1;
199*4882a593Smuzhiyun     LOGD("CamCalibDbContextIsp20_t size %d bytes", sizeof(CamCalibDbContextIsp20_t));
200*4882a593Smuzhiyun     // reconstruct points
201*4882a593Smuzhiyun     ret |= reconstruct(fd,
202*4882a593Smuzhiyun                        sizeof(CalibDb_BayerNr_ModeCell_t) * calib->bayerNr.mode_num,
203*4882a593Smuzhiyun                        (char**)(&calib->bayerNr.mode_cell));
204*4882a593Smuzhiyun     ret |= reconstruct(fd,
205*4882a593Smuzhiyun                        sizeof(CalibDb_LscTableProfile_t) * calib->lsc.tableAllNum,
206*4882a593Smuzhiyun                        (char**)(&calib->lsc.tableAll));
207*4882a593Smuzhiyun     ret |= reconstruct(fd,
208*4882a593Smuzhiyun                        sizeof(CalibDb_UVNR_ModeCell_t) * calib->uvnr.mode_num,
209*4882a593Smuzhiyun                        (char**)(&calib->uvnr.mode_cell));
210*4882a593Smuzhiyun     ret |= reconstruct(fd,
211*4882a593Smuzhiyun                        sizeof(CalibDb_YNR_ModeCell_t) * calib->ynr.mode_num,
212*4882a593Smuzhiyun                        (char**)(&calib->ynr.mode_cell));
213*4882a593Smuzhiyun     ret |= reconstruct(fd,
214*4882a593Smuzhiyun                        sizeof(CalibDb_MFNR_ModeCell_t) * calib->mfnr.mode_num,
215*4882a593Smuzhiyun                        (char**)(&calib->mfnr.mode_cell));
216*4882a593Smuzhiyun     ret |= reconstruct(fd,
217*4882a593Smuzhiyun                        sizeof(CalibDb_Sharp_ModeCell_t) * calib->sharp.mode_num,
218*4882a593Smuzhiyun                        (char**)(&calib->sharp.mode_cell));
219*4882a593Smuzhiyun     ret |= reconstruct(fd,
220*4882a593Smuzhiyun                        sizeof(CalibDb_EdgeFilter_ModeCell_t) * calib->edgeFilter.mode_num,
221*4882a593Smuzhiyun                        (char**)(&calib->edgeFilter.mode_cell));
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun     return ret;
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun 
calibSaveToFile(char * iqFile,CamCalibDbContext_t * calib)226*4882a593Smuzhiyun static bool calibSaveToFile(char* iqFile, CamCalibDbContext_t* calib)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun     int fd;
229*4882a593Smuzhiyun     bool ret = true;
230*4882a593Smuzhiyun     char path[CALIBDB_PATH_LEN];
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun     getFilePathName(iqFile, path);
233*4882a593Smuzhiyun     fd = open(path, O_CREAT | O_TRUNC | O_RDWR | O_SYNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
234*4882a593Smuzhiyun     if (fd < 0) {
235*4882a593Smuzhiyun         ret = false;
236*4882a593Smuzhiyun         LOGE("open %s failed!", path);
237*4882a593Smuzhiyun     } else {
238*4882a593Smuzhiyun         lseek(fd, 0, SEEK_SET);
239*4882a593Smuzhiyun         if (persistCalib(fd, calib)) {
240*4882a593Smuzhiyun             LOGE("write %s failed!\n", path);
241*4882a593Smuzhiyun             remove(path);
242*4882a593Smuzhiyun             ret = false;
243*4882a593Smuzhiyun         }
244*4882a593Smuzhiyun         close(fd);
245*4882a593Smuzhiyun     }
246*4882a593Smuzhiyun     return ret;
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun 
calibReadFromFile(char * iqFile,CamCalibDbContext_t * calib)249*4882a593Smuzhiyun static bool calibReadFromFile(char* iqFile, CamCalibDbContext_t* calib)
250*4882a593Smuzhiyun {
251*4882a593Smuzhiyun     int fd;
252*4882a593Smuzhiyun     bool ret = true;
253*4882a593Smuzhiyun     char path[CALIBDB_PATH_LEN];
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun     getFilePathName(iqFile, path);
256*4882a593Smuzhiyun     fd = open(path, O_RDONLY | O_SYNC);
257*4882a593Smuzhiyun     if (fd < 0) {
258*4882a593Smuzhiyun         ret = false;
259*4882a593Smuzhiyun     } else {
260*4882a593Smuzhiyun         lseek(fd, 0, SEEK_SET);
261*4882a593Smuzhiyun         if (reconstructCalib(fd, calib)) {
262*4882a593Smuzhiyun             LOGE("read %s failed!\n", path);
263*4882a593Smuzhiyun             ret = false;
264*4882a593Smuzhiyun         }
265*4882a593Smuzhiyun         close(fd);
266*4882a593Smuzhiyun     }
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun     return ret;
269*4882a593Smuzhiyun }
270*4882a593Smuzhiyun 
_calc_checksum(CamCalibDbContext_t * CalibDb)271*4882a593Smuzhiyun static uint32_t _calc_checksum(CamCalibDbContext_t *CalibDb) {
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun     uint32_t checkSum = 0;
274*4882a593Smuzhiyun     uint32_t i = 0;
275*4882a593Smuzhiyun     uint32_t *data = NULL;
276*4882a593Smuzhiyun     uint32_t size = 0;
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun     if (!CHECK_ISP_HW_V20()) {
279*4882a593Smuzhiyun         LOGE("only support isp20 calibv1 !");
280*4882a593Smuzhiyun         return -1;
281*4882a593Smuzhiyun     }
282*4882a593Smuzhiyun     CamCalibDbContextIsp20_t* pCalibDb = TO_CALIBDBV1_ISP20(CalibDb);
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun #define CALC_SUM(data,size) \
285*4882a593Smuzhiyun     for(i = 0; i < sizeof(size) / 4; i++) { \
286*4882a593Smuzhiyun         checkSum += *data; \
287*4882a593Smuzhiyun         data++; \
288*4882a593Smuzhiyun     }
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun     // header
291*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->header);
292*4882a593Smuzhiyun     size = sizeof(CalibDb_Header_t) ;
293*4882a593Smuzhiyun     CALC_SUM(data, size);
294*4882a593Smuzhiyun #if 0 // TODO Merge
295*4882a593Smuzhiyun     // awb
296*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->awb);
297*4882a593Smuzhiyun     size = sizeof(CalibDb_Awb_Para_t) ;
298*4882a593Smuzhiyun     CALC_SUM(data, size);
299*4882a593Smuzhiyun #endif
300*4882a593Smuzhiyun     // lut3d
301*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->lut3d);
302*4882a593Smuzhiyun     size = sizeof(CalibDb_Lut3d_t) ;
303*4882a593Smuzhiyun     CALC_SUM(data, size);
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun     // aec
306*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->aec);
307*4882a593Smuzhiyun     size = sizeof(CalibDb_Aec_Para_t) ;
308*4882a593Smuzhiyun     CALC_SUM(data, size);
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun     // af
311*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->af);
312*4882a593Smuzhiyun     size = sizeof(CalibDb_AF_t) ;
313*4882a593Smuzhiyun     CALC_SUM(data, size);
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun     // ahdr
316*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->atmo);
317*4882a593Smuzhiyun     size = sizeof(CalibDb_Atmo_Para_t) ;
318*4882a593Smuzhiyun     CALC_SUM(data, size);
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun     // ahdr
321*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->amerge);
322*4882a593Smuzhiyun     size = sizeof(CalibDb_Amerge_Para_t) ;
323*4882a593Smuzhiyun     CALC_SUM(data, size);
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun     // ablc
326*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->blc);
327*4882a593Smuzhiyun     size = sizeof(CalibDb_Blc_t) ;
328*4882a593Smuzhiyun     CALC_SUM(data, size);
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun     // dpcc
331*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->dpcc);
332*4882a593Smuzhiyun     size = sizeof(CalibDb_Dpcc_t) ;
333*4882a593Smuzhiyun     CALC_SUM(data, size);
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun     // bayer nr
336*4882a593Smuzhiyun     data = (uint32_t*)(pCalibDb->bayerNr.mode_cell);
337*4882a593Smuzhiyun     size = pCalibDb->bayerNr.mode_num * sizeof(CalibDb_BayerNr_ModeCell_t);
338*4882a593Smuzhiyun     CALC_SUM(data, size);
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun     // lsc
341*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->lsc.aLscCof);
342*4882a593Smuzhiyun     size = sizeof(CalibDb_AlscCof_t);
343*4882a593Smuzhiyun     CALC_SUM(data, size);
344*4882a593Smuzhiyun     data = (uint32_t*)(pCalibDb->lsc.tableAll);
345*4882a593Smuzhiyun     size = pCalibDb->lsc.tableAllNum * sizeof(CalibDb_LscTableProfile_t);
346*4882a593Smuzhiyun     CALC_SUM(data, size);
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun     // rkdm
349*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->dm);
350*4882a593Smuzhiyun     size = sizeof(CalibDb_RKDM_t) ;
351*4882a593Smuzhiyun     CALC_SUM(data, size);
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun     // ccm
354*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->ccm);
355*4882a593Smuzhiyun     size = sizeof(CalibDb_Ccm_t) ;
356*4882a593Smuzhiyun     CALC_SUM(data, size);
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun     // uvnr
359*4882a593Smuzhiyun     data = (uint32_t*)(pCalibDb->uvnr.mode_cell);
360*4882a593Smuzhiyun     size = pCalibDb->uvnr.mode_num * sizeof(CalibDb_UVNR_ModeCell_t);
361*4882a593Smuzhiyun     CALC_SUM(data, size);
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun     // gamma
364*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->gamma);
365*4882a593Smuzhiyun     size = sizeof(CalibDb_Gamma_t ) ;
366*4882a593Smuzhiyun     CALC_SUM(data, size);
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun     // ynr
369*4882a593Smuzhiyun     data = (uint32_t*)(pCalibDb->ynr.mode_cell);
370*4882a593Smuzhiyun     size = pCalibDb->ynr.mode_num * sizeof(CalibDb_YNR_ModeCell_t);
371*4882a593Smuzhiyun     CALC_SUM(data, size);
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun     // gamma
374*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->gic);
375*4882a593Smuzhiyun     size = sizeof(CalibDb_Gic_t) ;
376*4882a593Smuzhiyun     CALC_SUM(data, size);
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun     // mfnr
379*4882a593Smuzhiyun     data = (uint32_t*)(pCalibDb->mfnr.mode_cell);
380*4882a593Smuzhiyun     size = pCalibDb->mfnr.mode_num * sizeof(CalibDb_MFNR_ModeCell_t);
381*4882a593Smuzhiyun     CALC_SUM(data, size);
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun     // sharp
384*4882a593Smuzhiyun     data = (uint32_t*)(pCalibDb->sharp.mode_cell);
385*4882a593Smuzhiyun     size = pCalibDb->sharp.mode_num * sizeof(CalibDb_Sharp_ModeCell_t);
386*4882a593Smuzhiyun     CALC_SUM(data, size);
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun     // edgefilter
389*4882a593Smuzhiyun     data = (uint32_t*)(pCalibDb->edgeFilter.mode_cell);
390*4882a593Smuzhiyun     size = pCalibDb->edgeFilter.mode_num * sizeof(CalibDb_EdgeFilter_ModeCell_t);
391*4882a593Smuzhiyun     CALC_SUM(data, size);
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun     // dehaze
394*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->dehaze);
395*4882a593Smuzhiyun     size = sizeof(CalibDb_Dehaze_t) ;
396*4882a593Smuzhiyun     CALC_SUM(data, size);
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun     // fec
399*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->afec);
400*4882a593Smuzhiyun     size = sizeof(CalibDb_FEC_t );
401*4882a593Smuzhiyun     CALC_SUM(data, size);
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun     // ldch
404*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->aldch);
405*4882a593Smuzhiyun     size = sizeof(CalibDb_LDCH_t );
406*4882a593Smuzhiyun     CALC_SUM(data, size);
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun     // lumaDetect
409*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->lumaDetect);
410*4882a593Smuzhiyun     size = sizeof(CalibDb_LUMA_DETECT_t);
411*4882a593Smuzhiyun     CALC_SUM(data, size);
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun     // orb
414*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->orb);
415*4882a593Smuzhiyun     size = sizeof(CalibDb_ORB_t);
416*4882a593Smuzhiyun     CALC_SUM(data, size);
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun     // sensor
419*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->sensor);
420*4882a593Smuzhiyun     size = sizeof(CalibDb_Sensor_Para_t);
421*4882a593Smuzhiyun     CALC_SUM(data, size);
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun     // module
424*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->module);
425*4882a593Smuzhiyun     size = sizeof(CalibDb_Module_Info_t );
426*4882a593Smuzhiyun     CALC_SUM(data, size);
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun     // cpsl
429*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->cpsl);
430*4882a593Smuzhiyun     size = sizeof(CalibDb_Cpsl_t );
431*4882a593Smuzhiyun     CALC_SUM(data, size);
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun     // colorAsGrey
434*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->colorAsGrey);
435*4882a593Smuzhiyun     size = sizeof(CalibDb_ColorAsGrey_t );
436*4882a593Smuzhiyun     CALC_SUM(data, size);
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun     // ie
439*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->ie);
440*4882a593Smuzhiyun     size = sizeof(CalibDb_IE_t);
441*4882a593Smuzhiyun     CALC_SUM(data, size);
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun     // sysContrl
444*4882a593Smuzhiyun     data = (uint32_t*)(&pCalibDb->sysContrl);
445*4882a593Smuzhiyun     size = sizeof(CalibDb_System_t);
446*4882a593Smuzhiyun     CALC_SUM(data, size);
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun     LOGD("%s(%d): iq data checksum:%u \n", __FUNCTION__, __LINE__, checkSum);
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun     LOGD("%s(%d): exit\n", __FUNCTION__, __LINE__);
451*4882a593Smuzhiyun     return checkSum;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun 
createCalibDb(char * iqFile)454*4882a593Smuzhiyun CamCalibDbContext_t* RkAiqCalibDb::createCalibDb(char* iqFile)
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun     map<string, CamCalibDbContext_t*>::iterator it;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun     string str(iqFile);
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun     it = mCalibDbsMap.find(str);
461*4882a593Smuzhiyun     if (it != mCalibDbsMap.end()) {
462*4882a593Smuzhiyun         LOGD("use cached calibdb for %s!", iqFile);
463*4882a593Smuzhiyun         return it->second;
464*4882a593Smuzhiyun     } else {
465*4882a593Smuzhiyun         CamCalibDbContext_t *pCalibDb = calibdbV1_ctx_new();
466*4882a593Smuzhiyun         if (!pCalibDb)
467*4882a593Smuzhiyun             LOGE("not support isp hw ver %d", g_rkaiq_isp_hw_ver);
468*4882a593Smuzhiyun         if (pCalibDb) {
469*4882a593Smuzhiyun             initCalibDb(pCalibDb);
470*4882a593Smuzhiyun             if (0 == access(iqFile, F_OK)) {
471*4882a593Smuzhiyun                 RkAiqCalibParser  parser(pCalibDb);
472*4882a593Smuzhiyun                 mMutex.lock();
473*4882a593Smuzhiyun                 bool ret = parser.doParse(iqFile);
474*4882a593Smuzhiyun                 mMutex.unlock();
475*4882a593Smuzhiyun                 if (ret) {
476*4882a593Smuzhiyun                     uint32_t magicCode = calib_check_calc_checksum();
477*4882a593Smuzhiyun                     if (magicCode != ((CalibDb_Header_t*)pCalibDb)->magic_code)
478*4882a593Smuzhiyun                         LOGW("magic code is not matched! calculated:%u, readed:%u", magicCode,
479*4882a593Smuzhiyun                              ((CalibDb_Header_t*)pCalibDb)->magic_code);
480*4882a593Smuzhiyun                     mCalibDbsMap[str] = pCalibDb;
481*4882a593Smuzhiyun                     LOGD("create calibdb from %s success.", iqFile);
482*4882a593Smuzhiyun                     _calc_checksum(pCalibDb);
483*4882a593Smuzhiyun                     return pCalibDb;
484*4882a593Smuzhiyun                 } else {
485*4882a593Smuzhiyun                     LOGE("parse %s failed.", iqFile);
486*4882a593Smuzhiyun                 }
487*4882a593Smuzhiyun             } else if(isDataBinExist(iqFile)) {
488*4882a593Smuzhiyun                 if (calibReadFromFile(iqFile, pCalibDb)) {
489*4882a593Smuzhiyun                     uint32_t magicCode = calib_check_calc_checksum();
490*4882a593Smuzhiyun                     if (magicCode != ((CalibDb_Header_t*)pCalibDb)->magic_code)
491*4882a593Smuzhiyun                         LOGE("magic code is not matched! calculated:%u, readed:%u", magicCode,
492*4882a593Smuzhiyun                              ((CalibDb_Header_t*)pCalibDb)->magic_code);
493*4882a593Smuzhiyun                     mCalibDbsMap[str] = pCalibDb;
494*4882a593Smuzhiyun                     LOGD("get calibdb from bin success.");
495*4882a593Smuzhiyun                     _calc_checksum(pCalibDb);
496*4882a593Smuzhiyun                     return pCalibDb;
497*4882a593Smuzhiyun                 } else {
498*4882a593Smuzhiyun                     LOGE("get calibdb from bin failed.");
499*4882a593Smuzhiyun                 }
500*4882a593Smuzhiyun             } else {
501*4882a593Smuzhiyun                 LOGE("calibdb %s and bin are all not exist!", iqFile);
502*4882a593Smuzhiyun             }
503*4882a593Smuzhiyun         } else {
504*4882a593Smuzhiyun             LOGE("alloc calibdb memory failed.");
505*4882a593Smuzhiyun         }
506*4882a593Smuzhiyun     }
507*4882a593Smuzhiyun     return NULL;
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun 
generateCalibDb(char * iqFileRef,char * iqFileOutput,CamCalibDbContext_t * pCalibDb)510*4882a593Smuzhiyun bool RkAiqCalibDb::generateCalibDb(char* iqFileRef, char* iqFileOutput, CamCalibDbContext_t* pCalibDb)
511*4882a593Smuzhiyun {
512*4882a593Smuzhiyun     //map<string, CamCalibDbContext_t*>::iterator it;
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun     string str(iqFileRef);
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun     //it = mCalibDbsMap.find(str);
517*4882a593Smuzhiyun     if (pCalibDb) {
518*4882a593Smuzhiyun         RkAiqCalibParser  parser(pCalibDb);
519*4882a593Smuzhiyun         if (parser.doGenerate(iqFileRef, iqFileOutput)) {
520*4882a593Smuzhiyun             mCalibDbsMap[str] = pCalibDb;
521*4882a593Smuzhiyun             LOGD("generate calibdb from %s to %s success.", iqFileRef, iqFileOutput);
522*4882a593Smuzhiyun             return true;
523*4882a593Smuzhiyun         }
524*4882a593Smuzhiyun         else {
525*4882a593Smuzhiyun             LOGE("generate %s to %s failed.", iqFileRef, iqFileOutput);
526*4882a593Smuzhiyun         }
527*4882a593Smuzhiyun     }
528*4882a593Smuzhiyun     else {
529*4882a593Smuzhiyun         LOGE("alloc generate memory failed.");
530*4882a593Smuzhiyun     }
531*4882a593Smuzhiyun     return false;
532*4882a593Smuzhiyun }
533*4882a593Smuzhiyun 
releaseCalibDb()534*4882a593Smuzhiyun void RkAiqCalibDb::releaseCalibDb()
535*4882a593Smuzhiyun {
536*4882a593Smuzhiyun     std::map<string, CamCalibDbContext_t*>::iterator it;
537*4882a593Smuzhiyun     for (it = mCalibDbsMap.begin(); it != mCalibDbsMap.end(); it++) {
538*4882a593Smuzhiyun         CamCalibDbContext_t *pCalibDb = it->second;
539*4882a593Smuzhiyun         if(pCalibDb) {
540*4882a593Smuzhiyun             CalibDb_Lsc_t* lsc =
541*4882a593Smuzhiyun                 (CalibDb_Lsc_t*)CALIBDB_GET_MODULE_PTR(pCalibDb, lsc);
542*4882a593Smuzhiyun             if(lsc && lsc->tableAll != NULL) {
543*4882a593Smuzhiyun                 free(lsc->tableAll);
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun             }
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun             list_head* list = (list_head*)CALIBDB_GET_MODULE_PTR(pCalibDb, awb_adjust_para);
548*4882a593Smuzhiyun             if (list)
549*4882a593Smuzhiyun                 clear_list(list);
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun             list = (list_head*)CALIBDB_GET_MODULE_PTR(pCalibDb, awb_calib_para_v200);
552*4882a593Smuzhiyun             if (list)
553*4882a593Smuzhiyun                 clear_list(list);
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun             list = (list_head*)CALIBDB_GET_MODULE_PTR(pCalibDb, awb_calib_para_v201);
556*4882a593Smuzhiyun             if (list)
557*4882a593Smuzhiyun                 clear_list(list);
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun             if(CHECK_ISP_HW_V21()) {
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun                 list_head* ae_list = (list_head*)CALIBDB_GET_MODULE_PTR(pCalibDb, ae_calib_para);
562*4882a593Smuzhiyun                 if (ae_list)
563*4882a593Smuzhiyun                     clear_list(ae_list);
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun                 ae_list = (list_head*)CALIBDB_GET_MODULE_PTR(pCalibDb, ae_tuning_para);
566*4882a593Smuzhiyun                 if (ae_list)
567*4882a593Smuzhiyun                     clear_list(ae_list);
568*4882a593Smuzhiyun             }
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun             LOGI("releaseCalibDb!");
571*4882a593Smuzhiyun             CalibDb_BayerNr_2_t* bayerNr =
572*4882a593Smuzhiyun                 (CalibDb_BayerNr_2_t*)CALIBDB_GET_MODULE_PTR(pCalibDb, bayerNr);
573*4882a593Smuzhiyun             if(bayerNr && bayerNr->mode_cell != NULL) {
574*4882a593Smuzhiyun                 free(bayerNr->mode_cell);
575*4882a593Smuzhiyun                 bayerNr->mode_cell = NULL;
576*4882a593Smuzhiyun                 bayerNr->mode_num = 0;
577*4882a593Smuzhiyun             }
578*4882a593Smuzhiyun             CalibDb_UVNR_2_t *uvnr =
579*4882a593Smuzhiyun                 (CalibDb_UVNR_2_t*)CALIBDB_GET_MODULE_PTR(pCalibDb, uvnr);
580*4882a593Smuzhiyun             if(uvnr && uvnr->mode_cell != NULL) {
581*4882a593Smuzhiyun                 free(uvnr->mode_cell);
582*4882a593Smuzhiyun                 uvnr->mode_cell = NULL;
583*4882a593Smuzhiyun                 uvnr->mode_num = 0;
584*4882a593Smuzhiyun             }
585*4882a593Smuzhiyun             CalibDb_YNR_2_t *ynr =
586*4882a593Smuzhiyun                 (CalibDb_YNR_2_t*)CALIBDB_GET_MODULE_PTR(pCalibDb, ynr);
587*4882a593Smuzhiyun             if(ynr && ynr->mode_cell != NULL) {
588*4882a593Smuzhiyun                 free(ynr->mode_cell);
589*4882a593Smuzhiyun                 ynr->mode_cell = NULL;
590*4882a593Smuzhiyun                 ynr->mode_num = 0;
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun             }
593*4882a593Smuzhiyun             CalibDb_MFNR_2_t *mfnr =
594*4882a593Smuzhiyun                 (CalibDb_MFNR_2_t*)CALIBDB_GET_MODULE_PTR(pCalibDb, mfnr);
595*4882a593Smuzhiyun             if(mfnr && mfnr->mode_cell != NULL) {
596*4882a593Smuzhiyun                 free(mfnr->mode_cell);
597*4882a593Smuzhiyun                 mfnr->mode_cell = NULL;
598*4882a593Smuzhiyun                 mfnr->mode_num = 0;
599*4882a593Smuzhiyun             }
600*4882a593Smuzhiyun             CalibDb_Sharp_2_t *sharp =
601*4882a593Smuzhiyun                 (CalibDb_Sharp_2_t*)CALIBDB_GET_MODULE_PTR(pCalibDb, sharp);
602*4882a593Smuzhiyun             if(sharp && sharp->mode_cell != NULL) {
603*4882a593Smuzhiyun                 free(sharp->mode_cell);
604*4882a593Smuzhiyun                 sharp->mode_cell = NULL;
605*4882a593Smuzhiyun                 sharp->mode_num = 0;
606*4882a593Smuzhiyun             }
607*4882a593Smuzhiyun             CalibDb_EdgeFilter_2_t *edgeFilter =
608*4882a593Smuzhiyun                 (CalibDb_EdgeFilter_2_t*)CALIBDB_GET_MODULE_PTR(pCalibDb, edgeFilter);
609*4882a593Smuzhiyun             if(edgeFilter && edgeFilter->mode_cell != NULL) {
610*4882a593Smuzhiyun                 free(edgeFilter->mode_cell);
611*4882a593Smuzhiyun                 edgeFilter->mode_cell = NULL;
612*4882a593Smuzhiyun                 edgeFilter->mode_num = 0;
613*4882a593Smuzhiyun             }
614*4882a593Smuzhiyun             calibdbV1_ctx_delete(pCalibDb);
615*4882a593Smuzhiyun         }
616*4882a593Smuzhiyun     }
617*4882a593Smuzhiyun     mCalibDbsMap.clear();
618*4882a593Smuzhiyun }
619*4882a593Smuzhiyun 
getCalibDb(char * iqFile)620*4882a593Smuzhiyun CamCalibDbContext_t* RkAiqCalibDb::getCalibDb(char* iqFile)
621*4882a593Smuzhiyun {
622*4882a593Smuzhiyun     std::map<string, CamCalibDbContext_t*>::iterator it;
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun     std::string str(iqFile);
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun     it = mCalibDbsMap.find(str);
627*4882a593Smuzhiyun     if (it != mCalibDbsMap.end()) {
628*4882a593Smuzhiyun         return it->second;
629*4882a593Smuzhiyun     } else {
630*4882a593Smuzhiyun         LOGE("calibDb not found!");
631*4882a593Smuzhiyun         return NULL;
632*4882a593Smuzhiyun     }
633*4882a593Smuzhiyun }
634*4882a593Smuzhiyun 
createCalibDbBinFromXml(char * iqFile)635*4882a593Smuzhiyun void RkAiqCalibDb::createCalibDbBinFromXml(char* iqFile)
636*4882a593Smuzhiyun {
637*4882a593Smuzhiyun     CamCalibDbContext_t *pCalibDb = calibdbV1_ctx_new();
638*4882a593Smuzhiyun     if (pCalibDb) {
639*4882a593Smuzhiyun         if (0 == access(iqFile, F_OK)) {
640*4882a593Smuzhiyun             RkAiqCalibParser  parser(pCalibDb);
641*4882a593Smuzhiyun             if (parser.doParse(iqFile)) {
642*4882a593Smuzhiyun                 uint32_t magicCode = calib_check_calc_checksum();
643*4882a593Smuzhiyun                 if (magicCode != ((CalibDb_Header_t*)pCalibDb)->magic_code)
644*4882a593Smuzhiyun                     LOGW("magic code is not matched! calculated:%u, readed:%u", magicCode,
645*4882a593Smuzhiyun                          ((CalibDb_Header_t*)pCalibDb)->magic_code);
646*4882a593Smuzhiyun                 LOGI("create calibdb from %s success, magic code %u.", iqFile, magicCode);
647*4882a593Smuzhiyun                 if (calibSaveToFile(iqFile, pCalibDb))
648*4882a593Smuzhiyun                     LOGD("save to bin success.");
649*4882a593Smuzhiyun                 else
650*4882a593Smuzhiyun                     LOGE("save to bin failed.");
651*4882a593Smuzhiyun             } else {
652*4882a593Smuzhiyun                 LOGE("parse %s failed.", iqFile);
653*4882a593Smuzhiyun             }
654*4882a593Smuzhiyun         } else {
655*4882a593Smuzhiyun             LOGE("%s is not found!", iqFile);
656*4882a593Smuzhiyun         }
657*4882a593Smuzhiyun         calibdbV1_ctx_delete(pCalibDb);
658*4882a593Smuzhiyun     }
659*4882a593Smuzhiyun }
660*4882a593Smuzhiyun 
initCalibDb(CamCalibDbContext_t * pCalibDb)661*4882a593Smuzhiyun void RkAiqCalibDb::initCalibDb(CamCalibDbContext_t* pCalibDb)
662*4882a593Smuzhiyun {
663*4882a593Smuzhiyun     if (pCalibDb) {
664*4882a593Smuzhiyun         memset(pCalibDb, 0, calibdbV1_ctx_size(pCalibDb));
665*4882a593Smuzhiyun         CalibDb_cProc_t *cProc =
666*4882a593Smuzhiyun             (CalibDb_cProc_t *)CALIBDB_GET_MODULE_PTR(pCalibDb, cProc);
667*4882a593Smuzhiyun         /* initialize cproc */
668*4882a593Smuzhiyun         if (cProc) {
669*4882a593Smuzhiyun             cProc->enable = 1;
670*4882a593Smuzhiyun             cProc->brightness = 128;
671*4882a593Smuzhiyun             cProc->contrast = 128;
672*4882a593Smuzhiyun             cProc->saturation = 128;
673*4882a593Smuzhiyun             cProc->hue = 128;
674*4882a593Smuzhiyun         }
675*4882a593Smuzhiyun     }
676*4882a593Smuzhiyun }
parseXmlandWriteXml(char * iqFile)677*4882a593Smuzhiyun void RkAiqCalibDb::parseXmlandWriteXml(char* iqFile)
678*4882a593Smuzhiyun {
679*4882a593Smuzhiyun     CamCalibDbContext_t *pCalibDb = calibdbV1_ctx_new();
680*4882a593Smuzhiyun     if (pCalibDb) {
681*4882a593Smuzhiyun         if (0 == access(iqFile, F_OK)) {
682*4882a593Smuzhiyun             RkAiqCalibParser  parser(pCalibDb);
683*4882a593Smuzhiyun             if (parser.doParse(iqFile)) {
684*4882a593Smuzhiyun                 uint32_t magicCode = calib_check_calc_checksum();
685*4882a593Smuzhiyun                 if (magicCode != ((CalibDb_Header_t*)pCalibDb)->magic_code) {
686*4882a593Smuzhiyun                     LOGW("magic code is not matched! calculated:%u, readed:%u", magicCode,
687*4882a593Smuzhiyun                          ((CalibDb_Header_t*)pCalibDb)->magic_code);
688*4882a593Smuzhiyun                 } else {
689*4882a593Smuzhiyun                     printf("create calibdb from %s success, magic code %u.", iqFile, magicCode);
690*4882a593Smuzhiyun                     char iqFileOutput[CALIBDB_PATH_LEN];
691*4882a593Smuzhiyun                     getFilePathName2(iqFile, iqFileOutput);
692*4882a593Smuzhiyun                     parser.updateXmlParseReadWriteFlag(XML_PARSER_WRITE);
693*4882a593Smuzhiyun                     if (parser.doGenerate(iqFile, iqFileOutput)) {
694*4882a593Smuzhiyun                         string str(iqFile);
695*4882a593Smuzhiyun                         mCalibDbsMap[str] = pCalibDb;
696*4882a593Smuzhiyun                         LOGD("generate calibdb from %s to %s success.", iqFile, iqFileOutput);
697*4882a593Smuzhiyun                     }
698*4882a593Smuzhiyun                     else {
699*4882a593Smuzhiyun                         LOGE("generate %s to %s failed.", iqFile, iqFileOutput);
700*4882a593Smuzhiyun                     }
701*4882a593Smuzhiyun                 }
702*4882a593Smuzhiyun             } else {
703*4882a593Smuzhiyun                 LOGE("parse %s failed.", iqFile);
704*4882a593Smuzhiyun             }
705*4882a593Smuzhiyun         } else {
706*4882a593Smuzhiyun             LOGE("%s is not found!", iqFile);
707*4882a593Smuzhiyun         }
708*4882a593Smuzhiyun         calibdbV1_ctx_delete(pCalibDb);
709*4882a593Smuzhiyun     }
710*4882a593Smuzhiyun }
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun } //namespace RkCam
714*4882a593Smuzhiyun 
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun 
720*4882a593Smuzhiyun 
721