Android Camera从Camera HAL1到Camera HAL3的过渡(已更新到Android6.0 HAL3.3)

2023-05-16

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢。

欢迎和大家交流。qq:1037701636 email:gzzaigcn2009@163.com

Software:系统源码Android5.1


1. Android系统中Camera模块版本号的历史演变进度

/**
 * All module versions <= HARDWARE_MODULE_API_VERSION(1, 0xFF) must be treated
 * as CAMERA_MODULE_API_VERSION_1_0
 */
#define CAMERA_MODULE_API_VERSION_1_0 HARDWARE_MODULE_API_VERSION(1, 0)
#define CAMERA_MODULE_API_VERSION_2_0 HARDWARE_MODULE_API_VERSION(2, 0)
#define CAMERA_MODULE_API_VERSION_2_1 HARDWARE_MODULE_API_VERSION(2, 1)
#define CAMERA_MODULE_API_VERSION_2_2 HARDWARE_MODULE_API_VERSION(2, 2)
#define CAMERA_MODULE_API_VERSION_2_3 HARDWARE_MODULE_API_VERSION(2, 3)

#define CAMERA_MODULE_API_VERSION_CURRENT CAMERA_MODULE_API_VERSION_2_3

/**
 * All device versions <= HARDWARE_DEVICE_API_VERSION(1, 0xFF) must be treated
 * as CAMERA_DEVICE_API_VERSION_1_0
 */
#define CAMERA_DEVICE_API_VERSION_1_0 HARDWARE_DEVICE_API_VERSION(1, 0)
#define CAMERA_DEVICE_API_VERSION_2_0 HARDWARE_DEVICE_API_VERSION(2, 0)
#define CAMERA_DEVICE_API_VERSION_2_1 HARDWARE_DEVICE_API_VERSION(2, 1)
#define CAMERA_DEVICE_API_VERSION_3_0 HARDWARE_DEVICE_API_VERSION(3, 0)
#define CAMERA_DEVICE_API_VERSION_3_1 HARDWARE_DEVICE_API_VERSION(3, 1)
#define CAMERA_DEVICE_API_VERSION_3_2 HARDWARE_DEVICE_API_VERSION(3, 2)

// Device version 3.2 is current, older HAL camera device versions are not
// recommended for new devices.
#define CAMERA_DEVICE_API_VERSION_CURRENT CAMERA_DEVICE_API_VERSION_3_2
从上述对Camera版本的定义可知,Android将整个camera模块划分为module和device两个部分,前者拥有对后者的控制权,而后者直接就是代表的camera hal接口的实现。

对于Module API的区别主要在于2.1之后增加了set_callbacks接口,用于HAL检测当前module的工作状态,低版本的module不需要实现。

此外对于Module API版本号高于2.2时可支持get_vendor_tag_ops,Framework调用后课获取对厂商自己扩展定义的tag ops,便于操作厂商自己私有定义的camera所需的metadata信息,同理低版本的module不需要去实现该接口。

此外对于Module API 为2.3的版本增加了open_legacy接口:

    int (*open_legacy)(const struct hw_module_t* module, const char* id,
            uint32_t halVersion, struct hw_device_t** device);

他描述的是可以根据自己所选的device version,比如对于一个camera hal他支持并实现了CAMERA_DEVICE_API_VERSION_1_0和CAMERA_DEVICE_API_VERSION_3_2两种版本下的hal接口的实现,只有module api定义的是2.3的版本的话,在Framework中就可以通过对open_legacy()来指定hal_version,从而获取不同版本下的hal device的实现接口即hw_device_t。但目前来看,Android提供了该接口,却在Framework层都没有给出直接的调用,此外可见的hal module api2.3的版本,也都不会去实现该接口。说明hw_module_t所属的open目前依旧还是获取对camera device控制权的唯一路径与方法,也许对于一个camera device而言实现一种版本的接口就已经够用和麻烦的了。


