extern mm_camera_t * mm_camera_query (uint8_t *num_cameras)
{
int i = 0, rc = MM_CAMERA_OK;
int dev_fd = 0;
struct media_device_info mdev_info;
int num_media_devices = 0;
if (!num_cameras)
return NULL;
/* lock the mutex */
pthread_mutex_lock(&g_mutex);
*num_cameras = 0;
while (1) {
char dev_name[32];
snprintf(dev_name, sizeof(dev_name), "/dev/media%d", num_media_devices);
dev_fd = open(dev_name, O_RDWR | O_NONBLOCK);
if (dev_fd < 0) {
CDBG("Done discovering media devices\n");
break;
}
num_media_devices++;
rc = ioctl(dev_fd, MEDIA_IOC_DEVICE_INFO, &mdev_info);
if (rc < 0) {
CDBG_ERROR("Error: ioctl media_dev failed: %s\n", strerror(errno));
close(dev_fd);
break;
}
if(strncmp(mdev_info.model, QCAMERA_NAME, sizeof(mdev_info.model) != 0)) {
close(dev_fd);
continue;
}
char * mdev_cfg;
int cam_type = 0, mount_angle = 0, info_index = 0;
mdev_cfg = strtok(mdev_info.serial, "-");
while(mdev_cfg != NULL) {
if(info_index == 0) {
if(strcmp(mdev_cfg, QCAMERA_NAME))
break;
} else if(info_index == 1) {
mount_angle = atoi(mdev_cfg);
} else if(info_index == 2) {
cam_type = atoi(mdev_cfg);
}
mdev_cfg = strtok(NULL, "-");
info_index++;
}
if(info_index == 0) {
close(dev_fd);
continue;
}
int num_entities = 1;
while (1) {
struct media_entity_desc entity;
memset(&entity, 0, sizeof(entity));
entity.id = num_entities++;
rc = ioctl(dev_fd, MEDIA_IOC_ENUM_ENTITIES, &entity);
if (rc < 0) {
CDBG("Done enumerating media entities\n");
rc = 0;
break;
}
if(entity.type == MEDIA_ENT_T_DEVNODE_V4L && entity.group_id == QCAMERA_VNODE_GROUP_ID) {
strncpy(g_cam_ctrl.camera[*num_cameras].video_dev_name,
entity.name, sizeof(entity.name));
break;
}
}
g_cam_ctrl.camera[*num_cameras].camera_info.camera_id = *num_cameras;
g_cam_ctrl.camera[*num_cameras].
camera_info.modes_supported = CAMERA_MODE_2D;
if(cam_type > 1)
g_cam_ctrl.camera[*num_cameras].
camera_info.modes_supported |= CAMERA_MODE_3D;
g_cam_ctrl.camera[*num_cameras].camera_info.position =
(cam_type == 1) ? FRONT_CAMERA : BACK_CAMERA;
g_cam_ctrl.camera[*num_cameras].camera_info.sensor_mount_angle =
mount_angle;
g_cam_ctrl.camera[*num_cameras].sensor_type = 0;
g_cam_ctrl.camera[*num_cameras].cfg = &mm_camera_cfg;
g_cam_ctrl.camera[*num_cameras].ops = &mm_camera_ops;
g_cam_ctrl.camera[*num_cameras].evt = &mm_camera_notify;
g_cam_ctrl.camera[*num_cameras].jpeg_ops = NULL;
CDBG("%s: dev_info[id=%d,name='%s',pos=%d,modes=0x%x,sensor=%d]\n",
__func__, *num_cameras,
g_cam_ctrl.camera[*num_cameras].video_dev_name,
g_cam_ctrl.camera[*num_cameras].camera_info.position,
g_cam_ctrl.camera[*num_cameras].camera_info.modes_supported,
g_cam_ctrl.camera[*num_cameras].sensor_type);
*num_cameras+=1;
if (dev_fd > 0) {
close(dev_fd);
}
}
*num_cameras = *num_cameras;
g_cam_ctrl.num_cam = *num_cameras;
end:
/* unlock the mutex */
pthread_mutex_unlock(&g_mutex);
CDBG("%s: num_cameras=%d\n", __func__, g_cam_ctrl.num_cam);
if(rc == 0)
return &g_cam_ctrl.camera[0];
else
return NULL;
}这个函数是注册系统中存在的摄像头的个数。这个很重要,如果把这里修改一下,原生的APK就可以打开摄像头了。