2. 高通相机系统基础

在高通平台的相机系统中,从应用层点击快门到最终生成一张照片,中间要经过一条非常长的软硬件协同链路。理解这条链路,是后续进行 3A(AF 自动对焦、AEC 自动曝光、AWB 自动白平衡)调优的前提。因为 3A 算法并不是孤立运行的模块,它既依赖 ISP 提供的统计信息,又通过 CamX/Chi 的请求与结果机制去控制传感器和 ISP 硬件。只有把 Camera HAL、CamX、Chi、ISP 以及 3A 在管线中的位置和数据流梳理清楚,调优时才能知道“改哪个参数、看哪段日志、验证哪个节点”。

一、核心分层:从 App 到硬件的五层结构

高通相机软件栈大致可以分为五层,自顶向下依次是:

  • 应用层(App / Camera2 / CameraX):负责发起拍照、预览、录像请求,设置曝光补偿、对焦模式、白平衡模式等上层参数。
  • Camera HAL(HAL3):Android 定义的硬件抽象接口,负责把 App 的 CaptureRequest 转换为厂商实现可识别的请求,并把结果回传给框架。
  • CamX:高通相机核心框架,负责管线(Pipeline)构建、节点(Node)调度、请求下发与结果聚合,是 3A 与 ISP 之间的中枢。
  • Chi(Camera Hardware Interface):CamX 之上的扩展接口层,用于厂商定制功能、多摄切换、算法挂载和用例(Usecase)管理。
  • ISP 与传感器:Spectra ISP 负责图像信号处理,Sensor 负责曝光与读出,3A 算法通过 I2C/CCI 控制它们。

这五层之间不是简单的调用关系,而是“请求—处理—结果”的闭环。App 下发一次请求,最终会以 metadata + buffer 的形式返回,3A 的收敛状态就体现在返回的 metadata 中。

二、CamX 管线与 3A 的位置

CamX 内部把一次拍照拆解为多个 Node 组成的 Pipeline。典型节点包括:Sensor Node、IFE(Image Front End)、IPE(Image Processing Engine)、BPS(Bayer Processing Segment)、Stats Node、AF Node、AEC/AWB Node 等。其中 3A 算法主要运行在 Stats 处理之后、ISP 参数下发之前,形成一个“统计—决策—下发”的循环。

具体来说,ISP 在 IFE 阶段会输出多种统计信息,例如:

  • AF 统计:对比度、相位差(PDAF)信息,用于对焦决策。
  • AEC 统计:亮度直方图、平均亮度、分区亮度,用于曝光决策。
  • AWB 统计:RGB 通道均值、色温估计,用于白平衡决策。

这些统计信息由 Stats Node 收集后送给 3A 算法,3A 计算出新的曝光时间、增益、对焦位置、白平衡增益等参数,再通过 Sensor Node 和 ISP 配置节点写回硬件。这样就完成了一帧的 3A 闭环。

3A 调优的本质,就是调整这个闭环中的“决策逻辑”和“参数边界”,而不是直接修改 ISP 输出图像。

三、数据流:一次拍照请求的完整路径

下面用一段简化的伪代码描述一次拍照请求在 CamX 中的流转过程,帮助理解 3A 在其中的位置:

App: CaptureRequest
  → Camera HAL: 转换为 ChiCaptureRequest
  → Chi: 选择 Usecase / Pipeline
  → CamX: 构建 Pipeline,创建 Nodes
  → Sensor Node: 配置曝光/增益/对焦
  → IFE: 输出 Raw + Stats
  → Stats Node: 收集 AF/AEC/AWB 统计
  → 3A Node: 计算新参数
  → Sensor/ISP Node: 下发新参数
  → IPE/BPS: 图像后处理
  → CamX: 聚合 Result
  → HAL: 返回 CaptureResult + Image

可以看到,3A 处于“统计之后、下发之前”的关键位置。它既不是最上层,也不是最底层,而是连接感知与控制的决策层。

四、关键模块对比与职责清单

为了更清晰地理解各层职责,下面用表格对比 Camera HAL、CamX、Chi、ISP 和 3A 的核心作用:

模块 主要职责 与 3A 的关系
Camera HAL 提供 Android 标准接口,转换请求与结果 透传 3A 相关 metadata
CamX 管线调度、节点管理、请求下发 承载 3A Node 运行
Chi 厂商定制、Usecase 管理、算法挂载 决定 3A 算法如何被加载
ISP 图像处理与统计信息生成 为 3A 提供输入统计
3A 算法 AF/AEC/AWB 决策与参数计算 核心调优对象

五、案例场景:预览卡顿与 3A 收敛

假设在调试某款高通平台手机时,发现预览画面在暗光下频繁闪烁,曝光忽明忽暗。排查思路如下:

  1. 先确认 App 下发的曝光补偿和测光模式是否稳定。
  2. 查看 CamX 日志中 AEC Node 的统计输入是否噪声过大。
  3. 检查 ISP 的 AEC 统计分区是否合理,是否因为分区过小导致统计跳变。
  4. 确认 3A 的收敛速度和阻尼系数是否设置过激。
  5. 最后验证 Sensor 曝光和增益的写入是否与 3A 输出一致。

这个案例说明,3A 问题往往不是单一模块造成的,而是数据流中某一环的统计或参数异常。只有理解整条链路,才能快速定位。

调优时建议同时打开 CamX 日志和 3A 调试日志,重点关注 Stats 输入与 3A 输出之间的对应关系。

六、常见误区与复盘

  • 误区一:认为 3A 只存在于算法库中。实际上 3A 依赖 CamX 的调度和 ISP 的统计,脱离管线无法独立工作。
  • 误区二:只改 3A 参数,不看 ISP 统计。如果统计本身失真,再好的 3A 逻辑也无法收敛。
  • 误区三:忽略 Chi 的 Usecase 差异。不同 Usecase 下管线节点不同,3A 的行为也可能不同。
  • 误区四:把 HAL 当作纯透传层。HAL 的 metadata 转换错误会直接导致 3A 收到错误请求。

复盘时,建议按照“App → HAL → Chi → CamX → ISP → 3A → Sensor”的顺序逐层检查,确认每一层的输入输出是否符合预期。这样才能把 3A 调优从“凭感觉试参数”变成“有依据地改逻辑”。

高通相机系统分层与 3A 数据流 应用层:Camera2 / CameraX / 厂商相机 App Camera HAL:CaptureRequest / CaptureResult 转换 Chi Usecase / 算法挂载 / 多摄切换 CamX Pipeline / Node 调度 / 请求聚合 ISP(Spectra) IFE / BPS / IPE / 统计输出 Sensor 曝光 / 增益 / 对焦马达 3A 算法 AF / AEC / AWB 决策与参数计算 统计信息 控制参数 结果回传 请求下发 统计输入 参数控制 结果回传