2 Camera Client

    关于CameraService相关的内容可以参考博文Android4.2.2 CameraService服务启动和应用端camera初始化记录来梳理整个Camera.so模块的加载与处理过程。每一个应用端的camera在connect到CameraService处会以一个Camera Client形式存在,该类继承并实现CameraService::Client的一个内部类,通过匿名的Binder服务与应用端进行交互。在CamerService启动并建立的时候,就会自动加载一个camera.xxx.so的模块,提取module相关的handle。

每当connect时,CameraService会执行一个getDeviceVersion的函数:

int CameraService::getDeviceVersion(int cameraId, int* facing) {
    struct camera_info info;
    if (mModule->get_camera_info(cameraId, &info) != OK) {
        return -1;
    }

    int deviceVersion;
    if (mModule->common.module_api_version >= CAMERA_MODULE_API_VERSION_2_0) {
        deviceVersion = info.device_version;
    } else {
        deviceVersion = CAMERA_DEVICE_API_VERSION_1_0;
    }

    if (facing) {
        *facing = info.facing;
    }

    return deviceVersion;
}
即对于那些module_api_version小于2.0的版本,即所谓的1.0版本外,其他module对应的device 版本号,由HAL自行决定,决定权通过get_camera_info来获取hal支持的camera_info相关信息,其中包括device_version。1.0版本的module直接默认的device_verison则为1.0版本。

     case CAMERA_DEVICE_API_VERSION_1_0:
            client = new CameraClient(this, cameraClient,
                    clientPackageName, cameraId,
                    facing, callingPid, clientUid, getpid(), legacyMode);
            break;
          case CAMERA_DEVICE_API_VERSION_2_0:
          case CAMERA_DEVICE_API_VERSION_2_1:
          case CAMERA_DEVICE_API_VERSION_3_0:
          case CAMERA_DEVICE_API_VERSION_3_1:
          case CAMERA_DEVICE_API_VERSION_3_2:
            client = new Camera2Client(this, cameraClient,
                    clientPackageName, cameraId,
                    facing, callingPid, clientUid, getpid(), legacyMode);//CameraService端新建Camera2Client
            break;
通过上述的代码逻辑可知,对于Camera Client的升级,由底层Device API Version来决定。很明显可以知道,目前1.0的device api以CameraClient的形式存在,而2.0以上的版本则均以Camera2Client的形式存在。 

对于Camera模块不同版本的DEVICE_API来说,其区别本质上就是在HAL所需要实现的接口不同,分别由以下三个版本的device接口:

typedef struct camera_device {
    /**
     * camera_device.common.version must be in the range
     * HARDWARE_DEVICE_API_VERSION(0,0)-(1,FF). CAMERA_DEVICE_API_VERSION_1_0 is
     * recommended.
     */
    hw_device_t common;
    camera_device_ops_t *ops;
    void *priv;
} camera_device_t;
对应的是1.0的DEVICE_API,目前低版本的Android系统中以该方式来实现的较多。


typedef struct camera2_device {
    /**
     * common.version must equal CAMERA_DEVICE_API_VERSION_2_0 to identify
     * this device as implementing version 2.0 of the camera device HAL.
     */
    hw_device_t common;
    camera2_device_ops_t *ops;
    void *priv;
} camera2_device_t;
2.0版本的ops目前主流的IC厂商实现的较少。


typedef struct camera3_device {
    /**
     * common.version must equal CAMERA_DEVICE_API_VERSION_3_0 to identify this
     * device as implementing version 3.0 of the camera device HAL.
     *
     * Performance requirements:
     *
     * Camera open (common.module->common.methods->open) should return in 200ms, and must return
     * in 500ms.
     * Camera close (common.close) should return in 200ms, and must return in 500ms.
     *
     */
    hw_device_t common;
    camera3_device_ops_t *ops;
    void *priv;
} camera3_device_t;
对于3.0而言,也就是所谓的HAL3.0就体现在这里,当下可见的只有高通、三星等有对该种接口形式进行了实现。

本质上来说,三个不同的版本都进行了全盘的升级,则重点则是归于在HAL中按照Google在Framework层定义的camerax_device_ops来实现该种接口,相关接口的实现形式在分析高通的HAL架构时再去分析。


3 Camera device

对于三个不同版本的hal层接口,在Camera的Framework中实现的过程略有不同,可以分为device1、device2、device3。

