相机 HAL

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

Android 的相机硬件抽象层 (HAL) 将android.hardware.camera2中更高级别的相机框架 API 连接到您的底层相机驱动程序和硬件。从 Android 13 开始,相机 HAL 接口开发使用AIDL 。 Android 8.0 引入了Treble ,将 Camera HAL API 切换为由 HAL 接口描述语言 (HIDL) 定义的稳定接口。如果您之前为 Android 7.0 及更低版本开发过相机 HAL 模块和驱动程序,请注意相机管道中的重大变化。

AIDL 相机 HAL

对于运行 Android 13 或更高版本的设备,相机框架包括对 AIDL 相机 HAL 的支持。相机框架还支持 HIDL 相机 HAL,但在 Android 13 或更高版本中添加的相机功能只能通过 AIDL 相机 HAL 接口使用。要在升级到 Android 13 或更高版本的设备上实现此类功能,设备制造商必须将其 HAL 流程从使用 HIDL 摄像头接口迁移到 AIDL 摄像头接口。

要了解 AIDL 的优势,请参阅用于 HAL 的 AIDL

实现 AIDL 相机 HAL

有关 AIDL 相机 HAL 的参考实现,请参阅hardware/google/camera/common/hal/aidl_service/

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

对于迁移到 AIDL 的设备,设备制造商可能需要根据代码结构修改Android SELinux 策略 (sepolicy)和 RC 文件。

验证 AIDL 相机 HAL

要测试您的 AIDL 相机 HAL 实施,请确保设备通过所有 CTS 和 VTS 测试。 Android 13 引入了 AIDL VTS 测试VtsAidlHalCameraProvider_TargetTest.cpp

相机 HAL3 功能

Android Camera API 重新设计的目的是大幅提高应用程序控制 Android 设备上的相机子系统的能力,同时重新组织 API 以使其更高效和可维护。额外的控制使得在 Android 设备上构建高质量的相机应用程序变得更加容易,这些应用程序可以在多个产品上可靠地运行,同时仍然尽可能使用设备特定的算法来最大限度地提高质量和性能。

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

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

简单来说,应用程序框架向摄像头子系统请求一帧,摄像头子系统将结果返回到输出流。此外,还会为每组结果生成包含色彩空间和镜头阴影等信息的元数据。您可以将相机版本 3 视为相机版本 1 的单向流的管道。它将每个捕获请求转换为传感器捕获的一个图像,该图像被处理为:

  • 带有关于捕获的元数据的结果对象。
  • 一到 N 个图像数据缓冲区,每个缓冲区都有自己的目标表面。

一组可能的输出表面是预先配置好的:

  • 每个表面都是固定分辨率的图像缓冲区流的目的地。
  • 一次只能将少量表面配置为输出 (~3)。

请求包含所有所需的捕获设置和输出表面列表,以便为该请求将图像缓冲区推入(在总配置集之外)。请求可以是一次性的(使用capture() ),也可以无限重复(使用setRepeatingRequest() )。捕获优先于重复请求。

相机数据模型

图 1.相机核心运行模型

相机 HAL1 概述

相机子系统的版本 1 设计为具有高级控件和以下三种操作模式的黑盒:

  • 预习
  • 录像
  • 仍然捕获

每种模式都有略微不同和重叠的功能。这使得难以实现新功能,例如介于两种操作模式之间的突发模式。

相机框图

图 2.相机组件

Android 7.0 继续支持相机 HAL1,因为许多设备仍然依赖它。此外,Android 摄像头服务支持同时实现 HAL(1 和 3),这在您希望使用摄像头 HAL1 支持功能较弱的前置摄像头和使用摄像头 HAL3 的更高级的后置摄像头时非常有用。

有一个单独的相机 HAL模块(有自己的版本号),其中列出了多个独立的相机设备,每个设备都有自己的版本号。摄像头模块 2 或更新版本需要支持设备 2 或更新版本,并且此类摄像头模块可以有多种摄像头设备版本(这就是我们所说的 Android 支持实现这两种 HAL 的意思)。