2. Camera HAL3 核心概念:Pipeline、Stream、Buffer、Session、Request、Result
Camera HAL3 架构围绕一套严格定义的核心概念构建,这些概念共同构成了从应用层请求到硬件捕获图像,再返回结果的完整数据通路。理解 Pipeline、Stream、Buffer、Session、Request 和 Result 是进行多 Camera 配置与兼容性调试的基础。
2.1 概念总览与关系图
下图展示了这六大核心概念在 HAL3 架构中的层级关系与数据流动方向。Session 作为顶层容器,管理多个 Pipeline;每个 Pipeline 处理特定的 Stream;Buffer 是 Stream 的数据载体;Request 驱动一次捕获循环;Result 则是捕获的最终产出。
2.2 Pipeline(管线)
Pipeline 是 HAL3 中硬件处理能力的抽象表示。它代表一条从传感器输入到图像输出的完整处理链路,通常对应一个物理 Camera 设备或一个逻辑 Camera 的内部处理单元。
- 物理 Pipeline: 直接对应一个物理 Camera 传感器及其 ISP 处理路径。
- 逻辑 Pipeline: 在多摄系统中,由多个物理 Pipeline 通过软件融合而成,对外表现为一个统一的 Pipeline。
- 并发 Pipeline: 支持同时运行多个 Pipeline,以实现多路视频流或同时预览与拍照。
camera_profiles.xml 中定义的 Pipeline 组合是兼容性调试的第一步。
2.3 Stream(流)与 Buffer(缓冲区)
Stream 定义了从 Pipeline 输出的图像数据的格式、分辨率和用途。Buffer 则是实际存储图像数据的内存块,Stream 与 Buffer 之间是“配置”与“实例”的关系。
| Stream 类型 | 典型用途 | 常见格式 | Buffer 数量 |
|---|---|---|---|
| PREVIEW | 取景器显示 | NV12 / YUV420 | 3 ~ 4 |
| STILL_CAPTURE | 高分辨率拍照 | JPEG / RAW10 | 1 ~ 2 |
| VIDEO_RECORD | 视频编码输入 | NV12 / YV12 | 4 ~ 8 |
| DEPTH | 深度图输出 | DEPTH16 / DEPTH_POINT_CLOUD | 1 ~ 2 |
| RAW | DNG 原始数据 | RAW10 / RAW16 | 1 |
Buffer 管理是 HAL3 性能优化的关键。HAL 层通过 dequeue_buffer / enqueue_buffer 机制与 Camera 框架交互,实现零拷贝或低延迟的数据传递。
// Stream 配置结构体示例 (C++ 伪代码)
struct StreamConfig {
uint32_t width; // 宽度
uint32_t height; // 高度
int32_t format; // 像素格式 (HAL_PIXEL_FORMAT_*)
uint32_t usage; // 使用标记 (GRALLOC_USAGE_*)
uint32_t max_buffers; // 最大 Buffer 数量
void* priv; // HAL 私有数据
};
2.4 Session(会话)
Session 是 Camera 设备打开后,到关闭前的一个完整生命周期。它负责管理所有 Pipeline 的创建、配置和销毁。在多摄系统中,一个 Session 可以同时管理多个物理或逻辑 Pipeline。
- Session 创建: 应用调用
open()时创建,此时 HAL 加载硬件固件。 - Session 配置: 通过
configure_streams()设置所有 Stream 的格式和 Pipeline 映射。 - Session 销毁: 应用调用
close()时销毁,释放所有硬件资源。
configure_streams() 返回错误。调试时应检查 logcat 中的 CAM_HAL_ERR 标签。
2.5 Request(请求)与 Result(结果)
Request 和 Result 构成了 HAL3 的捕获循环。每一次捕获操作都由一个 Request 发起,最终由一个 Result 完成。
Request 的关键字段:
streams:指定输出到哪些 Stream 的 Buffer。settings:包含 AE/AWB/AF 等 3A 参数,以及手动曝光、ISO、焦距等控制项。input_buffer:用于 reprocessing 场景的输入 Buffer。
Result 的关键字段:
output_buffers:填充了图像数据的 Buffer 列表。metadata:包含实际使用的 3A 参数、时间戳、传感器统计信息等。partial_result:支持部分结果返回,用于低延迟场景。
// Request 与 Result 的 HAL 接口定义 (简化)
struct CaptureRequest {
uint32_t frame_number;
const Stream* output_streams; // 输出流数组
uint32_t num_output_streams;
const Buffer* input_buffer; // 可选输入
const Metadata* settings; // 捕获参数
};
struct CaptureResult {
uint32_t frame_number;
const Buffer* output_buffers; // 输出 Buffer 数组
uint32_t num_output_buffers;
const Metadata* metadata; // 结果元数据
uint32_t partial_result; // 部分结果序号
};
dumpsys media.camera 可以查看当前活跃的 Request 队列状态。
2.6 核心概念总结表
| 概念 | 作用 | 生命周期 | 调试关注点 |
|---|---|---|---|
| Pipeline | 硬件处理路径抽象 | Session 内创建/销毁 | 并发 Pipeline 数量限制 |
| Stream | 定义输出格式与用途 | Session 配置阶段 | 格式/分辨率兼容性 |
| Buffer | 图像数据内存载体 | Request 到 Result 期间 | 内存泄漏 / 空指针 |
| Session | 管理 Pipeline 生命周期 | open() 到 close() | configure_streams 失败 |
| Request | 发起一次捕获 | 提交到完成 | 参数设置错误 |
| Result | 返回捕获数据与元数据 | 捕获完成后 | 数据完整性 / 时间戳 |