2. Camera HAL 架构基础:Android Camera HAL3 接口定义、Pipeline 模型、Capture Request 与 Result 流程

2.1 Android Camera HAL3 接口定义

Android Camera HAL3(HAL v3)是 Android 从 Lollipop(API 21)开始引入的下一代相机硬件抽象层接口。与 HAL1 的“黑盒”设计不同,HAL3 将相机传感器、ISP、镜头等硬件能力以 Capability 和 Metadata 的形式暴露给上层框架,使 Camera Service 能够精细控制每一帧的采集与处理参数。

核心设计理念:HAL3 不再提供固定的预览/拍照/录像模式,而是通过 Capture Request 描述“每一帧想要什么”,通过 Capture Result 描述“这一帧实际得到了什么”。这种 Request-Result 模型为 AI 场景识别在 HAL 层的动态调度提供了精确的注入点。

2.2 HAL3 核心接口与数据结构

接口/结构体 方向 关键职责
camera3_device_t Framework → HAL 设备打开、关闭、初始化操作
camera3_callback_ops_t HAL → Framework 通知框架:Buffer 就绪、Result 返回、错误上报
camera3_stream_t Framework → HAL 定义数据流类型(预览/拍照/视频)、分辨率、格式
camera3_stream_buffer_t 双向 单个 Buffer 的句柄、状态、Fence 同步
camera3_capture_request_t Framework → HAL 单帧采集请求:目标流、Metadata、物理 Camera ID
camera3_capture_result_t HAL → Framework 单帧采集结果:输出 Buffer、Metadata、部分结果标记
AI 优化切入点:camera3_capture_request_t 中的 settings(Metadata)是 AI 场景识别注入 3A 参数、HDR 策略、降噪强度的关键通道。HAL 层可以在 process_capture_request 回调中修改该 Metadata 后再下发到 ISP Pipeline。

2.3 Pipeline 模型:从 Request 到 Result 的流水线

HAL3 的 Pipeline 模型将相机处理链路抽象为一条可配置的流水线。每一帧从 Sensor 曝光开始,经过 ISP、统计引擎、后处理模块,最终输出到指定的 Stream Buffer。Pipeline 的核心特征包括:

  • 深度流水线(Deep Pipeline): 允许同时有多个 Request 在 Pipeline 中处于不同阶段,提高帧率。
  • 部分结果(Partial Result): HAL 可以在 ISP 完成统计后立即返回 Partial Result,框架无需等待全帧处理完成即可开始 3A 计算。
  • 同步 Fence: 通过 acquire_fence 和 release_fence 实现 Buffer 的跨硬件同步,避免撕裂。
Camera HAL3 Pipeline 模型:Request → Result 流水线 Capture Request Sensor 曝光 ISP 处理 统计引擎 后处理 Capture Result Pipeline 关键特性: • 深度流水线:最多可同时处理 4~6 个 Request,帧间隔由最慢阶段决定 • 部分结果:统计引擎完成后即可返回 Partial Result,加速 3A 收敛

2.4 Capture Request 与 Result 完整流程

一次完整的 Capture 会话从 Framework 下发 Request 开始,到 HAL 返回 Result 结束。以下是标准流程的 6 个关键步骤:

  1. Request 下发: Camera Service 调用 process_capture_request(),传入 camera3_capture_request_t,包含目标 Stream、Metadata、Input Buffer(若适用)。
  2. HAL 预处理: HAL 解析 Metadata,根据场景识别结果(如夜景、人像、运动)动态调整 AE/AGC/AWB 目标值、降噪强度、边缘增强参数。
  3. Sensor 曝光: HAL 驱动 Sensor 按照 Request 中的曝光时间、增益、帧间隔进行曝光,输出 RAW 数据。
  4. ISP 管线处理: RAW 数据经过黑电平校正、去马赛克、白平衡、颜色校正、Gamma、缩放等模块,输出 YUV/JPEG/HEIC。
  5. 统计与部分结果: ISP 统计引擎计算 AE/AWB/AF 统计数据,HAL 通过 process_capture_result() 返回 Partial Result。
  6. 最终结果返回: 所有输出 Buffer 填充完成,HAL 返回 Final Result,包含完整的 Metadata 和 Buffer 句柄。
AI 调度关键约束:HAL 必须在 process_capture_request() 返回前完成所有 Metadata 修改。一旦 Request 进入 Pipeline,AI 场景识别模块不能再修改该帧的参数。因此,AI 推理必须在 Request 下发前或下发瞬间完成,通常采用“提前一帧推理”策略。

2.5 Request-Result 生命周期与同步模型

阶段 触发时机 AI 介入点
Request 排队 Framework 调用 process_capture_request AI 场景分类器在此阶段修改 Metadata
Sensor 曝光 HAL 驱动 Sensor 开始曝光 无(硬件锁定)
ISP 处理 RAW 数据进入 ISP 管线 可注入 ISP 调色 LUT 或降噪强度
统计返回 ISP 完成统计计算 AI 可基于统计结果调整后续 Request
Result 返回 所有 Buffer 填充完成 AI 可分析 Result 中的实际参数用于模型更新
Capture Request → Result 生命周期与 AI 注入点 t Request 排队 Sensor 曝光 ISP 处理 统计返回 Result 返回 AI 修改 Metadata AI 注入 ISP 参数 AI 调整后续策略

2.6 HAL3 与 AI 场景识别的接口适配要点

在 HAL 层实现 AI 场景识别调度,需要重点关注以下接口适配:

  • Metadata 动态修改: 在 process_capture_request() 中,通过 ACameraMetadata_copyEntry() 读取 Request 中的 ANDROID_CONTROL_AE_MODE、ANDROID_CONTROL_AWB_MODE 等 Tag,根据 AI 场景分类结果改写后写回。
  • Stream 配置协商: 在 configure_streams() 阶段,AI 场景识别可以影响 Stream 的分辨率选择(如夜景模式降低分辨率换取信噪比)。
  • Partial Result 加速: AI 场景识别模块可以订阅 Partial Result 中的统计信息,提前判断场景是否发生变化,避免等待完整帧。
  • 错误恢复: 当 AI 注入的参数导致 Sensor 过曝或欠曝时,HAL 需要回退到保守参数,并通过 notify() 上报错误。
最佳实践:建议在 HAL 层维护一个 AI 场景状态机,缓存最近 3~5 帧的场景识别结果,避免单帧误判导致参数剧烈抖动。状态机输出稳定的场景标签后,再修改 Metadata 下发到 Pipeline。