camera前后摄像头切换原理

比如camera的初始化流程,HAL接口主要工作如下: 1、调用系统调用open()打开camera设备节点,前后摄像头一般是/dev/video0或/dev/video1,这样会调用到内核的v4l2子系统里面的open函数,这个函数将会注册camera模组(gc2035)的驱动并调用模组的初始化接口; 2、然后HAL会通过ioctl系统调用经过v4l2子系统查询camera模组支持的各种格式、分辨率等参数,并设置用户选择的分辨率等参数; 3、经过一系列初始化后HAL最终通过ioctl系统调用打开camera的预览功能,并通过poll等方式获取图像数据。 --->frameworks/base/core/java/android/hardware/Camera.java public static Camera open() { int numberOfCameras = getNumberOfCameras(); CameraInfo cameraInfo = new CameraInfo(); for (int i = 0; i < numberOfCameras; i++) { getCameraInfo(i, cameraInfo); if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) { //此处强制打开后置,遍历存在的摄像头之后还是没有后置则会返回null return new Camera(i); //此处新建一个camera(id)对象 } } XXCameraHardwareInterface.cpp是硬件移植工作者根据所用硬件平台对CameraHardwareInterface.h的实现。就上述三个接口,我们可以做如下的实现。首先定义CameraInfo类型的结构体数组,用来存储硬件平台所支持的Camera的信息。这里只表示支持两个Camera,前面后面各一个。其具体定义如下: static CameraInfo sCameraInfo[] = { { CAMERA_FACING_BACK, 90, /* orientation */ }, { CAMERA_FACING_FRONT, 90, /* orientation */ } }; 接下来XXCameraHardwareInterface.cpp是硬件移植工作者根据所用硬件平台对CameraHardwareInterface.h的实现。就上述三个接口,我们可以做如下的实现。首先定义CameraInfo类型的结构体数组,用来存储硬件平台所支持的Camera的信息。这里只表示支持两个Camera,前面后面各一个。其具体定义如下: static CameraInfo sCameraInfo[] = { { CAMERA_FACING_BACK, 90, /* orientation */ }, { CAMERA_FACING_FRONT, 90, /* orientation */ } }; 接下来实现那三个接口函数,具体实现如下: extern "C" int HAL_getNumberOfCameras() { return sizeof(sCameraInfo) / sizeof(sCameraInfo[0]); } extern "C" void HAL_getCameraInfo(int cameraId, struct CameraInfo* cameraInfo) { memcpy(cameraInfo, &sCameraInfo[cameraId], sizeof(CameraInfo)); } extern "C" int HAL_setCameraId(int cameraId) { //设置该Camera为当前所用Camera return NO_ERROR; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值