/* * Copyright (c) 2019 Rockchip Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include "MediaInfo.h" namespace RkRawStream { int8_t pixFmt2Bpp(uint32_t pixFmt) { int8_t bpp; switch (pixFmt) { case V4L2_PIX_FMT_SBGGR8: case V4L2_PIX_FMT_SGBRG8: case V4L2_PIX_FMT_SGRBG8: case V4L2_PIX_FMT_SRGGB8: bpp = 8; break; case V4L2_PIX_FMT_SBGGR10: case V4L2_PIX_FMT_SGBRG10: case V4L2_PIX_FMT_SGRBG10: case V4L2_PIX_FMT_SRGGB10: bpp = 10; break; case V4L2_PIX_FMT_SBGGR12: case V4L2_PIX_FMT_SGBRG12: case V4L2_PIX_FMT_SGRBG12: case V4L2_PIX_FMT_SRGGB12: bpp = 12; break; case V4L2_PIX_FMT_SBGGR14: case V4L2_PIX_FMT_SGBRG14: case V4L2_PIX_FMT_SGRBG14: case V4L2_PIX_FMT_SRGGB14: bpp = 14; break; case V4L2_PIX_FMT_SBGGR16: case V4L2_PIX_FMT_SGBRG16: case V4L2_PIX_FMT_SGRBG16: case V4L2_PIX_FMT_SRGGB16: bpp = 16; break; default: return -1; } return bpp; } MediaInfo::MediaInfo (){ LOGD_RKSTREAM ("MediaInfo constructed."); mIsMultiIspMode = false; mMultiIspExtendedPixel = 0; } MediaInfo::~MediaInfo(){ LOGD_RKSTREAM ("~MediaInfo destructed"); } static XCamReturn get_isp_ver(rk_aiq_isp_hw_info_t *hw_info) { XCamReturn ret = XCAM_RETURN_NO_ERROR; struct v4l2_capability cap; V4l2Device vdev(hw_info->isp_info[0].stats_path); ret = vdev.open(); if (ret != XCAM_RETURN_NO_ERROR) { LOGE_RKSTREAM("failed to open dev (%s)", hw_info->isp_info[0].stats_path); return XCAM_RETURN_ERROR_FAILED; } if (vdev.query_cap(cap) == XCAM_RETURN_NO_ERROR) { char *p; p = strrchr((char*)cap.driver, '_'); if (p == NULL) { ret = XCAM_RETURN_ERROR_FAILED; goto out; } if (*(p + 1) != 'v') { ret = XCAM_RETURN_ERROR_FAILED; goto out; } hw_info->hw_ver_info.isp_ver = atoi(p + 2); //awb/aec version? vdev.close(); return XCAM_RETURN_NO_ERROR; } else { ret = XCAM_RETURN_ERROR_FAILED; goto out; } out: vdev.close(); LOGE_RKSTREAM("get isp version failed !"); return ret; } static XCamReturn get_sensor_caps(rk_sensor_full_info_t *sensor_info) { struct v4l2_subdev_frame_size_enum fsize_enum; struct v4l2_subdev_mbus_code_enum code_enum; rk_frame_fmt_t frameSize; XCamReturn ret = XCAM_RETURN_NO_ERROR; V4l2SubDevice vdev(sensor_info->device_name.c_str()); ret = vdev.open(); if (ret != XCAM_RETURN_NO_ERROR) { LOGE_RKSTREAM("failed to open dev (%s)", sensor_info->device_name.c_str()); return XCAM_RETURN_ERROR_FAILED; } //get module info struct rkmodule_inf *minfo = &(sensor_info->mod_info); if(vdev.io_control(RKMODULE_GET_MODULE_INFO, minfo) < 0) { LOGE_RKSTREAM("@%s %s: Get sensor module info failed", __FUNCTION__, sensor_info->device_name.c_str()); return XCAM_RETURN_ERROR_FAILED; } sensor_info->len_name = std::string(minfo->base.lens); struct v4l2_subdev_frame_interval_enum fie; memset(&fie, 0, sizeof(fie)); while(vdev.io_control(VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL, &fie) == 0) { frameSize.format = (rk_aiq_format_t)fie.code; frameSize.width = fie.width; frameSize.height = fie.height; frameSize.fps = fie.interval.denominator / fie.interval.numerator; frameSize.hdr_mode = fie.reserved[0]; sensor_info->frame_size.push_back(frameSize); fie.index++; } if (fie.index == 0) LOGE_RKSTREAM("@%s %s: Enum sensor frame interval failed", __FUNCTION__, sensor_info->device_name.c_str()); vdev.close(); return ret; } static XCamReturn parse_module_info(rk_sensor_full_info_t *sensor_info) { // sensor entity name format SHOULD be like this: // m00_b_ov13850 1-0010 std::string entity_name(sensor_info->sensor_name); if (entity_name.empty()) return XCAM_RETURN_ERROR_SENSOR; int parse_index = 0; if (entity_name.at(parse_index) != 'm') { LOGE_RKSTREAM("%d:parse sensor entity name %s error at %d, please check sensor driver !", __LINE__, entity_name.c_str(), parse_index); return XCAM_RETURN_ERROR_SENSOR; } std::string index_str = entity_name.substr (parse_index, 3); sensor_info->module_index_str = index_str; parse_index += 3; if (entity_name.at(parse_index) != '_') { LOGE_RKSTREAM("%d:parse sensor entity name %s error at %d, please check sensor driver !", __LINE__, entity_name.c_str(), parse_index); return XCAM_RETURN_ERROR_SENSOR; } parse_index++; if (entity_name.at(parse_index) != 'b' && entity_name.at(parse_index) != 'f') { LOGE_RKSTREAM("%d:parse sensor entity name %s error at %d, please check sensor driver !", __LINE__, entity_name.c_str(), parse_index); return XCAM_RETURN_ERROR_SENSOR; } sensor_info->phy_module_orient = entity_name.at(parse_index); parse_index++; if (entity_name.at(parse_index) != '_') { LOGE_RKSTREAM("%d:parse sensor entity name %s error at %d, please check sensor driver !", __LINE__, entity_name.c_str(), parse_index); return XCAM_RETURN_ERROR_SENSOR; } parse_index++; std::size_t real_name_end = std::string::npos; if ((real_name_end = entity_name.find(' ')) == std::string::npos) { LOGE_RKSTREAM("%d:parse sensor entity name %s error at %d, please check sensor driver !", __LINE__, entity_name.c_str(), parse_index); return XCAM_RETURN_ERROR_SENSOR; } std::string real_name_str = entity_name.substr(parse_index, real_name_end - parse_index); sensor_info->module_real_sensor_name = real_name_str; LOGI_RKSTREAM("%s:%d, real sensor name %s, module ori %c, module id %s", __FUNCTION__, __LINE__, sensor_info->module_real_sensor_name.c_str(), sensor_info->phy_module_orient, sensor_info->module_index_str.c_str()); return XCAM_RETURN_NO_ERROR; } static rk_aiq_ispp_t* get_ispp_subdevs(struct media_device *device, const char *devpath, rk_aiq_ispp_t* ispp_info) { media_entity *entity = NULL; const char *entity_name = NULL; int index = 0; if(!device || !ispp_info || !devpath) return NULL; for(index = 0; index < MAX_CAM_NUM; index++) { if (0 == strlen(ispp_info[index].media_dev_path)) break; if (0 == strncmp(ispp_info[index].media_dev_path, devpath, sizeof(ispp_info[index].media_dev_path)-1)) { LOGE_RKSTREAM("isp info of path %s exists!", devpath); return &ispp_info[index]; } } if (index >= MAX_CAM_NUM) return NULL; #if defined(ISP_HW_V30) // parse driver pattern: soc:rkisp0-vir0 int model_idx = -1; char* rkispp = strstr(device->info.driver, "rkispp"); if (rkispp) { int ispp_idx = atoi(rkispp + strlen("rkispp")); char* vir = strstr(device->info.driver, "vir"); if (vir) { int vir_idx = atoi(vir + strlen("vir")); model_idx = ispp_idx * 4 + vir_idx; } } if (model_idx == -1) { LOGE_RKSTREAM("wrong ispp media driver info: %s", device->info.driver); return NULL; } ispp_info[index].model_idx = model_idx; #else if (strcmp(device->info.model, "rkispp0") == 0 || strcmp(device->info.model, "rkispp") == 0) ispp_info[index].model_idx = 0; else if (strcmp(device->info.model, "rkispp1") == 0) ispp_info[index].model_idx = 1; else if (strcmp(device->info.model, "rkispp2") == 0) ispp_info[index].model_idx = 2; else if (strcmp(device->info.model, "rkispp3") == 0) ispp_info[index].model_idx = 3; else ispp_info[index].model_idx = -1; #endif strncpy(ispp_info[index].media_dev_path, devpath, sizeof(ispp_info[index].media_dev_path)-1); entity = media_get_entity_by_name(device, "rkispp_input_image", strlen("rkispp_input_image")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_input_image_path, entity_name, sizeof(ispp_info[index].pp_input_image_path)-1); } } entity = media_get_entity_by_name(device, "rkispp_m_bypass", strlen("rkispp_m_bypass")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_m_bypass_path, entity_name, sizeof(ispp_info[index].pp_m_bypass_path)-1); } } entity = media_get_entity_by_name(device, "rkispp_scale0", strlen("rkispp_scale0")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_scale0_path, entity_name, sizeof(ispp_info[index].pp_scale0_path)-1); } } entity = media_get_entity_by_name(device, "rkispp_scale1", strlen("rkispp_scale1")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_scale1_path, entity_name, sizeof(ispp_info[index].pp_scale1_path)-1); } } entity = media_get_entity_by_name(device, "rkispp_scale2", strlen("rkispp_scale2")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_scale2_path, entity_name, sizeof(ispp_info[index].pp_scale2_path)-1); } } /* entity = media_get_entity_by_name(device, "rkispp_tnr_params", strlen("rkispp_tnr_params")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_tnr_params_path, entity_name, sizeof(ispp_info[index].pp_tnr_params_path)-1); } } entity = media_get_entity_by_name(device, "rkispp_tnr_stats", strlen("rkispp_tnr_stats")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_tnr_stats_path, entity_name, sizeof(ispp_info[index].pp_tnr_stats_path)-1); } } entity = media_get_entity_by_name(device, "rkispp_nr_params", strlen("rkispp_nr_params")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_nr_params_path, entity_name, sizeof(ispp_info[index].pp_nr_params_path)-1); } } entity = media_get_entity_by_name(device, "rkispp_nr_stats", strlen("rkispp_nr_stats")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_nr_stats_path, entity_name, sizeof(ispp_info[index].pp_nr_stats_path)-1); } } */ entity = media_get_entity_by_name(device, "rkispp_fec_params", strlen("rkispp_fec_params")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_fec_params_path, entity_name, sizeof(ispp_info[index].pp_fec_params_path)-1); } } entity = media_get_entity_by_name(device, "rkispp-subdev", strlen("rkispp-subdev")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(ispp_info[index].pp_dev_path, entity_name, sizeof(ispp_info[index].pp_dev_path)-1); } } LOGI_RKSTREAM( "model(%s): ispp_info(%d): ispp-subdev entity name: %s\n", device->info.model, index, ispp_info[index].pp_dev_path); return &ispp_info[index]; } static rk_aiq_isp_t* get_isp_subdevs(struct media_device *device, const char *devpath, rk_aiq_isp_t* isp_info) { media_entity *entity = NULL; const char *entity_name = NULL; int index = 0; if(!device || !isp_info || !devpath) return NULL; for(index = 0; index < MAX_CAM_NUM; index++) { if (0 == strlen(isp_info[index].media_dev_path)) { isp_info[index].logic_id = index; break; } if (0 == strncmp(isp_info[index].media_dev_path, devpath, sizeof(isp_info[index].media_dev_path)-1)) { LOGE_RKSTREAM("isp info of path %s exists!", devpath); return &isp_info[index]; } } if (index >= MAX_CAM_NUM) return NULL; #if defined(ISP_HW_V30) // parse driver pattern: soc:rkisp0-vir0 int model_idx = -1; char* rkisp = strstr(device->info.driver, "rkisp"); if (rkisp) { char* str_unite = NULL; str_unite = strstr(device->info.driver, "unite"); if (str_unite) { model_idx = 0; } else { int isp_idx = atoi(rkisp + strlen("rkisp")); char* vir = strstr(device->info.driver, "vir"); if (vir) { int vir_idx = atoi(vir + strlen("vir")); model_idx = isp_idx * 4 + vir_idx; isp_info[index].phy_id = isp_idx; } } } if (model_idx == -1) { LOGE_RKSTREAM("wrong isp media driver info: %s", device->info.driver); return NULL; } isp_info[index].model_idx = model_idx; #else if (strcmp(device->info.model, "rkisp0") == 0 || strcmp(device->info.model, "rkisp") == 0) isp_info[index].model_idx = 0; else if (strcmp(device->info.model, "rkisp1") == 0) isp_info[index].model_idx = 1; else if (strcmp(device->info.model, "rkisp2") == 0) isp_info[index].model_idx = 2; else if (strcmp(device->info.model, "rkisp3") == 0) isp_info[index].model_idx = 3; else isp_info[index].model_idx = -1; #endif strncpy(isp_info[index].media_dev_path, devpath, sizeof(isp_info[index].media_dev_path)-1); entity = media_get_entity_by_name(device, "rkisp-isp-subdev", strlen("rkisp-isp-subdev")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].isp_dev_path, entity_name, sizeof(isp_info[index].isp_dev_path)-1); } } entity = media_get_entity_by_name(device, "rkisp-csi-subdev", strlen("rkisp-csi-subdev")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].csi_dev_path, entity_name, sizeof(isp_info[index].csi_dev_path)-1); } } entity = media_get_entity_by_name(device, "rkisp-mpfbc-subdev", strlen("rkisp-mpfbc-subdev")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].mpfbc_dev_path, entity_name, sizeof(isp_info[index].mpfbc_dev_path)-1); } } entity = media_get_entity_by_name(device, "rkisp_mainpath", strlen("rkisp_mainpath")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].main_path, entity_name, sizeof(isp_info[index].main_path)-1); } } entity = media_get_entity_by_name(device, "rkisp_selfpath", strlen("rkisp_selfpath")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].self_path, entity_name, sizeof(isp_info[index].self_path)-1); } } entity = media_get_entity_by_name(device, "rkisp_rawwr0", strlen("rkisp_rawwr0")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].rawwr0_path, entity_name, sizeof(isp_info[index].rawwr0_path)-1); } } entity = media_get_entity_by_name(device, "rkisp_rawwr1", strlen("rkisp_rawwr1")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].rawwr1_path, entity_name, sizeof(isp_info[index].rawwr1_path)-1); } } entity = media_get_entity_by_name(device, "rkisp_rawwr2", strlen("rkisp_rawwr2")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].rawwr2_path, entity_name, sizeof(isp_info[index].rawwr2_path)-1); } } entity = media_get_entity_by_name(device, "rkisp_rawwr3", strlen("rkisp_rawwr3")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].rawwr3_path, entity_name, sizeof(isp_info[index].rawwr3_path)-1); } } entity = media_get_entity_by_name(device, "rkisp_dmapath", strlen("rkisp_dmapath")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].dma_path, entity_name, sizeof(isp_info[index].dma_path)-1); } } entity = media_get_entity_by_name(device, "rkisp_rawrd0_m", strlen("rkisp_rawrd0_m")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].rawrd0_m_path, entity_name, sizeof(isp_info[index].rawrd0_m_path)-1); } } entity = media_get_entity_by_name(device, "rkisp_rawrd1_l", strlen("rkisp_rawrd1_l")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].rawrd1_l_path, entity_name, sizeof(isp_info[index].rawrd1_l_path)-1); } } entity = media_get_entity_by_name(device, "rkisp_rawrd2_s", strlen("rkisp_rawrd2_s")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].rawrd2_s_path, entity_name, sizeof(isp_info[index].rawrd2_s_path)-1); } } entity = media_get_entity_by_name(device, "rkisp-statistics", strlen("rkisp-statistics")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].stats_path, entity_name, sizeof(isp_info[index].stats_path)-1); } } entity = media_get_entity_by_name(device, "rkisp-input-params", strlen("rkisp-input-params")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].input_params_path, entity_name, sizeof(isp_info[index].input_params_path)-1); } } entity = media_get_entity_by_name(device, "rkisp-mipi-luma", strlen("rkisp-mipi-luma")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].mipi_luma_path, entity_name, sizeof(isp_info[index].mipi_luma_path)-1); } } entity = media_get_entity_by_name(device, "rockchip-mipi-dphy-rx", strlen("rockchip-mipi-dphy-rx")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].mipi_dphy_rx_path, entity_name, sizeof(isp_info[index].mipi_dphy_rx_path)-1); } } else { entity = media_get_entity_by_name(device, "rockchip-csi2-dphy0", strlen("rockchip-csi2-dphy0")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(isp_info[index].mipi_dphy_rx_path, entity_name, sizeof(isp_info[index].mipi_dphy_rx_path)-1); } } } entity = media_get_entity_by_name(device, "rkcif_dvp", strlen("rkcif_dvp")); if(entity) isp_info[index].linked_dvp = true; else isp_info[index].linked_dvp = false; const char* linked_entity_name_strs[] = { "rkcif_dvp", "rkcif_lite_mipi_lvds", "rkcif_mipi_lvds", "rkcif_mipi_lvds1", "rkcif_mipi_lvds2", "rkcif_mipi_lvds3", "rkcif_mipi_lvds4", "rkcif_mipi_lvds5", "rkcif-mipi-lvds", "rkcif-mipi-lvds1", "rkcif-mipi-lvds2", "rkcif-mipi-lvds3", "rkcif-mipi-lvds4", "rkcif-mipi-lvds5", NULL }; int vicap_idx = 0; for (int i = 0; linked_entity_name_strs[i] != NULL; i++) { entity = media_get_entity_by_name(device, linked_entity_name_strs[i], strlen(linked_entity_name_strs[i])); if (entity) { strncpy(isp_info[index].linked_vicap[vicap_idx], entity->info.name, sizeof(isp_info[index].linked_vicap[vicap_idx])); isp_info[index].linked_sensor = true; if (vicap_idx++ >= MAX_ISP_LINKED_VICAP_CNT) { break; } } } LOGI_RKSTREAM("model(%s): isp_info(%d): ispp-subdev entity name: %s\n", device->info.model, index, isp_info[index].isp_dev_path); return &isp_info[index]; } static rk_aiq_cif_info_t* get_cif_subdevs(struct media_device *device, const char *devpath, rk_aiq_cif_info_t* cif_info) { media_entity *entity = NULL; const char *entity_name = NULL; int index = 0; if(!device || !devpath || !cif_info) return NULL; for(index = 0; index < MAX_CAM_NUM; index++) { if (0 == strlen(cif_info[index].media_dev_path)) break; if (0 == strncmp(cif_info[index].media_dev_path, devpath, sizeof(cif_info[index].media_dev_path)-1)) { LOGE_RKSTREAM("isp info of path %s exists!", devpath); return &cif_info[index]; } } if (index >= MAX_CAM_NUM) return NULL; cif_info[index].model_idx = index; strncpy(cif_info[index].media_dev_path, devpath, sizeof(cif_info[index].media_dev_path)-1 - 1); entity = media_get_entity_by_name(device, "stream_cif_mipi_id0", strlen("stream_cif_mipi_id0")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_id0, entity_name, sizeof(cif_info[index].mipi_id0) - 1); } } entity = media_get_entity_by_name(device, "stream_cif_mipi_id1", strlen("stream_cif_mipi_id1")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_id1, entity_name, sizeof(cif_info[index].mipi_id1) - 1); } } entity = media_get_entity_by_name(device, "stream_cif_mipi_id2", strlen("stream_cif_mipi_id2")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_id2, entity_name, sizeof(cif_info[index].mipi_id2) - 1); } } entity = media_get_entity_by_name(device, "stream_cif_mipi_id3", strlen("stream_cif_mipi_id3")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_id3, entity_name, sizeof(cif_info[index].mipi_id3) - 1); } } entity = media_get_entity_by_name(device, "rkcif_scale_ch0", strlen("rkcif_scale_ch0")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_scl0, entity_name, sizeof(cif_info[index].mipi_scl0) - 1); } } entity = media_get_entity_by_name(device, "rkcif_scale_ch1", strlen("rkcif_scale_ch1")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_scl1, entity_name, sizeof(cif_info[index].mipi_scl1) - 1); } } entity = media_get_entity_by_name(device, "rkcif_scale_ch2", strlen("rkcif_scale_ch2")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_scl2, entity_name, sizeof(cif_info[index].mipi_scl2) - 1); } } entity = media_get_entity_by_name(device, "rkcif_scale_ch3", strlen("rkcif_scale_ch3")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_scl3, entity_name, sizeof(cif_info[index].mipi_scl3) - 1); } } entity = media_get_entity_by_name(device, "stream_cif_dvp_id0", strlen("stream_cif_dvp_id0")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].dvp_id0, entity_name, sizeof(cif_info[index].dvp_id0) - 1); } } entity = media_get_entity_by_name(device, "stream_cif_dvp_id1", strlen("stream_cif_dvp_id1")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].dvp_id1, entity_name, sizeof(cif_info[index].dvp_id1) - 1); } } entity = media_get_entity_by_name(device, "stream_cif_dvp_id2", strlen("stream_cif_dvp_id2")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].dvp_id2, entity_name, sizeof(cif_info[index].dvp_id2) - 1); } } entity = media_get_entity_by_name(device, "stream_cif_dvp_id3", strlen("stream_cif_dvp_id3")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].dvp_id3, entity_name, sizeof(cif_info[index].dvp_id3) - 1); } } entity = media_get_entity_by_name(device, "rkcif-mipi-luma", strlen("rkisp-mipi-luma")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_luma_path, entity_name, sizeof(cif_info[index].mipi_luma_path)-1 - 1); } } entity = media_get_entity_by_name(device, "rockchip-mipi-csi2", strlen("rockchip-mipi-csi2")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_csi2_sd_path, entity_name, sizeof(cif_info[index].mipi_csi2_sd_path)-1 - 1); } } entity = media_get_entity_by_name(device, "rkcif-lvds-subdev", strlen("rkcif-lvds-subdev")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].lvds_sd_path, entity_name, sizeof(cif_info[index].lvds_sd_path)-1 - 1); } } entity = media_get_entity_by_name(device, "rkcif-lite-lvds-subdev", strlen("rkcif-lite-lvds-subdev")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].lvds_sd_path, entity_name, sizeof(cif_info[index].lvds_sd_path)-1 - 1); } } entity = media_get_entity_by_name(device, "rockchip-mipi-dphy-rx", strlen("rockchip-mipi-dphy-rx")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_dphy_rx_path, entity_name, sizeof(cif_info[index].mipi_dphy_rx_path)-1 - 1); } } else { entity = media_get_entity_by_name(device, "rockchip-csi2-dphy0", strlen("rockchip-csi2-dphy0")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].mipi_dphy_rx_path, entity_name, sizeof(cif_info[index].mipi_dphy_rx_path)-1 - 1); } } } entity = media_get_entity_by_name(device, "stream_cif", strlen("stream_cif")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].stream_cif_path, entity_name, sizeof(cif_info[index].stream_cif_path)-1 - 1); } } entity = media_get_entity_by_name(device, "rkcif-dvp-sof", strlen("rkcif-dvp-sof")); if(entity) { entity_name = media_entity_get_devname (entity); if(entity_name) { strncpy(cif_info[index].dvp_sof_sd_path, entity_name, sizeof(cif_info[index].dvp_sof_sd_path)-1 - 1); } } return &cif_info[index]; } static XCamReturn SensorInfoCopy(rk_sensor_full_info_t *finfo, rk_aiq_static_info_t *info) { int fs_num, i = 0; rk_aiq_sensor_info_t *sinfo = NULL; //info->media_node_index = finfo->media_node_index; strncpy(info->lens_info.len_name, finfo->len_name.c_str(), sizeof(info->lens_info.len_name)-1); sinfo = &info->sensor_info; strncpy(sinfo->sensor_name, finfo->sensor_name.c_str(), sizeof(sinfo->sensor_name)-1); fs_num = finfo->frame_size.size(); if (fs_num) { for (auto iter = finfo->frame_size.begin(); iter != finfo->frame_size.end() && i < 10; ++iter, i++) { sinfo->support_fmt[i].width = (*iter).width; sinfo->support_fmt[i].height = (*iter).height; sinfo->support_fmt[i].format = (*iter).format; sinfo->support_fmt[i].fps = (*iter).fps; sinfo->support_fmt[i].hdr_mode = (*iter).hdr_mode; } sinfo->num = i; } if (finfo->module_index_str.size()) { sinfo->phyId = atoi(finfo->module_index_str.c_str() + 1); } else { sinfo->phyId = -1; } return XCAM_RETURN_NO_ERROR; } rk_aiq_static_info_t* MediaInfo::getStaticCamHwInfo(const char* sns_ent_name, uint16_t index) { std::map>::iterator it; if (sns_ent_name) { std::string str(sns_ent_name); it = mCamHwInfos.find(str); if (it != mCamHwInfos.end()) { LOGD_RKSTREAM("find camerainfo of %s!", sns_ent_name); return it->second.ptr(); } else { LOGE_RKSTREAM("camerainfo of %s not fount!", sns_ent_name); } } else { if (index >= 0 && index < mCamHwInfos.size()) { int i = 0; for (it = mCamHwInfos.begin(); it != mCamHwInfos.end(); it++, i++) { if (i == index) return it->second.ptr(); } } } return NULL; } rk_sensor_full_info_t* MediaInfo::getSensorFullInfo(char* sns_ent_name, uint16_t index) { std::map>::iterator it; if (sns_ent_name) { std::string str(sns_ent_name); it = mSensorHwInfos.find(str); if (it != mSensorHwInfos.end()) { LOGD_RKSTREAM("find camerainfo of %s!", sns_ent_name); return it->second.ptr(); } else { LOGE_RKSTREAM("camerainfo of %s not fount!", sns_ent_name); } } else { if (index >= 0 && index < mSensorHwInfos.size()) { int i = 0; for (it = mSensorHwInfos.begin(); it != mSensorHwInfos.end(); it++, i++) { if (i == index) return it->second.ptr(); } } } return NULL; } XCamReturn MediaInfo::clearStaticCamHwInfo() { mCamHwInfos.clear(); mSensorHwInfos.clear(); return XCAM_RETURN_NO_ERROR; } void MediaInfo::findAttachedSubdevs(struct media_device *device, uint32_t count, rk_sensor_full_info_t *s_info) { const struct media_entity_desc *entity_info = NULL; struct media_entity *entity = NULL; uint32_t k; for (k = 0; k < count; ++k) { entity = media_get_entity (device, k); entity_info = media_entity_get_info(entity); if ((NULL != entity_info) && (entity_info->type == MEDIA_ENT_T_V4L2_SUBDEV_LENS)) { if ((entity_info->name[0] == 'm') && (strncmp(entity_info->name, s_info->module_index_str.c_str(), 3) == 0)) { if (entity_info->flags == 1) s_info->module_ircut_dev_name = std::string(media_entity_get_devname(entity)); else//vcm s_info->module_lens_dev_name = std::string(media_entity_get_devname(entity)); } } else if ((NULL != entity_info) && (entity_info->type == MEDIA_ENT_T_V4L2_SUBDEV_FLASH)) { if ((entity_info->name[0] == 'm') && (strncmp(entity_info->name, s_info->module_index_str.c_str(), 3) == 0)) { /* check if entity name has the format string mxx_x_xxx-irxxx */ if (strstr(entity_info->name, "-ir") != NULL) { s_info->module_flash_ir_dev_name[s_info->flash_ir_num++] = std::string(media_entity_get_devname(entity)); } else s_info->module_flash_dev_name[s_info->flash_num++] = std::string(media_entity_get_devname(entity)); } } } // query flash infos /* if (s_info->flash_num) { SmartPtr fl = new FlashLightHw(s_info->module_flash_dev_name, s_info->flash_num); fl->init(1); s_info->fl_strth_adj_sup = fl->isStrengthAdj(); fl->deinit(); } if (s_info->flash_ir_num) { SmartPtr fl_ir = new FlashLightHw(s_info->module_flash_ir_dev_name, s_info->flash_ir_num); fl_ir->init(1); s_info->fl_ir_strth_adj_sup = fl_ir->isStrengthAdj(); fl_ir->deinit(); } */ } XCamReturn MediaInfo::initCamHwInfos() { char sys_path[64], devpath[32]; FILE *fp = NULL; struct media_device *device = NULL; int nents, j = 0, i = 0, node_index = 0; const struct media_entity_desc *entity_info = NULL; struct media_entity *entity = NULL; xcam_mem_clear (mIspHwInfos); xcam_mem_clear (mCifHwInfos); while (i < MAX_MEDIA_INDEX) { node_index = i; snprintf (sys_path, 64, "/dev/media%d", i++); fp = fopen (sys_path, "r"); if (!fp) continue; fclose (fp); device = media_device_new (sys_path); if (!device) { continue; } /* Enumerate entities, pads and links. */ media_device_enumerate (device); rk_aiq_isp_t* isp_info = NULL; rk_aiq_cif_info_t* cif_info = NULL; bool dvp_itf = false; if (strcmp(device->info.model, "rkispp0") == 0 || strcmp(device->info.model, "rkispp1") == 0 || strcmp(device->info.model, "rkispp2") == 0 || strcmp(device->info.model, "rkispp3") == 0 || strcmp(device->info.model, "rkispp") == 0) { rk_aiq_ispp_t* ispp_info = get_ispp_subdevs(device, sys_path, mIspHwInfos.ispp_info); if (ispp_info) ispp_info->valid = true; goto media_unref; } else if (strcmp(device->info.model, "rkisp0") == 0 || strcmp(device->info.model, "rkisp1") == 0 || strcmp(device->info.model, "rkisp2") == 0 || strcmp(device->info.model, "rkisp3") == 0 || strcmp(device->info.model, "rkisp") == 0) { isp_info = get_isp_subdevs(device, sys_path, mIspHwInfos.isp_info); if (strstr(device->info.driver, "rkisp-unite")) { isp_info->is_multi_isp_mode = true; mIsMultiIspMode = true; mMultiIspExtendedPixel = RKMOUDLE_UNITE_EXTEND_PIXEL; } else { isp_info->is_multi_isp_mode = false; mIsMultiIspMode = false; mMultiIspExtendedPixel = 0; } isp_info->valid = true; } else if (strcmp(device->info.model, "rkcif") == 0 || strcmp(device->info.model, "rkcif_dvp") == 0 || strstr(device->info.model, "rkcif_mipi_lvds") || strstr(device->info.model, "rkcif-mipi-lvds") || strcmp(device->info.model, "rkcif_lite_mipi_lvds") == 0) { cif_info = get_cif_subdevs(device, sys_path, mCifHwInfos.cif_info); strncpy(cif_info->model_str, device->info.model, sizeof(cif_info->model_str)); if (strcmp(device->info.model, "rkcif_dvp") == 0) dvp_itf = true; } else { goto media_unref; } nents = media_get_entities_count (device); for (j = 0; j < nents; ++j) { entity = media_get_entity (device, j); entity_info = media_entity_get_info(entity); if ((NULL != entity_info) && (entity_info->type == MEDIA_ENT_T_V4L2_SUBDEV_SENSOR)) { rk_aiq_static_info_t *info = new rk_aiq_static_info_t(); rk_sensor_full_info_t *s_full_info = new rk_sensor_full_info_t(); s_full_info->media_node_index = node_index; strncpy(devpath, media_entity_get_devname(entity), sizeof(devpath)-1); s_full_info->device_name = std::string(devpath); s_full_info->sensor_name = std::string(entity_info->name); s_full_info->parent_media_dev = std::string(sys_path); parse_module_info(s_full_info); get_sensor_caps(s_full_info); if (cif_info) { s_full_info->linked_to_isp = false; s_full_info->cif_info = cif_info; s_full_info->isp_info = NULL; s_full_info->dvp_itf = dvp_itf; } else if (isp_info) { s_full_info->linked_to_isp = true; isp_info->linked_sensor = true; isp_info->isMultiplex = false; s_full_info->isp_info = isp_info; } else { LOGE_RKSTREAM("sensor device mount error!\n"); } findAttachedSubdevs(device, nents, s_full_info); SensorInfoCopy(s_full_info, info); info->has_lens_vcm = s_full_info->module_lens_dev_name.empty() ? false : true; info->has_fl = s_full_info->flash_num > 0 ? true : false; info->has_irc = s_full_info->module_ircut_dev_name.empty() ? false : true; info->fl_strth_adj_sup = s_full_info->fl_ir_strth_adj_sup; info->fl_ir_strth_adj_sup = s_full_info->fl_ir_strth_adj_sup; if (s_full_info->isp_info) info->is_multi_isp_mode = s_full_info->isp_info->is_multi_isp_mode; info->multi_isp_extended_pixel = mMultiIspExtendedPixel; LOGD_RKSTREAM("Init sensor %s with Multi-ISP Mode:%d Extended Pixels:%d ", s_full_info->sensor_name.c_str(), info->is_multi_isp_mode, info->multi_isp_extended_pixel); mSensorHwInfos[s_full_info->sensor_name] = s_full_info; mCamHwInfos[s_full_info->sensor_name] = info; } } media_unref: media_device_unref (device); } // judge isp if multiplex by multiple cams rk_aiq_isp_t* isp_info = NULL; for (i = 0; i < MAX_CAM_NUM; i++) { isp_info = &mIspHwInfos.isp_info[i]; if (isp_info->valid) { for (j = i - 1; j >= 0; j--) { if (isp_info->phy_id == mIspHwInfos.isp_info[j].phy_id) { isp_info->isMultiplex = true; mIspHwInfos.isp_info[j].isMultiplex = true; } } } } std::map>::iterator iter; for(iter = mSensorHwInfos.begin(); \ iter != mSensorHwInfos.end(); iter++) { LOGI_RKSTREAM("match the sensor_name(%s) media link\n", (iter->first).c_str()); SmartPtr s_full_info = iter->second; /* * The ISP and ISPP match links through the media device model */ if (s_full_info->linked_to_isp) { for (i = 0; i < MAX_CAM_NUM; i++) { LOGI_RKSTREAM("isp model_idx: %d, ispp(%d) model_idx: %d\n", s_full_info->isp_info->model_idx, i, mIspHwInfos.ispp_info[i].model_idx); if (mIspHwInfos.ispp_info[i].valid && (s_full_info->isp_info->model_idx == mIspHwInfos.ispp_info[i].model_idx)) { s_full_info->ispp_info = &mIspHwInfos.ispp_info[i]; LOGI_RKSTREAM("isp(%d) link to ispp(%d)\n", s_full_info->isp_info->model_idx, mIspHwInfos.ispp_info[i].model_idx); mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx = atoi(s_full_info->ispp_info->media_dev_path + strlen("/dev/media")); LOGI_RKSTREAM("sensor %s adapted to pp media %d:%s\n", s_full_info->sensor_name.c_str(), mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx, s_full_info->ispp_info->media_dev_path); break; } } } else { /* * Determine which isp that vipCap is linked */ for (i = 0; i < MAX_CAM_NUM; i++) { rk_aiq_isp_t* isp_info = &mIspHwInfos.isp_info[i]; for (int vicap_idx = 0; vicap_idx < MAX_ISP_LINKED_VICAP_CNT; vicap_idx++) { LOGI_RKSTREAM("vicap %s, linked_vicap %s", s_full_info->cif_info->model_str, isp_info->linked_vicap[vicap_idx]); if (strcmp(s_full_info->cif_info->model_str, isp_info->linked_vicap[vicap_idx]) == 0) { s_full_info->isp_info = &mIspHwInfos.isp_info[i]; mCamHwInfos[s_full_info->sensor_name]->is_multi_isp_mode = s_full_info->isp_info->is_multi_isp_mode; mCamHwInfos[s_full_info->sensor_name] ->multi_isp_extended_pixel = mMultiIspExtendedPixel; if (mIspHwInfos.ispp_info[i].valid) s_full_info->ispp_info = &mIspHwInfos.ispp_info[i]; LOGI_RKSTREAM("vicap link to isp(%d) to ispp(%d)\n", s_full_info->isp_info->model_idx, s_full_info->ispp_info ? s_full_info->ispp_info->model_idx : -1); mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx = s_full_info->ispp_info ? atoi(s_full_info->ispp_info->media_dev_path + strlen("/dev/media")) : -1; LOGI_RKSTREAM("sensor %s adapted to pp media %d:%s\n", s_full_info->sensor_name.c_str(), mCamHwInfos[s_full_info->sensor_name]->sensor_info.binded_strm_media_idx, s_full_info->ispp_info ? s_full_info->ispp_info->media_dev_path : "null"); mIspHwInfos.isp_info[i].linked_sensor = true; } } } } if (!s_full_info->isp_info/* || !s_full_info->ispp_info*/) { LOGE_RKSTREAM("get isp or ispp info fail, something gos wrong!"); } else { //mCamHwInfos[s_full_info->sensor_name]->linked_isp_info = *s_full_info->isp_info; //mCamHwInfos[s_full_info->sensor_name]->linked_ispp_info = *s_full_info->ispp_info; } } /* Look for free isp&ispp link to fake camera */ for (i = 0; i < MAX_CAM_NUM; i++) { if (mIspHwInfos.isp_info[i].valid && !mIspHwInfos.isp_info[i].linked_sensor) { rk_aiq_static_info_t *hwinfo = new rk_aiq_static_info_t(); rk_sensor_full_info_t *fullinfo = new rk_sensor_full_info_t(); fullinfo->isp_info = &mIspHwInfos.isp_info[i]; if (mIspHwInfos.ispp_info[i].valid) { fullinfo->ispp_info = &mIspHwInfos.ispp_info[i]; hwinfo->sensor_info.binded_strm_media_idx = atoi(fullinfo->ispp_info->media_dev_path + strlen("/dev/media")); } fullinfo->media_node_index = -1; fullinfo->device_name = std::string("/dev/null"); fullinfo->sensor_name = std::string("FakeCamera"); fullinfo->sensor_name += std::to_string(i); fullinfo->parent_media_dev = std::string("/dev/null"); fullinfo->linked_to_isp = true; hwinfo->sensor_info.support_fmt[0].hdr_mode = NO_HDR; hwinfo->sensor_info.support_fmt[1].hdr_mode = HDR_X2; hwinfo->sensor_info.support_fmt[2].hdr_mode = HDR_X3; hwinfo->sensor_info.num = 3; mIspHwInfos.isp_info[i].linked_sensor = true; SensorInfoCopy(fullinfo, hwinfo); hwinfo->has_lens_vcm = false; hwinfo->has_fl = false; hwinfo->has_irc = false; hwinfo->fl_strth_adj_sup = 0; hwinfo->fl_ir_strth_adj_sup = 0; hwinfo->is_multi_isp_mode = fullinfo->isp_info->is_multi_isp_mode; hwinfo->multi_isp_extended_pixel = mMultiIspExtendedPixel; mSensorHwInfos[fullinfo->sensor_name] = fullinfo; mCamHwInfos[fullinfo->sensor_name] = hwinfo; LOGI_RKSTREAM("fake camera %d link to isp(%d) to ispp(%d)\n", i, fullinfo->isp_info->model_idx, fullinfo->ispp_info ? fullinfo->ispp_info->model_idx : -1); LOGI_RKSTREAM("sensor %s adapted to pp media %d:%s\n", fullinfo->sensor_name.c_str(), mCamHwInfos[fullinfo->sensor_name]->sensor_info.binded_strm_media_idx, fullinfo->ispp_info ? fullinfo->ispp_info->media_dev_path : "null"); } } get_isp_ver(&mIspHwInfos); for (auto &item : mCamHwInfos) item.second->isp_hw_ver = mIspHwInfos.hw_ver_info.isp_ver; return XCAM_RETURN_NO_ERROR; } void MediaInfo::getCamHwEntNames(char buf[12][32]) { int i = 0; for(auto it=mSensorHwInfos.begin(); it!=mSensorHwInfos.end(); ++it){ strcpy(buf[i], it->first.c_str()); i++; //printf("printStaticCamHwInfo %s\n",it->first.c_str()); } } void MediaInfo::offline(const char* isp_driver, const char* offline_sns_ent_name) { XCamReturn ret = XCAM_RETURN_NO_ERROR; int isp_driver_index = -1; if (!isp_driver) { return; } else { // if driver = 3588 if(strlen(isp_driver) > 8) { char* isp_driver_name = const_cast(isp_driver); char *rkisp = strstr(isp_driver_name, "rkisp"); if (rkisp) { int isp_mode = atoi(rkisp + strlen("rkisp")); char* vir = strstr(isp_driver_name, "vir"); if (vir) { int vir_idx = atoi(vir + strlen("vir")); isp_driver_index = isp_mode * 4 + vir_idx; } } } else { if (strcmp(isp_driver, "rkisp0") == 0 || strcmp(isp_driver, "rkisp") == 0) isp_driver_index = 0; else if (strcmp(isp_driver, "rkisp1") == 0) isp_driver_index = 1; else if (strcmp(isp_driver, "rkisp2") == 0) isp_driver_index = 2; else if (strcmp(isp_driver, "rkisp3") == 0) isp_driver_index = 3; else isp_driver_index = -1; } } std::map >::iterator iter; std::map >::iterator iter_info; for (iter = mSensorHwInfos.begin(); \ iter != mSensorHwInfos.end(); iter++) { rk_sensor_full_info_t *s_full_info_f = iter->second.ptr(); if (s_full_info_f->isp_info) { if (s_full_info_f->isp_info->model_idx != isp_driver_index) { continue; } rk_sensor_full_info_t *s_full_info = new rk_sensor_full_info_t; *s_full_info = *s_full_info_f; iter_info = mCamHwInfos.find(iter->first); if (iter_info == mCamHwInfos.end()) { continue; } rk_aiq_static_info_t *cam_hw_info_f = iter_info->second.ptr(); rk_aiq_static_info_t *cam_hw_info = new rk_aiq_static_info_t; *cam_hw_info = *cam_hw_info_f; char sensor_name_real[64]; if (!strstr(const_cast(s_full_info->sensor_name.c_str()), offline_sns_ent_name)) { int module_index = 0; std::map >::iterator sns_it; for (sns_it = mSensorHwInfos.begin(); \ sns_it != mSensorHwInfos.end(); sns_it++) { rk_sensor_full_info_t *sns_full= sns_it->second.ptr(); if (strstr(sns_full->sensor_name.c_str(), "_s_")) { int sns_index = atoi(sns_full->sensor_name.c_str() + 2); if (module_index <= sns_index) { module_index = sns_index + 1; } } } std::string tmp_sensor_name = s_full_info_f->sensor_name; s_full_info->module_real_sensor_name = (std::string)offline_sns_ent_name; s_full_info->phy_module_orient = 's'; memset(sensor_name_real, 0, sizeof(sensor_name_real)); sprintf(sensor_name_real, "%s%d%s%s%s", "m0", module_index, "_s_", s_full_info->module_real_sensor_name.c_str(), " 1-111a"); std::string sns_fake_name = sensor_name_real; s_full_info->sensor_name = sns_fake_name; printf("sns_fake_name:%s %s\n", s_full_info->sensor_name.c_str(), s_full_info_f->sensor_name.c_str()); mSensorHwInfos[s_full_info->sensor_name] = s_full_info; mCamHwInfos[s_full_info->sensor_name] = cam_hw_info; mSensorHwInfos.erase(tmp_sensor_name); mCamHwInfos.erase(tmp_sensor_name); iter_info++; } else { std::string tmp_sensor_name = s_full_info_f->sensor_name; s_full_info->phy_module_orient = 's'; memset(sensor_name_real, 0, sizeof(sensor_name_real)); sprintf(sensor_name_real, "%s%s%s%s", s_full_info->module_index_str.c_str(), "_s_", s_full_info->module_real_sensor_name.c_str(), " 1-111a"); std::string sns_fake_name = sensor_name_real; s_full_info->sensor_name = sns_fake_name; printf("sns_fake_name:%s %s\n", s_full_info->sensor_name.c_str(), s_full_info_f->sensor_name.c_str()); mSensorHwInfos[s_full_info->sensor_name] = s_full_info; mCamHwInfos[s_full_info->sensor_name] = cam_hw_info; mSensorHwInfos.erase(tmp_sensor_name); mCamHwInfos.erase(tmp_sensor_name); iter_info++; } return; } } printf("offline preInit faile\n"); } }