Android相机-架构3

目录

引言

1. Android相机的整体架构

2. 相机 HAL

2.1 AIDL相机HAL

2.2 相机 HAL3 功能

3. HAL子系统

3.1 请求

3.2 HAL和相机子系统

3.2.1 相机的管道

3.2.2 使用 Android Camera API 的步骤

3.2.3 HAL 操作摘要

3.3 启动和预期操作顺序

3.3.1 枚举、打开相机设备并创建有效会话

3.3.2 使用有效相机会话


引言

为了更深入理解相机体系,不断地反复地对相机架构的内容进行梳理和理解。

1. Android相机的整体架构

下面主要是从结构层次方面来理解Android相机体系的架构原理。先看看这个熟悉的架构图:

图1. 相机的整体架构图

这个架构图说明的是从 应用层 到 HAL层的原理

应用框架:通过Activity 或者 Service 调用 Camera API v2来实现应用的业务逻辑开发,比如相机应用的拍照逻辑,预览逻辑,录像逻辑等等。其中涉及到的两个核心组件:CameraDevice 和 CameraManager

Native框架:提供了CameraDevice 和CameraCaptureSession的实现

Native框架通过HAL层进行硬件的管理和控制。换句话说,应用之所以能够正确操作相机硬件,就是因为HAL层提供了接口。典型的接口包括:

1)枚举单个设备并管理器状态的接口:ICameraProvider

2)相机设备的接口:ICameraDevice

3)激活的相机设备会话接口:ICameraDeviceSession

相机的一些能力还需要通过Service服务的方式向上层提供出去的。具体的实际代码在:

frameworks/av/services/camera/libcameraservice/CameraService.cpp

这样,我们使用相机的时候就会有3个运行的进程交互协作共同完成用户的业务需求。而这3个进程之间的通信是通过AIDL的方式来实现的。实现的IPC binder接口包括:

1)已打开的特定相机设备接口:ICameraDevice

2)相机服务的接口:ICameraService;

3)应用框架中CameraDevice的回调接口:ICameraDeviceCallbacks,

4)应用框架中CameraService的回调接口:ICameraServiceListener

就这样,Android相机体系架构中,Android应用的业务逻辑的实现是通过Camera API v2来实现,而Camera API v2 又是通过Native框架实现,Native框架通过再硬件抽象层(Camera HAL 层)控制和管理应用,Camera HAL则是通过内核驱动直接操作硬件。通过这样的一种关联交互的方式实现了相机的业务逻辑与硬件的交互。

2. 相机 HAL

从整体架构中,可以发现,Android相机的实现主要是依靠 相机 HAL实现的。换句话说,Android的相机HAL 是连接 android.hardware.camera2 上层相机框架 API 与 底层相机驱动和硬件的 桥梁。从Android8.0引入了Treble,用于将相机HAL API切换到由HAL接口语言HIDL定义的稳定接口,从Android 13开始,相机HAL接口使用AIDL进行开发。

2.1 AIDL相机HAL

对于搭载 Android 13 或更高版本的设备,该相机框架包含对 AIDL 相机 HAL 的支持。该相机框架还支持 HIDL 相机 HAL,不过,在 Android 13 或更高版本中添加的相机功能只能通过 AIDL 相机 HAL 接口使用。如需在升级到 Android 13 或更高版本的设备上实现此类功能,设备制造商必须将其 HAL 进程从使用 HIDL 相机接口迁移到使用 AIDL 相机接口。

补充说明:Android中,适用于HAL的AIDL是从Android11开始的。设计初衷其实是由于AIDL和HIDL都是为了跨进程通信设计的。由于AIDL具备了稳定性的支持,这样如果只是用一个方式设计的话就意味着仅使用一个IPC运行时环境来实现整个堆栈。化繁为简更易于调试,优化和维护。同时AIDL的版本控制系统也由于HIDL。

AIDL 相机 HAL 规范位于以下位置:

相机提供程序: hardware/interfaces/camera/provider/aidl/
相机设备: hardware/interfaces/camera/device/aidl/
相机元数据: hardware/interfaces/camera/metadata/aidl/
常见数据类型: hardware/interfaces/camera/common/aidl/
对于迁移到 AIDL 的设备,设备制造商可能需要修改 Android SELinux 政策 (sepolicy) 和 RC 文件,具体取决于代码结构。

验证 AIDL 相机 HAL
如需测试 AIDL 相机 HAL 实现,请确保设备已通过所有 CTS 和 VTS 测试。Android 13 引入了 AIDL VTS 测试 VtsAidlHalCameraProvider_TargetTest.cpp。

2.2 相机 HAL3 功能

我们已经知道相机HAL是连接应用和底层驱动硬件的桥梁。下面我们继续聊聊 相机HAL 的功能。

