关于android:Android-Camera-架构

54次阅读

共计 4626 个字符,预计需要花费 12 分钟才能阅读完成。

和你一起一生学习,这里是程序员 Android

本篇文章次要介绍 Android 开发中的局部知识点,通过浏览本篇文章,您将播种以下内容:

一、Android Camera 整体架构简述
二、Camera App 层简述
三、Camera Framework 层简述
四、Camera Hal3 子系统
五、上面须要梳理的重点 - 正在进行

一.Android Camera 整体架构简述

自 Android8.0 之后大多机型采纳 Camera API2 HAL3 架构,
先盗改谷歌的一张图, 读完整部代码后再看这张图, 真的是很清晰, 很简洁, 很到位.
原图:https://source.android.google…

1.1 Android Camera 根本分层

从上图得悉,Android 手机中 Camera 软件次要有大体上有 4 层:

1. 应用层:
 利用开发者调用 AOSP 提供的接口即可,AOSP 的接口即 Android 提供的相机利用的通用接口, 这些接口将通过 Binder 与 Framework 层的相机服务进行操作与数据传递;

2.Framework 层:
 位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp , 相机 Framework 服务是承前启后的作用, 上与利用交互, 下与 HAL 曾交互。

3.Hal 层: 
硬件形象层,Android 定义好了 Framework 服务与 HAL 层通信的协定及接口,HAL 层如何实现有各个 Vendor 本人实现, 如 Qcom 的老架构 mm-Camera, 新架构 Camx 架构,Mtk 的 P 之后的 Hal3 架构.

4.Driver 层: 
驱动层, 数据由硬件到驱动层解决, 驱动层接管 HAL 层数据以及传递 Sensor 数据给到 HAL 层, 这里当然是各个 Sensor 芯片不同驱动也不同.

说到这为什么要分这么多层, 大体上还是为了分清界线, 降级不便, AndroidO Treble 架构剖析.

Android 要适应各个手机组装厂商的不同配置, 不同 sensor, 不管怎么换芯片, 从 Framework 及之上都不须要扭转,App 也不须要扭转就能够在各种配置机器上顺利运行,HAL 层对上的接口也由 Android 定义死, 各个平台厂商只须要依照接口实现适宜本人平台的 HAL 层即可.

1.2 Android Camera 工作大体流程