对于1.0版本的Device API,在创建CameraClient时,是以CameraHardwareInterface(可以认为是Camera Device1)来维护队整个对HAL层中Camera Device的控制权,即 camera_device_t归CameraHardwareInterface来调用。


对于2.0以上版本的Device API时,在创建Camera2Client时,会通过CameraDeviceFactory::createDevice来创建相应的Camera Device

sp<CameraDeviceBase> CameraDeviceFactory::createDevice(int cameraId) {

    sp<CameraService> svc = sService.promote();
    if (svc == 0) {
        ALOGE("%s: No service registered", __FUNCTION__);
        return NULL;
    }

    int deviceVersion = svc->getDeviceVersion(cameraId, /*facing*/NULL);

    sp<CameraDeviceBase> device;

    switch (deviceVersion) {
        case CAMERA_DEVICE_API_VERSION_2_0:
        case CAMERA_DEVICE_API_VERSION_2_1:
            device = new Camera2Device(cameraId);
            break;
        case CAMERA_DEVICE_API_VERSION_3_0:
        case CAMERA_DEVICE_API_VERSION_3_1:
        case CAMERA_DEVICE_API_VERSION_3_2:
            device = new Camera3Device(cameraId);
            break;
        default:
            ALOGE("%s: Camera %d: Unknown HAL device version %d",
                  __FUNCTION__, cameraId, deviceVersion);
            device = NULL;
            break;
    }

    ALOGV_IF(device != 0, "Created a new camera device for version %d",
                          deviceVersion);

    return device;
}
可以看到对于Camera2Client而言,对Device API2.0、2.1的版本通过Camera2Device来实现对底层device的控制,对3.0以上的版本通过Camera3Device来实现,前者可以说是调用的是Camera HAL2.0相关的camera2_device_t的接口,后者调用的是Camera HAL3.0相关的camera3_device_t的接口,当然重点就是两者内部实现的形式不同,3.0版本的处理也更显的复杂。 其中Camera Device API2.0的版本从Android4.2开始发布,而API3更多的是对前者的升级与换代而已在4.4.2的版本中科院看到。


4.小结

Camera不断的过渡,也算是Android系统源码中,变化较大的一个部分了,虽然Framework层核心的CameraService、Camera等的实现逻辑都没有发生很大的变化,但和底层HAL的交互却有着质的变异。而目前主流的IC厂商都在朝着Camera HAL3.0的方向进行发展,所有有必要对3.0实现的原理与本质进行探究与学习。


附图:camera在Android Framework层中的变迁


Camera HAL1.0 在Android4.0 ICE开始;
Camera HAL2.0、HAL3.0在Android4.2/4.3 JB版本开始支持;
Camera HAL3.1 在Androiod4.4 KitKat开始Support;
Camera HAL3.2 在Android5.0 L 开始支持;
Camera API2在Android5.0 L开始支持,并逐步deprecate Camera API1。
Android几个版本下camera_common.h的文档集:
Android4.0
# define  CAMERA_DEVICE_API_VERSION_1_0  HARDWARE_DEVICE_API_VERSION( 1, 0)
Android4.2
# define  CAMERA_DEVICE_API_VERSION_1_0  HARDWARE_DEVICE_API_VERSION( 1, 0)
# define  CAMERA_DEVICE_API_VERSION_2_0  HARDWARE_DEVICE_API_VERSION( 2, 0)
Android4.3
# define  CAMERA_DEVICE_API_VERSION_1_0  HARDWARE_DEVICE_API_VERSION( 1, 0)
# define  CAMERA_DEVICE_API_VERSION_2_0  HARDWARE_DEVICE_API_VERSION( 2, 0)
# define  CAMERA_DEVICE_API_VERSION_2_1  HARDWARE_DEVICE_API_VERSION( 21)
# define  CAMERA_DEVICE_API_VERSION_3_0  HARDWARE_DEVICE_API_VERSION( 3, 0)
Android4.4
98# define  CAMERA_DEVICE_API_VERSION_1_0  HARDWARE_DEVICE_API_VERSION( 1, 0)
99# define  CAMERA_DEVICE_API_VERSION_2_0  HARDWARE_DEVICE_API_VERSION( 2, 0)
100# define  CAMERA_DEVICE_API_VERSION_2_1  HARDWARE_DEVICE_API_VERSION( 21)
101# define  CAMERA_DEVICE_API_VERSION_3_0  HARDWARE_DEVICE_API_VERSION( 3, 0)
102# define  CAMERA_DEVICE_API_VERSION_3_1  HARDWARE_DEVICE_API_VERSION( 31)
Android5.0
#define CAMERA_DEVICE_API_VERSION_1_0 HARDWARE_DEVICE_API_VERSION(1, 0)
#define CAMERA_DEVICE_API_VERSION_2_0 HARDWARE_DEVICE_API_VERSION(2, 0)
#define CAMERA_DEVICE_API_VERSION_2_1 HARDWARE_DEVICE_API_VERSION(2, 1)
#define CAMERA_DEVICE_API_VERSION_3_0 HARDWARE_DEVICE_API_VERSION(3, 0)
#define CAMERA_DEVICE_API_VERSION_3_1 HARDWARE_DEVICE_API_VERSION(3, 1)
#define CAMERA_DEVICE_API_VERSION_3_2 HARDWARE_DEVICE_API_VERSION(3, 2)
Android6.0
#define CAMERA_DEVICE_API_VERSION_3_3 HARDWARE_DEVICE_API_VERSION(3, 3)