HAL从HAL1发展到HAL3,从而也就意味着重新设计了Android Camer API,而其中的目标都是为了在Android设备上构建高质量的相机应用,更稳定,性能更好。

相机HAL3 的子系统将操作模式构建为单个统一视图,该视图可用于实现之前的任何模式和其他几种模式,例如连拍模式。这使得用户可以更好地控制焦点和曝光,并进行更多的后处理,如降噪、对比度和锐化。此外,这种简化的视图使应用程序开发人员更容易使用相机的各种功能。

API将摄像机子系统建模为一个管道,以1:1的基础将传入的帧捕获请求转换为帧。请求封装了关于帧的捕获和处理的所有配置信息。这包括分辨率和像素格式;手动传感器、镜头和闪光灯控制;3A操作模式;RAW->YUV处理控制;统计生成;等等

简单地说,应用程序框架从相机子系统请求帧,相机子系统将结果返回到输出流。此外,为每组结果生成包含诸如颜色空间和镜头明暗处理之类的信息的元数据。可以将相机HAL3视为相机HAL1的单向流的管道。它将每个捕获请求转换为传感器捕获的一张图像,并将其处理为:

  • 包含有关捕获的元数据的 Result 对象。
  • 图像数据的 1 到 N 个缓冲区,每个缓冲区会进入自己的目标 Surface。

可能的输出 Surface 组经过预配置:

  • 每个 Surface 都是一个固定分辨率的图像缓冲区数据流的目标位置。
  • 一次只能将少量 Surface 配置为输出(约 3 个)。

一个请求中包含所需的全部捕获设置,以及要针对该请求将图像缓冲区(从总配置组)推送到其中的输出 Surface 的列表。

请求可以只发生一次(使用 capture()),也可以无限重复(使用 setRepeatingRequest())。

捕获的优先级高于重复请求的优先级。

图2. 相机的核心操作模型

3. HAL子系统

3.1 请求

应用框架向相机子系统发出请求
一个请求对应一组结果

请求包含的信息:
1)分辨率和像素格式
2)手动传感器,镜头,闪光灯等控件
3)3A操作模式;
4)RAW到YUV处理控制
5)统计信息

一次可以发出多个请求
提交请求不会阻塞
请求始终按照接收的顺序进行处理。

图3. 相机模型

此相机模型可以看到从应用请求到HAL层返回结果的整个流程。结合我们上面架构和HAL的知识梳理,会更容易理解图3 所描述的相机模型。暂且只需要直观地了解一下大致的请求与结果返回的路径。我们继续梳理。

3.2 HAL和相机子系统

3.2.1 相机的管道

HAL子系统包括了相机管道中的组件的实现
HAL子系统提供实现组件的接口,如:3A算法和处理控件
HAL子系统可以支持不同设备制造商,不同信号处理器的跨平台兼容性
HAL子系统支持不同的算法和运算顺序,不影响质量,效率或者跨设备的兼容性
相机管道还支持应用框架可以启动触发器来开启自动对焦等功能。它还会将通知发送回应用框架,以通知应用自动对焦锁定或错误等事件。

所以理解的相机的管道,就基本理解了相机的HAL 子系统了。

图4. 相机管道

从图4的相机管道模型图中,可以了解到:

1)RAW Bayer 输出在 ISP 内部不经过任何处理。
2)统计信息根据原始传感器数据生成。
3)将原始传感器数据转换为 YUV 的各种处理块按任意顺序排列。
4)当显示多个刻度和剪裁单元时,所有缩放器单元共享输出区域控件(数字缩放)。不过,每个单元都可能具有不同的输出分辨率和像素格式。

3.2.2 使用 Android Camera API 的步骤

下面先简要介绍了使用 Android Camera API 的步骤。

1)监听和枚举相机设备。
2)打开设备并连接监听器。
3)配置目标使用情形的输出(如静态捕获、录制等)。
4)为目标使用情形创建请求。
5)捕获/重复请求和连拍。
6)接收结果元数据和图片数据。
7)切换使用情形时,返回到第 3 步。

3.2.3 HAL 操作摘要

1)捕获的异步请求来自于框架。
2)HAL 设备必须按顺序处理请求。对于每个请求,均生成输出结果元数据以及一个或多个输出图像缓冲区。
3)请求和结果以及后续请求引用的信息流遵守先进先出规则。
4)指定请求的所有输出的时间戳必须完全相同,以便框架可以根据需要将它们匹配在一起。
5)所有捕获配置和状态(不包括 3A 例程)都包含在请求和结果中。

图5. 相机HAL

图中的 1-9 代表这从request到result的顺序,最先的请求1,得到了结果也是排在最前面的。

3.3 启动和预期操作顺序

先看看我们操作的流程图:

图6. 相机的操作流程

3.3.1 枚举、打开相机设备并创建有效会话

