android camera HAL3 兼容 camera API1 实现方案学习总结

从AndroidP 开始,高通camera系统全面使用HAL3,之前的HAL1已经被移除,对应HAL3主流的相机开发接口是camera API2 ,但是依然存在大量的使用Camera API 1开发的相机应用,为此Android专门设计了一套兼容API1调用HAL3的中间转换接口,本门主要从几个方面简要介绍下这部分相关的知识。**

  • opencamera
  • startpreview
  • takepicture
  • setparameter、getparameter

1. opencamera

相机应用在调用

Camera open(int cameraId)

时, 经过Binder IPC进入CameraService.cpp,调用的接口是

CameraService::connectHelper(....){
    ALOGI("CameraService::connect call (PID %d \"%s\", camera ID %s) for HAL version %s and "
           "Camera API version %d");

   ret = makeClient(......))
   
    err = client->initialize(mCameraProviderManager);//重点分析
}

通过makeClient会创建相应的client

Status CameraService::makeClient(.....) {
         ......
        // Default path: HAL version is unspecified by caller, create CameraClient
        // based on device version reported by the HAL.
        switch(deviceVersion) {
          case CAMERA_DEVICE_API_VERSION_1_0:
            //Android P 之后不再存在
            if (effectiveApiLevel == API_1) {  // Camera1 API route 
                *client = new CameraClient(....),
            } else { // Camera2 API route
            }
            break;
          case CAMERA_DEVICE_API_VERSION_3_0:
          case CAMERA_DEVICE_API_VERSION_3_1:
          case CAMERA_DEVICE_API_VERSION_3_2:
          case CAMERA_DEVICE_API_VERSION_3_3:
          case CAMERA_DEVICE_API_VERSION_3_4:
            //API1+HAL3 对应的client
            if (effectiveApiLevel == API_1) { // Camera1 API route
                *client = new Camera2Client(.....);
            } else { // Camera2 API route
                //API2+HAL3 对应的client
                *client = new CameraDeviceClient(.....);
            }
            break;
          default:
            // Should not be reachable
            ALOGE("Unknown camera device HAL version: %d", deviceVersion);
            .....
        }
}

通过上述代码分析发现API1+HAL3对用的client是Camera2Client
其类图如下:
在这里插入图片描述
从上边看Camera2Client继承实现了ICamera定义的camera API1接口,但是其内部的成员变量mDevice是`Camera3Device 类型,其是针对HAL3设计的,下边分析 openCamera具体流程
在这里插入图片描述
从流程图上看,opencamera主要完成了两件事:

  • makeclient 创建camera2client对象及Camera3Device对象
  • 初始化camera2client,真正完成打开相机的地方

    从过程看,Camera2Client实现的是Camera API1的接口,并通过
Camera3Device对象mDevice完成与Camera HAL3的对接

2. startpreview

3. takepicture

4. setparameter、getparameter

猜你喜欢

转载自blog.csdn.net/u010116586/article/details/91488272