绿色框中是利用开发者须要做的操作, 蓝色为 AOSP 提供的 API, 黄色为 Native Framework Service, 紫色为 HAL 层 Service.
形容一下步骤:

  1. App 个别在 MainActivity 中应用 SurfaceView 或者 SurfaceTexture+TextureView 或者 GLSurfaceView 等控件作为显示预览界面的控件, 共同点都是蕴含了一个独自的 Surface 作为取相机数据的容器.
  2. 在 MainActivity onCreate 的时候调用 API 去告诉 Framework Native Service CameraServer 去 connect HAL 继而关上 Camera 硬件 sensor.
  3. openCamera 胜利会有回调从 CameraServer 告诉到 App, 在 onOpenedCamera 或相似回调中去调用相似 startPreview 的操作. 此时会创立 CameraCaptureSession, 创立过程中会向 CameraServer 调用 ConfigureStream 的操作,ConfigureStream 的参数中蕴含了第一步中空间中的 Surface 的援用, 相当于 App 将 Surface 容器给到了 CameraServer,CameraServer 包装了下该 Surface 容器为 stream, 通过 HIDL 传递给 HAL, 继而 HAL 也做 configureStream 操作
  4. ConfigureStream 胜利后 CameraServer 会给 App 回调告诉 ConfigStream 胜利, 接下来 App 便会调用 AOSP setRepeatingRequest 接口给到 CameraServer,CameraServer 初始化时便起来了一个死循环线程期待来接管 Request.
  5. CameraServer 将 request 交到 Hal 层去解决, 失去 HAL 处理结果后取出该 Request 的解决 Result 中的 Buffer 填到 App 给到的容器中,SetRepeatingRequest 为了预览, 则交给 Preview 的 Surface 容器, 如果是 Capture Request 则将收到的 Buffer 交给 ImageReader 的 Surface 容器.
  6. Surface 实质上是 BufferQueue 的使用者和封装者, 当 CameraServer 中 App 设置来的 Surface 容器被填满了 BufferQueue 机制将会告诉到利用, 此时 App 中控件取出各自容器中的内容生产掉,Preview 控件中的 Surface 中的内容将通过 View 提供到 SurfaceFlinger 中进行合成最终显示进去, 即预览; 而 ImageReader 中的 Surface 被填了, 则 App 将会取出保留成图片文件生产掉. 参考
  7. 录制视频能够参考该篇, 这里不再赘述:[Android Android MediaRecorder 框架简洁梳理](https://blog.csdn.net/TaylorP…

再简略一张图如下:

二. Camera App 层简述

应用层即利用开发者关注的中央, 次要就是利用 AOSP 提供的利用可用的组件实现用户可见可用的相机利用, 次要的接口及要点在这
Android 开发者 / 文档 / 指南 / 相机

应用层开发者须要做的就是依照 AOSP 的 API 规定提供的接口, 关上相机, 做根本的相机参数的设置, 发送 request 指令, 将收到的数据显示在利用界面或保留到存储中.

应用层开发者不须要关注有手机有几个摄像头他们是什么牌子的, 他们是怎么组合的, 特定模式下哪个摄像头是开或者是关的, 他们利用 AOSP 提供的接口通过 AIDL binder 调用向 Framework 层的 CameraServer 过程下指令, 从 CameraServer 过程中取的数据.

根本过程都如下:

  1. openCamera:Sensor 上电
  2. configureStream: 该步就是将控件如 GLSurfaceView,ImageReader 等中的 Surface 容器给到 CameraServer.
  3. request: 预览应用 SetRepeatingRequest, 拍一张能够应用 Capture, 实质都是 setRequest 给到 CameraServer
  4. CameraServer 将 Request 的处理结果 Buffer 数据填到对应的 Surface 容器中, 填完后由 BufferQueue 机制回调到援用层对应的 Surface 控件的 CallBack 处理函数, 接下来要显示预览或保图片 App 中对应的 Surface 中都有数据了.

次要一个预览控件和拍照保留控件, 视频录制见[Android Android MediaRecorder 框架简洁梳理](https://blog.csdn.net/TaylorP…

三. Camera Framework 层简述

Camera Framework 层即 CameraServer 服务实现.CameraServer 是 Native Service, 代码在
frameworks/av/services/camera/libcameraservice/
CameraServer 承前启后, 上对利用提供 Aosp 的接口服务, 下和 Hal 间接交互. 一般而言,CamerServer 呈现问题的概率极低, 大部分还是 App 层及 HAL 层呈现的问题居多.
CameraServer 架构次要架构也如第一张图所示, 次要还是 Android 本人的事.

3.1 CameraServer 初始化

frameworks/av/camera/cameraserver/cameraserver.rc
service cameraserver /system/bin/cameraserver
    class main
    user cameraserver
    group audio camera input drmrpc
    ioprio rt 4
    writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks
    rlimit rtprio 10 10

CameraServer 由 init 启动, 简略过程如下:

具体过程如下:

3.2 App 调用 CameraServer 的相干操作

简略过程如下:

具体过程如下:

3.2.1 open Camera:

3.2.2 configurestream

3.2.3 preview and capture request:

3.2.4 flush and close

四 Camera Hal3 子系统

Android 官网解说 HAL 子系统
Android 的相机硬件形象层 (HAL) 可将 android.hardware.camera2 中较高级别的相机框架 API 连贯到底层的相机驱动程序和硬件。
Android 8.0 引入了 Treble,用于将 CameraHal API 切换到由 HAL 接口描述语言 (HIDL) 定义的稳固接口。
盗图一张:

1. 利用向相机子系统收回 request, 一个 request 对应一组后果.request 中蕴含所有配置信息。其中包含分辨率和像素格局;手动传感器、镜头和闪光灯控件;3A 操作模式;RAW 到 YUV 解决控件;以及统计信息的生成等. 一次可发动多个申请,而且提交申请时不会呈现阻塞。申请始终依照接管的程序进行解决。

2. 图中看到 request 中携带了数据容器 Surface, 交到 framework cameraserver 中, 打包成 Camera3OutputStream 实例, 在一次 CameraCaptureSession 中包装成 Hal request 交给 HAL 层解决. Hal 层获取到解决数据后返回給 CameraServer, 即 CaptureResult 告诉到 Framework,Framework cameraserver 则失去 HAL 层传来的数据给他放进 Stream 中的容器 Surface 中. 而这些 Surface 正是来自应用层封装了 Surface 的控件, 这样 App 就失去了相机子系统传来的数据.

3.HAL3 基于 captureRequest 和 CaptureResult 来实现事件和数据的传递, 一个 Request 会对应一个 Result.

4. 当然这些是 Android 原生的 HAL3 定义, 接口放在那, 各个芯片厂商实现当然不一样, 其中接触的便是高通的 mm-camera,camx, 联发科的 mtkcam hal3, 前面持续整顿实现过程.

HAL3 接口定义在
http://androidxref.com/9.0.0_…

五. 上面须要梳理的重点 - 正在进行

  1. Camera App 和 Framework 代码暂且梳理到这里, 上面 HAL 层将分为 Qcom 和 Mtk 别离进行代码梳理与架构总结
  2. Android 相机中事件驱动 (request) 与数据 (Buffer) 传递,Buffer 治理等
  3. 相机底层相干模块, 如 ISP,IPE,JPEG 等
  4. Android Camera 开发的 debug 办法

原文链接:https://blog.csdn.net/TaylorP…

情谊举荐:
Android 干货分享

至此,本篇已完结,如有不对的中央,欢迎您的倡议与斧正。同时期待您的关注,感谢您的浏览,谢谢!

正文完
 0