1)初始化后,框架开始监听实现 ICameraProvider 接口的任何现有CameraProvider。如果存在一个或多个CameraProvider,框架将尝试建立 connection。
2)框架通过 ICameraProvider::getCameraIdList() 枚举相机设备。
3)框架通过调用相应的 ICameraProvider::getCameraDeviceInterface_VX_X() 来实例化一个新的 ICameraDevice。
4)框架调用 ICameraDevice::open() 来创建一个新的有效捕获会话 ICameraDeviceSession。

3.3.2 使用有效相机会话

1)框架调用 ICameraDeviceSession::configureStreams() 并传入到 HAL 设备的输入/输出流列表。

2)框架通过调用 ICameraDeviceSession::constructDefaultRequestSettings() 为某些用例请求默认设置。这可能会在 ICameraDevice::open 创建 ICameraDeviceSession 之后的任何时间发生。

3)框架通过基于某一组默认设置的设置以及框架之前注册的至少一个输出流来构造第一个捕获请求并将其发送到 HAL。此请求通过 ICameraDeviceSession::processCaptureRequest() 发送到 HAL。HAL 必须阻止此调用返回,直到准备好发送下一个请求为止。

4)框架继续提交请求并根据需要调用 ICameraDeviceSession::constructDefaultRequestSettings() 以获取其他用例的默认设置缓冲区。

5)当请求捕获开始(传感器开始曝光以进行捕获)时,HAL 会调用 ICameraDeviceCallback::notify() 并显示 SHUTTER 消息,包括帧号和开始曝光的时间戳。此通知回调不必在对请求第一次调用 processCaptureResult() 之前发生,但直到针对相应的捕获调用 notify() 之后,才会向应用提供有关该捕获的结果。

6)经过一定的 pipeline 延迟后,HAL 开始使用 ICameraDeviceCallback::processCaptureResult() 将完成的捕获返回到框架。这些捕获按照与提交请求相同的顺序返回。一次可发起多个请求,具体取决于相机 HAL 设备的管道深度。

启动之后可能的三种状态:

1)框架停止提交新的请求,等待现有的捕获完成,然后再次调用。
2)正常结束:框架结束相机会话
3)异常结束:发生错误或者其他异步事件而返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127133.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言课程作业

本科期间c语言课程作业代码整理: Josephus链表实现 Josephus 层序遍历树 二叉树的恢复 哈夫曼树 链表的合并 中缀表达式 链接:https://pan.baidu.com/s/1Q7d-LONauNLi7nJS_h0jtw?pwdswit 提取码:swit

《TCP/IP网络编程》阅读笔记--进程间通信

目录 1--进程间通信 2--pipe()函数 3--代码实例 3-1--pipe1.c 3-2--pipe2.c 3-3--pipe3.c 3-4--保存信息的回声服务器端 1--进程间通信 为了实现进程间通信,使得两个不同的进程间可以交换数据,操作系统必须提供两个进程可以同时访问的内存空间&am…

MySQL之MHA高可用配置及故障切换

目录 一、MHA概念 1、MHA的组成 2、MHA的特点 3、主从复制有多少种复制方法 二、搭建MySqlMHA部署 1.Master、Slave1、Slave2 节点上安装 mysql 2.修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf 3. 配置 mysql 一主两从 4、安…

关于el-input和el-select宽度不一致问题解决

1. 情景一 单列布局 对于上图这种情况&#xff0c;只需要给el-select加上style"width: 100%"即可&#xff0c;如下&#xff1a; <el-select v-model"fjForm.region" placeholder"请选择阀门类型" style"width: 100%"><el-o…

【轻量化网络】MobileNet系列

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications, CVPR2017 论文&#xff1a;https://arxiv.org/abs/1704.04861 代码&#xff1a; 解读&#xff1a;【图像分类】2017-MobileNetV1 CVPR_說詤榢的博客-CSDN博客 MobileNetV2: Inverted …

如何使用PySide2将designer设计的ui文件加载到Python类上鼠标拖拽显示路径

应用场景&#xff1a; designer快速设计好UI文件后&#xff0c;需要增加一些特别的界面功能&#xff0c;如文件拖拽显示文件路径功能。 方法如下&#xff1a; from PySide2.QtWidgets import QApplication, QMainWindow from PySide2.QtUiTools import loadUiTypeUi_MainWindo…

Java中wait和notify详解

线程的调度是无序的&#xff0c;随机的&#xff0c;但是也是有一定的需求场景&#xff0c;希望能够有序执行&#xff0c;join算是一种控制顺序的方式&#xff08;功能有限&#xff09;——》一个线程执行完&#xff0c;才能执行另一个线程&#xff01; 本文主要讲解的&#xf…

【工具使用】Dependency Walker使用