本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Camera从Camera HAL1到Camera HAL3的过渡(已更新到Android6.0 HAL3.3) 的相关文章

  • 算法学习笔记

    最近无意中看到一个算法的网站 xff0c 看着感觉介绍得挺系统的 xff0c 虽然做算法以及指导学生开发各种算法这么些年了 xff0c 却没有真正系统的学习过 xff08 几年前啃过算法导论 xff0c 但是苦于那蹩脚的中文翻译 xff0c
  • 2023年可见光通信(LiFi)研究新进展

    可见光无线通信Light Fidelity xff08 LiFi xff09 又称 光保真技术 xff0c 是一种利用可见光进行数据传输的全新无线传输技术 LiFi是一种以半导体光源作为信号发射源 xff0c 利用无需授权的自由光谱实现无线
  • 论文阅读笔记之——《Toward Convolutional Blind Denoising of Real Photographs》及基于pytorch的CBDNet的复现

    本文是CBDNet xff08 convolutional blind denoising network xff09 的阅读笔记 本博文分为两块 xff0c 一块是阅读笔记 xff0c 一块是本人对CBDNet的实验记录 论文链接 xff
  • C++和Windows平台的一些书籍

    从2010年学习编程以来 xff0c 到现在有差不多3年时间了 xff0c 过的真快啊 目前在深圳工作 xff0c 主要使用的是C 43 43 语言 xff0c 那么我就说说C 43 43 和Windows平台的书籍吧 1 C primer
  • 程序员提升之排查bug的能力

    不知不觉工作已经快一年了 xff0c 从开始工作以后 xff0c 跟着大神们学习了很多 xff0c 从一个小白慢慢的成长起来 xff0c 从我目前的经验来看 xff0c 我要感谢bug xff0c 这里的bug并不单单是指bug xff0c
  • CMakeList编译报错ninja: error: missing and no known rule to make it解决方法

    Android NDK开发引用第三方库CMakeList txt编译报错 xff1a ninja error 39 XXX NDKApplication app src main cpp src main cpp armeabi v7a l
  • 关于Java学习的心得体会

    大一的第二学期 xff0c 满心欢喜的期待着自己的专业课 xff0c 上个学期C语言老师和我们说C语言只是入门 xff0c 我们还学得如此吃力 心中已经能够想到本学期的心酸了 xff0c 果不其然 xff0c 老师说本学期不学C 43 43
  • 项目管理第十三章项目相关方管理

    项目管理第十三章项目相关方管理 项目相关方管理 xff1a 包括识别能够影响项目或会受项目影响的人员 团体或组织 xff0c 分析相关方对项目的期望和影响 xff0c 制定合适的管理策略来有效调动相关方参与项目决策和执行 其过程包括 xff
  • Git3.创建版本库(Git仓库)&提交更新到仓库

    创建版本库 Git仓库 什么是版本库呢 xff1f 版本库又名仓库 xff0c 英文名repository xff0c 你可以简单理解成一个目录 xff0c 这个目录里面的所有文件都可以被Git管理起来 xff0c 每个文件的修改 删除 x
  • ssh 登录时常出现的几种错误以及解决方法(Linux)

    前言 ssh是Linux系统中常用的远程登陆的命令 xff0c 有的时候我们通过xshell等远程连接软件使用ssh去登陆远程的服务器的时候 xff0c 会遇到一些问题 下面是关于ssh 远程登陆的问题解决方法的总结 xff08 更新中 x
  • vins-mono(4)重定位以及全局优化

    vins的重定位模块主要包含回环检测 回环候选帧之间的特征匹配 紧耦合重定位三个部分 a 回环检测 采用BRIEF描述子的DBOW2词袋进行闭环检测 对新来的关键帧重新检测500个角点进行闭环检测同时对所有角点进行BRIEF描述 然后计算当
  • STM32CubeMX的下载以及安装

    第一步 xff1a 安装应用软件 下载STM32CubeMX软件并安装 xff1b 第二步 xff1a 安装MCU固件包 在线安装用户所选的STM32微控制器对应的MCU固件包 具体操作步骤如下 xff1a 软件的下载地址 xff1a ht
  • MDK-ARM软件的下载以及资源分享

    1 软件的基本特点 xff1a 支持源代码的编辑 编译 程序的下载和调试等多种功能 编译器和器件支持包分离 xff0c 可根据需求安装 xff0c 减少软件的大小 提供多种中间件 xff0c 如RTOS和GUI等 xff0c 提高开发效率
  • 关于Win10家庭版修改用户名的问题

    之前电脑注册的时候命名为中文 xff0c 但在装很多软件时就会出现很多奇奇怪怪的问题 xff0c 查了之后发现可能是因为系统的中文名造成的 xff0c 因此在之后可能就需要修改 之前在网上找到比较常见的两种方法都不适用于Win10家庭版 方
  • ROS 开源智能小车 TurtleBot3 Waffle pi 深度视觉版简介 (可实现地图搭建、自主导航、自主避障、深度视觉算法研究)

    ROS机器人操作系统为什么现在火爆全球 xff1f ROS xff08 Robot Operating System xff0c 机器人操作系统 xff09 是目前世界上更主流更多人使用的机器人开源操作系统 它可以提供操作系统应有的服务 x
  • c/c++输出保留指定位小数(输出精度控制)

    c 43 43 C 43 43 的精度控制需要头文件 span class token macro property span class token directive keyword include span span class to
  • 以连接mysql为例:六种流行的语言比较——C、C++、python、Java、php、C#

    本文是六种语言连接mysql数据库的代码展示 xff0c 在LZ尝试的过程中 xff0c 无论是语言环境搭建 mysql依赖库的导入还是代码的风格 xff0c 各种语言都各有千秋 接下来 xff0c 我们就让这些语言一一登场吧 Java x
  • 熊迈摄像头SDK二次开发:登录、截屏、录像等功能

    对雄迈摄像头二次开发 xff0c 因为雄迈给的资料比较混乱 xff0c 没有找到可用的sdk手册 xff0c 所以一开始想用OpenCV 43 qt 但是在Windows环境下 xff0c opencv摄像头读取卡顿严重 xff0c 而且o
  • ros学习(2-2):ros节点创建(python)

    参考 Python创建简单的ROS节点 xff1a 用Python实现ROS节点 xff08 这里也说明了用Python写ROS功能包也是需要CMakelists txt的 xff09 https blog csdn net sinat 1
  • Ubuntu下使用眼动仪Tobii Eye Tracker 4C

    01 安装 amp 使用 安装 使用过程参考 xff1a https github com Eitol tobii eye tracker linux installer 下面过程主要是github中自述文件的翻译 下载 在新终端 xff0

随机推荐