android13/external/camera_engine_rkaiq/rk_stream/stream_cfg/MediaInfo.cpp

1301 lines
51 KiB
C++
Executable File

/*
* 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<std::string, SmartPtr<rk_aiq_static_info_t>>::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<std::string, SmartPtr<rk_sensor_full_info_t>>::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<FlashLightHw> 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<FlashLightHw> 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<std::string, SmartPtr<rk_sensor_full_info_t>>::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<rk_sensor_full_info_t> 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<char*>(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<std::string, SmartPtr<rk_sensor_full_info_t> >::iterator iter;
std::map<std::string, SmartPtr<rk_aiq_static_info_t> >::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<char*>(s_full_info->sensor_name.c_str()), offline_sns_ent_name)) {
int module_index = 0;
std::map<std::string, SmartPtr<rk_sensor_full_info_t> >::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");
}
}