1. Camx 整体架构概览
Camx(Camera eXtension)是高通平台 Android HAL 层相机框架的核心实现,位于 Android Camera HAL3 接口与底层 ISP 硬件之间。理解 Camx 在 Android 相机架构中的位置、与 CHI 的关系以及核心组件,是进行 Pipeline 配置与性能调优的基础。
1.1 Camx 在 Android HAL 中的位置
Android 相机 HAL 层采用分层设计,Camx 作为高通平台的 HAL 实现,承担着承上启下的关键角色:
- 上层接口:实现 Android 定义的
camera3_device_t和camera3_callback_ops_t标准 HAL3 接口,与 Camera Service 通信。 - 下层驱动:通过内核驱动与 ISP(图像信号处理器)、传感器、闪光灯等硬件交互。
- 核心职责:Session 管理、Request 分发、Pipeline 调度、Buffer 管理、3A 控制、统计数据处理等。
1.2 Camx 与 CHI 的关系
CHI(Camera Hardware Interface)是高通提供的硬件抽象层,位于 Camx 与底层驱动之间。两者的关系可以用下表概括:
| 维度 | Camx | CHI |
|---|---|---|
| 定位 | HAL 框架层,实现 Android 标准接口 | 硬件抽象层,封装 ISP 驱动细节 |
| 职责 | Usecase 管理、Pipeline 编排、Request 处理 | 硬件能力查询、Pipeline 创建、Node 实例化 |
| 配置方式 | XML 描述 Usecase 和 Pipeline 拓扑 | XML 描述硬件节点属性和连接关系 |
| 依赖关系 | 调用 CHI API 创建和管理硬件 Pipeline | 被 Camx 调用,向上提供统一硬件接口 |
| 平台适配 | 高通平台通用,OEM 可定制 Usecase | 芯片平台相关,不同 SoC 有不同 CHI 配置 |
简单来说,Camx 负责"做什么"(业务逻辑),CHI 负责"怎么做"(硬件执行)。Camx 通过 CHI API 创建硬件 Pipeline,CHI 负责将 Pipeline 映射到实际的 ISP 硬件单元。
1.3 Camx 核心组件介绍
Camx 框架围绕四个核心抽象组件构建:Usecase、Pipeline、Node、Port。这四个组件构成了从业务需求到硬件执行的完整链路。
1.3.1 Usecase(用例)
Usecase 是 Camx 中最上层的业务抽象,代表一个完整的相机使用场景。每个 Usecase 定义了一组 Pipeline 的拓扑结构和执行策略。
| Usecase 类型 | 典型场景 | 包含 Pipeline 数量 | 特点 |
|---|---|---|---|
| Preview | 相机预览 | 1~2 条 | 低延迟、持续运行 |
| Snapshot | 拍照 | 2~4 条 | 高分辨率、多帧融合 |
| Video | 视频录制 | 2~3 条 | 稳定帧率、编码输入 |
| HDR | 高动态范围拍照 | 3~5 条 | 多帧合成、对齐处理 |
| ZSL | 零快门延迟 | 2~3 条 | 环形 Buffer、预捕获 |
1.3.2 Pipeline(管线)
Pipeline 是 Camx 中硬件处理的核心执行单元,由多个 Node 按拓扑顺序连接而成。每个 Pipeline 对应 ISP 硬件上的一条完整处理链路。
- Pipeline 类型:
- Real-time Pipeline:直接连接传感器,处理实时数据流,如预览、视频。
- Offline Pipeline:处理已捕获的 Buffer,如后处理、重处理。
- Pipeline 生命周期:创建 → 配置 → 激活 → 运行 → 停用 → 销毁。
- Pipeline 拓扑:由 XML 配置文件描述,定义 Node 之间的连接关系和 Buffer 流向。
<!-- Pipeline 配置示例(简化) -->
<Pipeline name="preview_pipeline" id="0x1001">
<Node name="sensor_node" type="Sensor">
<OutputPort name="raw_output"/>
</Node>
<Node name="ife_node" type="IFE">
<InputPort name="raw_input" source="sensor_node.raw_output"/>
<OutputPort name="yuv_output"/>
</Node>
<Node name="ipe_node" type="IPE">
<InputPort name="yuv_input" source="ife_node.yuv_output"/>
<OutputPort name="display_output"/>
</Node>
</Pipeline>
1.3.3 Node(节点)
Node 是 Pipeline 中的最小处理单元,代表 ISP 硬件上的一个具体功能模块。每个 Node 负责特定的图像处理任务。
| Node 类型 | 硬件模块 | 主要功能 | 性能关键指标 |
|---|---|---|---|
| Sensor | 图像传感器 | 曝光控制、增益调节、帧率控制 | 帧率、曝光延迟 |
| IFE | 图像前端引擎 | Bayer 处理、去噪、黑电平校正 | 吞吐量、延迟 |
| IPE | 图像处理引擎 | YUV 处理、缩放、色彩校正 | 分辨率、帧率 |
| BPS | Bayer 处理流 | 统计计算、HDR 融合 | 计算精度、带宽 |
| Stats | 统计引擎 | AE/AWB/AF 统计信息生成 | 统计精度、更新频率 |
1.3.4 Port(端口)
Port 是 Node 之间数据交换的接口,定义了 Buffer 的流向和格式。每个 Node 可以有多个输入端口和输出端口。
- Input Port:接收上游 Node 的 Buffer,定义输入格式和分辨率。
- Output Port:向下游 Node 发送处理后的 Buffer,定义输出格式和分辨率。
- Port 连接:通过 XML 配置将上游 Output Port 连接到下游 Input Port,形成数据流。
- Buffer 管理:Port 之间通过 Buffer Queue 传递数据,支持同步和异步模式。
1.4 组件协作流程
当上层应用发起一个相机请求时,Camx 核心组件按照以下流程协作:
- Usecase 选择:根据应用请求(预览/拍照/录像)选择对应的 Usecase 配置。
- Pipeline 创建:Usecase 根据 XML 配置创建所需的 Pipeline 实例,并建立 Node 拓扑。
- Port 连接:配置 Node 之间的 Port 连接,设置 Buffer 格式、分辨率和 Queue 深度。
- Request 下发:将应用层的 Capture Request 转换为 Pipeline 可执行的硬件指令。
- 数据流处理:Sensor Node 采集原始数据,经过 IFE、IPE 等 Node 逐级处理。
- 结果返回:处理完成的 Buffer 通过 Port 回传,最终通过 HAL3 接口返回给上层。