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 控制、统计数据处理等。
关键定位:Camx 是 Android Camera HAL3 在高通平台上的具体实现,所有上层相机请求最终都通过 Camx 转换为 ISP 可执行的硬件指令序列。
架构提示:Camx 并非直接调用驱动,而是通过 CHI(Camera Hardware Interface)层进行硬件抽象,实现平台无关性。

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 硬件单元。

Camx 与 CHI 分层架构图 Android Camera Service (HAL3 接口) Camx HAL 框架 Usecase 管理 | Pipeline 编排 | Request 调度 | Buffer 管理 CHI (Camera Hardware Interface) 硬件能力查询 | Pipeline 创建 | Node 实例化 | 驱动封装 Kernel 驱动 + ISP 硬件 传感器驱动 | ISP 硬件单元 | 统计引擎 | 图像处理模块 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、预捕获
性能关注点:Usecase 的切换开销直接影响相机启动速度和模式切换延迟。合理的 Usecase 设计应尽量减少 Pipeline 重建次数,优先使用 Pipeline 复用策略。

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 传递数据,支持同步和异步模式。
调优要点:Port 的 Buffer 格式和分辨率配置直接影响带宽占用和延迟。在性能调优时,应优先检查 Port 配置是否匹配硬件能力,避免不必要的格式转换和缩放操作。
Camx 核心组件关系图 Usecase (用例) 包含 Pipeline (管线) 由...组成 Node (节点) Node (节点) Node (节点) Port (端口) Port (端口) Port (端口) Usecase 包含多条 Pipeline,Pipeline 由多个 Node 组成,Node 通过 Port 进行数据交换 Port 定义 Buffer 的流向、格式和分辨率,是数据流的关键配置点

1.4 组件协作流程

当上层应用发起一个相机请求时,Camx 核心组件按照以下流程协作:

  1. Usecase 选择:根据应用请求(预览/拍照/录像)选择对应的 Usecase 配置。
  2. Pipeline 创建:Usecase 根据 XML 配置创建所需的 Pipeline 实例,并建立 Node 拓扑。
  3. Port 连接:配置 Node 之间的 Port 连接,设置 Buffer 格式、分辨率和 Queue 深度。
  4. Request 下发:将应用层的 Capture Request 转换为 Pipeline 可执行的硬件指令。
  5. 数据流处理:Sensor Node 采集原始数据,经过 IFE、IPE 等 Node 逐级处理。
  6. 结果返回:处理完成的 Buffer 通过 Port 回传,最终通过 HAL3 接口返回给上层。