Android7.1 [Camera] cam_board.xml文件解析源代码分析(二)

        源码平台:rk3399

        该文件在hardware/rockchip/camera/CameraHal/CameraHal_Module.cpp 中的camera_get_number_of_cameras函数获取摄像头数量的时候会解析,camera_board_profiles::getInstance();

 770                                                                       
 771     memset(&camInfoTmp[0],0x00,sizeof(rk_cam_info_t));                
 772     memset(&camInfoTmp[1],0x00,sizeof(rk_cam_info_t));                
 773                                                                       
 774     profiles = camera_board_profiles::getInstance();                  
 775     nCamDev = profiles->mDevieVector.size();                          
 776     LOGE("board profiles cam num %d\n", nCamDev);                     
 777 //if uvc got 2 , ignore csi                                           

        camera_board_profiles::getInstance()在hardware/rockchip/camera/CameraHal/CameraHal_board_xml_parse.cpp

1061 } 
1062   
1063 camera_board_profiles* camera_board_profiles::getInstance()
1064 { 
1065     camera_board_profiles *profiles = createInstance();
1066   
1067     return profiles;
1068 } 
1069   

        接着看createInstance()

1003 camera_board_profiles* camera_board_profiles::createInstance()
1004 {
1005     FILE *fp = NULL;
1006 
1007     camera_board_profiles *profiles = new camera_board_profiles();
1008 
1009     fp = fopen(RK_BOARD_XML_PATH, "r");
1010     if(!fp){
1011         LOGD("This machine have not dvp/mipi camera!!\n");
1012         return profiles;
1013     }
1014 
1015     LOGD("open xml file(%s) success\n", RK_BOARD_XML_PATH);
1016 
1017     XML_Parser parser = XML_ParserCreate(NULL);
1018     if(parser==NULL){
1019         ALOGE("XML_ParserCreate failed\n");
1020         return NULL;
1021     }
1022 
1023     XML_SetUserData(parser, profiles);
1024     XML_SetElementHandler(parser, StartElementHandler, NULL);
1025 
1026     const int BUFF_SIZE = 512;
1027     for (;;) {
1028         void *buff = ::XML_GetBuffer(parser, BUFF_SIZE);
1029         if (buff == NULL) {
1030             ALOGE("failed to in call to XML_GetBuffer()");
1031             goto exit;
1032         }
1033 
1034         int bytes_read = ::fread(buff, 1, BUFF_SIZE, fp);
1035         if (bytes_read < 0) {
1036             ALOGE("failed in call to read");
1037             goto exit;
1038         }
1039 
1040         int res = XML_ParseBuffer(parser, bytes_read, bytes_read == 0);
1041         if(res!=1){
1042             ALOGE("XML_ParseBuffer error or susppend (%d)\n", res);
1043         }
1044 
1045         if (bytes_read == 0) break;  // done parsing the xml file
1046     }
1047 
1048 exit:
1049     XML_ParserFree(parser);
1050     fclose(fp);
1051 
1052     size_t nCamDev2 = profiles->mDevieVector.size();
1053     ALOGD("number of camdevice (%d)\n", nCamDev2);
1054 
1055     if (nCamDev2>0) {
1056         size_t nDVnum2 = profiles->mCurDevice->mSoftInfo.mDV_vector.size();
1057         ALOGD("now DV size(%d)\n", nDVnum2);
1058     }
1059     return profiles;
1060 
1061 }

         camera_board_profiles结构体定义在./CameraHal_board_xml_parse.h,这个头文件不仅定义了cam_board.xml文件各个标签项的解析函数,还有注册,loadsensor等等很多函数.

         fp = fopen(RK_BOARD_XML_PATH, "r");函数打开这个cam_board.xml文件,然后设置parser,XML_SetUserData,XML_SetElementHandler,其中XML_SetElementHandler设置的StartElementHandler就是具体解析每一个标签的执行者.

         然后就开始来for的死循环,从文件中读取元素到XML_GetBuffer里面,然后ElementHandler去处理,

         进入StartElementHandler函数看看具体它是怎么解析,我们按程序执行顺序看这个函数   

 883     camera_board_profiles *pCamInfoProfiles = (camera_board_profiles *) userData;
 884     rk_cam_total_info *pCamInfo = pCamInfoProfiles->mCurDevice;
 885     int support = 0;

        pCamInfoProfiles用来保存解析后的结果,返回给调用者.

        然后就开始解析来,先判断是不是BoardXmlVersion标签,这里获取版本信息

 887     if(strcmp(name,"BoardXmlVersion")==0){
 888         int highBit = 0;
 889         int middleBit = 0;
 890         int lowBit = 0;
 891         sscanf(atts[1], "v%x.%x.%x", &highBit, &middleBit, &lowBit);
 892         pCamInfoProfiles->mBoardXmlVersion = ( (highBit&0xff)<<16 ) + ( (middleBit&0xff)<<8 ) + (lowBit&0xff) ;
 893         ALOGD("\n\n\n Cam_board.xml Version Check: \n");
 894         ALOGD("    /etc/cam_board.xml : %s\n",atts[1]);
 895         ALOGD("    CameraHal_board_xml_parser: v%d.%d.%d\n",
 896             (ConfigBoardXmlVersion&0xff0000)>>16,
 897             (ConfigBoardXmlVersion&0xff00)>>8,
 898             ConfigBoardXmlVersion&0xff);
 899     }

           然后

 912     if(strcmp(name,"CamDevie")==0){
 913         rk_cam_total_info* pNewCamInfo = new rk_cam_total_info();
 914         if(pNewCamInfo){
 915             pCamInfoProfiles->mCurDevice= pNewCamInfo;
 916             pCamInfoProfiles->mDevieVector.add(pNewCamInfo);
 917             pNewCamInfo->mDeviceIndex = (pCamInfoProfiles->mDevieVector.size()) - 1;
 918             memset(pNewCamInfo->mHardInfo.mSensorInfo.mLensName,0,CAMSYS_NAME_LEN);
 919             memset(pNewCamInfo->mHardInfo.mSensorInfo.mSensorGpioPwdn.name,0,CAMSYS_NAME_LEN);
 920             memset(pNewCamInfo->mHardInfo.mSensorInfo.mSensorGpioPwdn0.name,0,CAMSYS_NAME_LEN);
 921             memset(pNewCamInfo->mHardInfo.mSensorInfo.mSensorGpioPwdn1.name,0,CAMSYS_NAME_LEN);
 922         }else{
 923             ALOGE("%s(%d): Warnimg camdevice malloc fail! \n", __FUNCTION__,__LINE__);
 924         }
 925     }else if (strstr(name, "Sensor")) {
 926         ParserSensorInfo(name, atts, userData);
 927     } else if (strstr(name, "VCM")) {
 928         ParserVCMInfo(name, atts, userData);
 929     } else if (strstr(name,"Flash")){
 930         ParserFlashInfo(name, atts, userData);
 931     } else if (strstr(name,"AWB")){
 932         ParserAwbConfig(name, atts, userData);
 933     } else if (strstr(name,"Sence")){
 934         ParserSenceConfig(name, atts, userData);
 935     } else if (strstr(name,"Effect")){
 936         ParserEffectConfig(name, atts, userData);
 937     } else if (strstr(name,"Focus")){
 938         ParserFocusConfig(name, atts, userData);
 939     } else if (strstr(name,"Anti_Banding")){
 940         ParserAntiBandingConfig(name, atts, userData);
 941     } else if (strstr(name,"HDR")){
 942         support = atoi(atts[1]);
 943         pCamInfo->mSoftInfo.mHDRConfig = support;
 944         ALOGD("%s(%d): HDR(%d)! \n", __FUNCTION__,__LINE__,support);
 945     } else if (strstr(name,"ZSL")){
 946         support = atoi(atts[1]);
 947         pCamInfo->mSoftInfo.mZSLConfig= support;
 948         ALOGD("%s(%d): ZSL(%d)! \n", __FUNCTION__,__LINE__,support);
 949     } else if (strstr(name,"DigitalZoom")){
 950         support = atoi(atts[1]);
 951         pCamInfo->mSoftInfo.mZoomConfig= support;
 952         ALOGD("%s(%d): zoom(%d)! \n", __FUNCTION__,__LINE__,support);
 953     } else if (strstr(name,"PreCproc")){
 954         pCamInfo->mSoftInfo.mPreCprocConfig.mSupported = (atoi(atts[1]) == 1) ? true:false;
 955         pCamInfo->mSoftInfo.mPreCprocConfig.mContrast = atof(atts[3]);
 956         pCamInfo->mSoftInfo.mPreCprocConfig.mSaturation = atof(atts[5]);
 957         pCamInfo->mSoftInfo.mPreCprocConfig.mHue= atof(atts[7]);
 958         pCamInfo->mSoftInfo.mPreCprocConfig.mBrightness = atoi(atts[9]);
 959         ALOGD("%s(%d): PreCproc support %d(contrast:%f,saturation:%f,hue:%f,brightness:%d)! \n",
 960                 __FUNCTION__,__LINE__,atoi(atts[1]),atof(atts[3]),atof(atts[5]),atof(atts[7]),atoi(atts[9]));
 961     } else if (strstr(name,"CapCproc")){
 962         pCamInfo->mSoftInfo.mCapCprocConfig.mSupported = (atoi(atts[1]) == 1) ? true:false;
 963         pCamInfo->mSoftInfo.mCapCprocConfig.mContrast = atof(atts[3]);
 964         pCamInfo->mSoftInfo.mCapCprocConfig.mSaturation = atof(atts[5]);
 965         pCamInfo->mSoftInfo.mCapCprocConfig.mHue= atof(atts[7]);
 966         pCamInfo->mSoftInfo.mCapCprocConfig.mBrightness = atoi(atts[9]);
 967         ALOGD("%s(%d): CapCproc support %d(contrast:%f,saturation:%f,hue:%f,brightness:%d)! \n",
 968                 __FUNCTION__,__LINE__,atoi(atts[1]),atof(atts[3]),atof(atts[5]),atof(atts[7]),atoi(atts[9]));
 969     } else if (strstr(name,"Gammaout")){
 970         pCamInfo->mSoftInfo.mGammaOutConfig.mSupported = (atoi(atts[1]) == 1) ? true:false;
 971         pCamInfo->mSoftInfo.mGammaOutConfig.mGamma= atof(atts[3]);
 972         pCamInfo->mSoftInfo.mGammaOutConfig.mOffSet= atoi(atts[5]);
 973         ALOGD("%s(%d): Gammaout support %d(mGamma:%f,mOffSet:%d)! \n", __FUNCTION__,__LINE__,atoi(atts[1]),atof(atts[3]),atoi(atts[5]));
 974     } else if (strstr(name,"FaceDetect")){
 975         support = atoi(atts[1]);
 976         pCamInfo->mSoftInfo.mFaceDetctConfig.mFaceDetectSupport = support;
 977         pCamInfo->mSoftInfo.mFaceDetctConfig.mFaceMaxNum = atoi(atts[3]);
 978         ALOGD("%s(%d): face detect config(%d),max face num is (%d)! \n", __FUNCTION__,__LINE__,support,atoi(atts[3]));
 979     } else if (strstr(name,"PreviewSize")){
 980         pCamInfo->mSoftInfo.mPreviewWidth = atoi(atts[1]);
 981         pCamInfo->mSoftInfo.mPreviewHeight = atoi(atts[3]);

        这个函数就很长来,具体就是解析每一个元素,比如对比字符串含Sensor的标签,就调用ParserSensorInfo解析这一类的标签,如果是Flash的标签,就调用ParserFlashInfo解析这一类标签.

        看看ParseSensorInfo函数

 162 void camera_board_profiles::ParserSensorInfo(const char *name, const  char **atts, void *userData)
 163 {
 164     camera_board_profiles *pCamInfoProfiles = (camera_board_profiles *) userData;
 165     rk_cam_total_info *pCamInfo = pCamInfoProfiles->mCurDevice;
 166     rk_sensor_info *pSensorInfo = &(pCamInfo->mHardInfo.mSensorInfo);
 167     int result;
 168     if (strcmp(name, "SensorName")==0) {
 169         strlcpy(pSensorInfo->mSensorName, atts[1], sizeof(pSensorInfo->mSensorName));
 170         ALOGD("%s(%d): SensorName(%s)\n", __FUNCTION__, __LINE__, pSensorInfo->mSensorName);
 171     }else if (strcmp(name, "ModuleName")==0) {
 172         strlcpy(pSensorInfo->mModuleName, atts[1], sizeof(pSensorInfo->mModuleName));
 173         ALOGD("%s(%d): ModuleName(%s)\n", __FUNCTION__, __LINE__, pSensorInfo->mModuleName);
 174     }else if (strcmp(name, "SensorLens")==0) {
 175         strlcpy(pSensorInfo->mLensName, atts[1], sizeof(pSensorInfo->mLensName));
 176         ALOGD("%s(%d): lensName(%s)\n", __FUNCTION__, __LINE__, pSensorInfo->mLensName);
 177     } else if (strcmp(name, "SensorDevID")==0) {
 178         ALOGD("%s(%d): SensorDevID(%s)\n", __FUNCTION__, __LINE__, atts[1]);
 179         if(strcmp("CAMSYS_DEVID_SENSOR_1A", atts[1])==0){
 180             pSensorInfo->mCamDevid = CAMSYS_DEVID_SENSOR_1A;
 181         }else if(strcmp("CAMSYS_DEVID_SENSOR_1B", atts[1])==0){
 182             pSensorInfo->mCamDevid = CAMSYS_DEVID_SENSOR_1B;
 183         }else if(strcmp("CAMSYS_DEVID_SENSOR_2", atts[1])==0){
 184             pSensorInfo->mCamDevid = CAMSYS_DEVID_SENSOR_2;
 185         }else{
 186             pSensorInfo->mCamDevid = 0;
 187             ALOGD("%s(%d): SensorDevID(%s) don't support\n", __FUNCTION__, __LINE__, atts[1]);
 188         }
 189         ALOGD("%s(%d): SensorDevID(%d)\n", __FUNCTION__, __LINE__, pSensorInfo->mCamDevid);
 190     } else if (strcmp(name,"SensorHostDevID")==0){
 191         ALOGD("%s(%d): SensorHostDevID(%s)\n", __FUNCTION__, __LINE__, atts[1]);
 192         if(strcmp("CAMSYS_DEVID_MARVIN", atts[1])==0){
 193             pSensorInfo->mHostDevid= CAMSYS_DEVID_MARVIN;
 194             strlcpy(pSensorInfo->mCamsysDevPath, "/dev/camsys_marvin", sizeof(pSensorInfo->mCamsysDevPath));
 195         }else if(strcmp("CAMSYS_DEVID_CIF_0", atts[1])==0){
 196             pSensorInfo->mHostDevid = CAMSYS_DEVID_CIF_0;
 197             strlcpy(pSensorInfo->mCamsysDevPath, "/dev/camsys_cif0", sizeof(pSensorInfo->mCamsysDevPath));
 198         }else if(strcmp("CAMSYS_DEVID_CIF_1", atts[1])==0){
 199             pSensorInfo->mHostDevid = CAMSYS_DEVID_CIF_1;
 200             strlcpy(pSensorInfo->mCamsysDevPath, "/dev/camsys_cif1", sizeof(pSensorInfo->mCamsysDevPath));

         具体的解析方法就是对比每一个元素的名称,然后将对于的元素的值保存到pSensorInfo里面.

猜你喜欢

转载自blog.csdn.net/kiazhu/article/details/84631538