深入理解Android Camera

深入理解Android Camera

一、Camera框架

(详细资料参见:https://source.android.com/devices/camera)

1. 架构(旧版)

在这里插入图片描述

1.1 简介

Camera 在 Android 5 引入了 API2 的接口,可以允许配置更多的 camera 操作。
旧的 API 接口都在 android.hardware.包下(为求方便,下面旧 API 接口都统称为 API1), 新的 API2 的接口都在 android.hardware.camera2 包下面。
由于共存了两套API,也造成了camera框架相对复杂,但是大致可以总结为下图:
在这里插入图片描述
由此可知,API1、API2与HAL V1、V3的对应关系是在 CameraService这层做的转化。CameraService通过提供不同的open接口(API1对应connect,API2对应connectDevice、connectLegacy)来初始化转化关系。

1.2 底层用HAL V1

需要注意2点:

  1. HAL层的代码跑在CameraService进程
  2. Camera API2接口会通过CameraDeviceUserShim转化为Camera API1的接口,这是唯一一个不在CameraService做API与HAL转化的关系

在这里插入图片描述

1.3 底层用HAL V3

在这里插入图片描述

二、API和Hal特殊组合

1. API1 + HAL3

API1调用HAL3是在CameraService中完成转换,使用了不同的Client:

  1. CameraClient (即API调用HAL1的接口)
  2. Camera2Client (即API1调用HAL3接口)
  3. CameraDeviceClient (即API2调用HAL3接口)

代码如下(示例):

//代码位置:\frameworks\av\services\camera\libcameraservice\CameraService.cpp


Status CameraService::makeClient(const sp<CameraService>& cameraService,
        const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId,
        int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid,
        int halVersion, int deviceVersion, apiLevel effectiveApiLevel,
        /*out*/sp<BasicClient>* client) {
   

    if (halVersion < 0 || halVersion == deviceVersion) {
   
        // Default path: HAL version is unspecified by caller, create CameraClient
        // based on device version reported by the HAL.
        // 如果HAL版本没有特殊指定(即正常调用Camera.open()), 或者指定的HAL版本和要打开的Camera默认的HAL版本相同, 则根据要打开的Camera的默认HAL版本创建Client
        switch(deviceVersion) {
   
          case CAMERA_DEVICE_API_VERSION_1_0:
            // 如果HAL层默认使用HAL1, 则创建 CameraClient
            if (effectiveApiLevel == API_1) {
     // Camera1 API route
                sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get());
                *client = new CameraClient(cameraService, tmp, packageName,
                        api1CameraId, facing, clientPid, clientUid,
                        getpid());
            } else {
    // Camera2 API route
                ALOGW("Camera using old HAL version: %d", deviceVersion);
                return STATUS_ERROR_FMT(ERROR_DEPRECATED_HAL,
                        "Camera device \"%s\" HAL version %d does not support camera2 API",
                        cameraId.string(), deviceVersion);
            }
            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:
          case CAMERA_DEVICE_API_VERSION_3_5:
            // 如果HAL层默认使用HAL3, 根据使用API进行判断, 使用API1则创建Camera2
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值