2. Camera HAL 架构基础:Android HAL3 架构、Pipeline 模型与关键接口
在功耗优化驱动的性能 Profiling 中,理解 Camera HAL 架构是定位瓶颈的前提。Android Camera HAL3 是当前主流框架,它摒弃了 HAL1 的固定管线,采用灵活的 Pipeline 模型,允许 SoC 厂商自定义处理流。本章将拆解 HAL3 的核心架构、Pipeline 数据流以及三个关键接口:open、close、process_capture_request。
2.1 Android Camera HAL3 架构总览
HAL3 架构分为三层:Application Framework、Camera Service 和 Camera HAL。其中 HAL 层直接与硬件交互,是功耗优化的主战场。
2.2 Pipeline 模型:从 Request 到 Frame
HAL3 的核心抽象是 Pipeline——一个可配置的硬件处理链。每个 capture request 被拆分为多个阶段,依次经过 Sensor 曝光、ISP 处理、统计计算和输出合成。Pipeline 模型允许 SoC 厂商插入自定义硬件加速模块,同时也为功耗 Profiling 提供了清晰的阶段边界。
| Pipeline 阶段 | 主要操作 | 功耗敏感点 |
|---|---|---|
| Sensor Readout | 曝光、行读出、增益调整 | 帧率、分辨率、HDR 模式 |
| ISP Processing | 去噪、Demosaic、颜色校正 | 时钟频率、处理单元数 |
| Statistics | AE/AWB/AF 统计计算 | 3A 算法频率、DSP 负载 |
| Output Stream | YUV/JPEG/HEIF 编码、DMA 传输 | 编码器功耗、带宽 |
2.3 关键接口详解
HAL3 通过 camera3_device_ops_t 结构体暴露接口。功耗 Profiling 最关注以下三个函数:
2.3.1 open() —— 设备初始化与功耗基线
open() 在 Camera Service 启动时调用,负责初始化 Sensor、ISP 和内存池。此阶段会建立功耗基线,包括:
- 时钟与电源域:开启 Sensor 时钟、ISP 电源、总线时钟。
- 内存分配:分配 Gralloc buffer、统计 buffer。
- Pipeline 配置:设置流数量、分辨率、格式。
open() 前后测量电流跳变,可以评估硬件模块的静态功耗。如果 open() 后电流过高,说明有模块未正确进入低功耗模式。
2.3.2 close() —— 资源释放与功耗收敛
close() 负责关闭设备、释放 buffer、关闭时钟。功耗 Profiling 需要验证:
- 所有 DMA 通道是否停止。
- ISP 和 Sensor 是否进入断电状态。
- 内存是否完全释放(防止泄漏导致持续功耗)。
// 典型的 close() 实现片段
static int close(struct hw_device_t *device) {
camera3_device_t *cam_dev = (camera3_device_t *)device;
CameraModule *module = (CameraModule *)cam_dev->priv;
// 停止所有 ongoing capture
module->pipeline->flush();
// 关闭 Sensor 电源
module->sensor->power_down();
// 释放 ISP 资源
module->isp->deinit();
// 释放 buffer 池
module->buffer_manager->free_all();
// 关闭设备文件描述符
close(module->fd);
return 0;
}
2.3.3 process_capture_request() —— 帧级功耗热点
这是最关键的接口,每帧调用一次。它接收 camera3_capture_request_t,包含:
- settings:3A 参数、AE 模式、帧率控制。
- output_buffers:目标 buffer 列表。
- input_buffer:ZSL 或 reprocess 输入。
功耗 Profiling 在此接口内插入探针,可以精确测量每帧的处理时间和电流消耗。
| 参数 | 说明 | 功耗影响 |
|---|---|---|
frame_number |
帧序号,用于追踪 | 无直接功耗影响 |
settings |
AE/AWB/AF 参数 | 高帧率或长曝光增加功耗 |
output_buffers |
输出流数量与格式 | 多流、高分辨率增加带宽 |
input_buffer |
重处理输入 | 增加 ISP 负载 |
2.4 关键数据结构
HAL3 使用 camera3_stream_t 和 camera3_capture_request_t 描述数据流。理解这些结构体是 Profiling 的基础。
// camera3_capture_request_t 核心字段
typedef struct camera3_capture_request {
uint32_t frame_number; // 帧序号
const camera3_stream_t **output_buffers; // 输出流数组
uint32_t num_output_buffers; // 输出流数量
const camera3_stream_t *input_buffer; // 输入流(ZSL/reprocess)
const camera_metadata_t *settings; // 帧参数
} camera3_capture_request_t;
num_output_buffers 大于 1(多流场景),Pipeline 需要同时处理多个输出,ISP 和 DMA 带宽会成倍增加。Profiling 时必须区分单流和多流功耗差异。
2.5 本章小结
- HAL3 架构分为 App、Service、HAL 三层,功耗优化集中在 HAL 层。
- Pipeline 模型将处理过程分为 Sensor、ISP、Stats、Output 四个阶段,每个阶段都可独立 Profiling。
open()建立功耗基线,close()验证功耗收敛,process_capture_request()是帧级功耗热点。- 多流场景是功耗 Profiling 的重点和难点。