一&#xff0c;简介 在工作过程中常常会遇到编译的dll库运行不正常的情况&#xff0c;那就需要确认dll库是否编译正常&#xff0c;即是否将函数编译到dll中去。今天介绍一种查看dll库中函数定义的工具——Dependency walker。 二&#xff0c;软件介绍 Dependency Walker是一…

CSS3技巧36:backdrop-filter 背景滤镜

CSS3 有 filter 滤镜属性&#xff0c;能给内容&#xff0c;尤其是图片&#xff0c;添加各种滤镜效果。 filter 滤镜详见博文&#xff1a;CSS3中强大的filter(滤镜)属性_css3滤镜_stones4zd的博客-CSDN博客 后续&#xff0c;CSS3 又新增了 backdrop-filter 背景滤镜。 backdr…

源码剖析:Elasticsearch 段合并调度及优化手段

1、背景 经常看到集群的merge限流耗时比较高&#xff0c;所以想分析其原因、造成的影响、以及反思merge的一些优化手段。 比如下图中测试集群相关监控截图&#xff1a; 可是从磁盘的写入来看&#xff0c;并不高&#xff1a; 那么目前的情况带来哪些影响&#xff1f; 资源利用率…

七大排序算法

目录 直接插入排序 希尔排序 直接选择排序 堆排序 冒泡排序 快速排序 快速排序优化 非递归实现快速排序 归并排序 非递归的归并排序 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 常见的排序算法有插入排序(直接插入…

工具 | XShell的学习与使用

工具 | XShell的学习与使用 时间&#xff1a;2023年9月8日09:03:29 文章目录 工具 | XShell的学习与使用1.下载2.安装 1.下载 1.官网XSHELL - NetSarang Website 2.免费版下载&#xff1a;家庭/学校免费 - NetSarang Website (xshell.com) 3.https://cdn.netsarang.net/de06d10…

Postman接口测试流程

一、工具安装 ● 安装Postman有中文版和英文版&#xff0c;可以选择自己喜欢的版本即可。安装时重新选择一下安装路径&#xff08;也可以默认路径&#xff09;&#xff0c;一直下一步安装完成即可。&#xff08;本文档采用英文版本&#xff09;安装文件网盘路径链接&#xff1…

transformer 总结(超详细-初版)

相关知识链接 attention1attention2 引言 本文主要详解 transformer 的算法结构以及理论解释&#xff0c;代码实现以及具体实现时候的细节放在下一篇来详述。 下面就通过上图中 transformer 的结构来依次解析 输入部分(Encode 侧) input 输出主要包含 两个部分&#xff1a…

第5篇 vue的通信框架axios和ui框架-element-ui以及node.js

一 axios的使用 1.1 介绍以及作用 axios是独立于vue的一个项目&#xff0c;基于promise用于浏览器和node.js的http客户端。 在浏览器中可以帮助我们完成 ajax请求的发送在node.js中可以向远程接口发送请求 1.2 案例使用axios实现前后端数据交互 1.后端代码 2.前端代码 &…

微信最新更新隐私策略(2023-08-15)

1、manifest.json 配置修改 在mp-weixin: 参数修改&#xff08;没有就添加&#xff09; "__usePrivacyCheck__": true, ***2、注意 微信开发者工具调整 不然一直报错 找不到 getPrivacySetting 废话不多说 上代码 3、 编辑首页 或者用户授权界面 <uni-popup…

【云原生】Kubeadmin部署Kubernetes集群

目录 ​编辑 一、环境准备 1.2调整内核参数 二、所有节点部署docker 三、所有节点安装kubeadm&#xff0c;kubelet和kubectl 3.1定义kubernetes源 3.2开机自启kubelet 四、部署K8S集群 4.1查看初始化需要的镜像 4.2在 master 节点上传 v1.20.11.zip 压缩包至 /opt 目录…

【Linux】文件系统

磁盘及文件系统 文件的增删查改 重新认识目录 目录是文件嘛&#xff1f; 是的。 目录有iNode嘛&#xff1f; 有 目录有内容嘛&#xff1f; 有 任何一个文件&#xff0c;一定在一个目录内部&#xff0c;所以一个目录的内容是什么&#xff1f; 需要数据块&#xff0c;目录的数据…

【技术支持案例】S32K146的hard fault问题处理

文章目录 1. 案例背景2. 方案准备2.1 HardFault&#xff08;硬件错误异常&#xff09;2.2 UsageFault&#xff08;用法错误异常&#xff09;2.3 BusFault&#xff08;总线错误异常&#xff09;2.4 MemManage Fault&#xff08;存储器管理错误异常&#xff09; 3. 现场支持3.1 现…

Java基础之static关键字

目录 静态的特点第一章、静态代码块第二章、静态属性第三章、静态方法调用静态方法时静态方法中调用非静态方法时 第四章、static关键字与其他关键字 友情提醒 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 静态的特点…