3. Camera HAL3 核心架构
Android Camera HAL3(即 Camera3 HAL)是 Android 从 Lollipop 开始引入的新一代相机硬件抽象层。与 HAL1 的“黑盒”设计不同,HAL3 将相机子系统拆解为多个可组合的构建块,赋予框架对 ISP 流水线的精细控制权。本章深入剖析 HAL3 的四大核心支柱:Pipeline 模型、Capture Request 与 Result、Stream 与 Buffer 管理、Metadata 系统。
3.1 Pipeline 模型:从 Request 到 Frame 的流水线
HAL3 的核心是一个异步流水线模型。应用层提交一个 Capture Request,HAL 驱动将其解析并送入内部处理管线,最终产出一个 Capture Result。整个过程是流水线化的,允许同时有多个 Request 在不同阶段被处理,从而最大化帧率。
3.2 Capture Request 与 Result
HAL3 的每一次拍照或预览都由一个 Capture Request 发起,对应一个 Capture Result 返回。这种“请求-响应”模式是 HAL3 控制相机行为的唯一途径。
3.2.1 Capture Request 结构
一个 Request 包含以下核心信息:
| 字段 | 类型 | 说明 |
|---|---|---|
| streams | List<Stream> | 指定输出目标流(预览、拍照、视频等) |
| settings | CaptureRequest.Metadata | 包含 AE/AWB/AF 模式、曝光时间、ISO、裁剪区域等参数 |
| inputBuffer | Buffer | 仅 reprocess 请求使用,指定输入 buffer |
| outputBuffers | List<Buffer> | 每个 stream 对应的输出 buffer 列表 |
3.2.2 Capture Result 结构
Result 是 Request 的完成反馈,包含:
- metadata:实际使用的 3A 参数、传感器时间戳、统计信息等。
- outputBuffers:填充完成的图像 buffer,每个 buffer 关联一个 stream。
- inputBuffer:reprocess 请求的输入 buffer(已释放)。
- partialResult:部分结果,用于提前通知框架某些 metadata 已就绪。
3.3 Stream 与 Buffer 管理
Stream 定义了图像数据的去向和格式。Buffer 则是承载图像数据的实际内存块。HAL3 要求驱动实现高效的 Buffer 管理,避免内存拷贝和抖动。
3.3.1 Stream 配置
Stream 在 CameraDevice 创建时通过 configureStreams() 配置,包含以下属性:
| 属性 | 可选值示例 | 说明 |
|---|---|---|
| format | YUV_420_888, JPEG, RAW10, HEIC | 像素格式 |
| width/height | 1920x1080, 4000x3000 | 分辨率 |
| usage | GRALLOC_USAGE_HW_TEXTURE, GRALLOC_USAGE_HW_CAMERA_WRITE | Buffer 用途标记 |
| maxBuffers | 3, 4, 8 | HAL 建议的 buffer 池深度 |
| dataSpace | HAL_DATASPACE_STANDARD_BT709, HAL_DATASPACE_V0_JFIF | 色彩空间 |
3.3.2 Buffer 生命周期
Buffer 在 HAL 与 Framework 之间流转,遵循以下状态机:
- Framework 注册:通过
registerBuffer()将 buffer 句柄交给 HAL。 - HAL 锁定:HAL 调用
lockBuffer()获取 CPU/GPU 访问权限。 - HAL 填充:ISP 写入图像数据。
- HAL 释放:HAL 调用
unlockBuffer()并回调processCaptureResult()。 - Framework 消费:Framework 将 buffer 送显或编码。
3.4 Metadata 系统
Metadata 是 HAL3 的“控制面板”和“状态报告”。它使用静态标签(static metadata)描述硬件能力,使用动态标签(dynamic metadata)传递每一帧的控制参数和结果数据。
3.4.1 Metadata 分类
| 类型 | 作用域 | 示例 |
|---|---|---|
| Static | Camera 全局 | SCALER_AVAILABLE_STREAM_CONFIGURATIONS, SENSOR_INFO_SENSITIVITY_RANGE |
| Dynamic (Request) | 单帧控制 | CONTROL_AE_MODE, SENSOR_EXPOSURE_TIME, JPEG_QUALITY |
| Dynamic (Result) | 单帧结果 | STATISTICS_LENS_SHADING_MAP, SENSOR_TIMESTAMP, CONTROL_AE_STATE |
3.4.2 关键 Metadata 标签
以下标签是 HAL 驱动必须正确实现的:
- CONTROL_AE_MODE / CONTROL_AWB_MODE / CONTROL_AF_MODE:3A 控制核心。
- CONTROL_CAPTURE_INTENT:区分预览、拍照、视频录制等场景。
- ANDROID_SENSOR_EXPOSURE_TIME / SENSOR_SENSITIVITY:手动曝光控制。
- ANDROID_JPEG_QUALITY / JPEG_ORIENTATION:JPEG 编码参数。
- ANDROID_STATISTICS_FACE_DETECT_MODE:人脸检测开关。
3.4.3 Metadata 传递流程
Metadata 在 Framework 与 HAL 之间通过 CameraMetadata 对象传递。底层使用键值对序列化,支持 int32、float、int64、double、byte 及数组类型。HAL 驱动需要实现以下接口:
// 静态 metadata 填充(在 camera_info 中)
static const camera_metadata_t* get_static_metadata() {
camera_metadata_t* meta = allocate_camera_metadata(ENTRY_COUNT, DATA_COUNT);
// 填充 ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE
int64_t range[] = {1000L, 300000000L}; // 1ms ~ 300ms
add_camera_metadata_entry(meta,
ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
range, 2);
// ... 其他静态标签
return meta;
}
// 动态 metadata 处理(在 process_capture_request 中)
int process_capture_request(const camera3_capture_request_t* request) {
camera_metadata_ro_entry_t entry;
find_camera_metadata_ro_entry(request->settings,
ANDROID_CONTROL_AE_MODE, &entry);
uint8_t ae_mode = entry.data.u8[0];
// 根据 ae_mode 配置硬件
// ...
return OK;
}
3.5 核心架构总结
HAL3 的四大核心组件相互配合,构成了一个高效、可扩展的相机驱动框架:
| 组件 | 职责 | 关键接口/数据结构 |
|---|---|---|
| Pipeline 模型 | 异步调度 Request,最大化硬件利用率 | process_capture_request(), flush() |
| Capture Request/Result | 定义单帧的输入参数和输出结果 | camera3_capture_request_t, camera3_capture_result_t |
| Stream & Buffer | 管理图像数据的流向和内存 | configure_streams(), register_buffer(), camera3_stream_t |
| Metadata 系统 | 提供硬件能力描述和帧级控制 | camera_metadata_t, ANDROID_* 标签 |