2. Camera HAL3 核心概念:Pipeline、Stream、Buffer、Session、Request、Result

Camera HAL3 架构围绕一套严格定义的核心概念构建,这些概念共同构成了从应用层请求到硬件捕获图像,再返回结果的完整数据通路。理解 Pipeline、Stream、Buffer、Session、Request 和 Result 是进行多 Camera 配置与兼容性调试的基础。

核心要点: HAL3 的设计哲学是“一次请求,一次结果”。应用层通过构建 Request 描述期望的捕获参数,HAL 层则通过 Pipeline 调度硬件,最终返回包含图像数据与元数据的 Result。

2.1 概念总览与关系图

下图展示了这六大核心概念在 HAL3 架构中的层级关系与数据流动方向。Session 作为顶层容器,管理多个 Pipeline;每个 Pipeline 处理特定的 Stream;Buffer 是 Stream 的数据载体;Request 驱动一次捕获循环;Result 则是捕获的最终产出。

Camera HAL3 核心概念关系图 Camera HAL3 核心概念关系图 Session (会话) Pipeline (管线) 硬件处理单元(ISP / 传感器) Stream A (预览) Stream B (拍照) Buffer 是 Stream 的数据载体 Pipeline (管线) 硬件处理单元(深度 / 视频) Stream C (深度) Stream D (视频) Buffer 是 Stream 的数据载体 Request (请求) 包含:输出 Stream 列表 + 捕获参数(AE/AWB/AF/3A) Result (结果) 包含:填充数据的 Buffer + 元数据(Metadata) 说明:一个 Session 可包含多个 Pipeline;一个 Pipeline 可包含多个 Stream;每个 Request 选择一组 Stream 输出。

2.2 Pipeline(管线)

Pipeline 是 HAL3 中硬件处理能力的抽象表示。它代表一条从传感器输入到图像输出的完整处理链路,通常对应一个物理 Camera 设备或一个逻辑 Camera 的内部处理单元。

  • 物理 Pipeline: 直接对应一个物理 Camera 传感器及其 ISP 处理路径。
  • 逻辑 Pipeline: 在多摄系统中,由多个物理 Pipeline 通过软件融合而成,对外表现为一个统一的 Pipeline。
  • 并发 Pipeline: 支持同时运行多个 Pipeline,以实现多路视频流或同时预览与拍照。
调试要点: 在多 Camera 配置中,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() 时销毁,释放所有硬件资源。
常见兼容性问题: 某些 HAL 实现不支持在同一个 Session 中动态切换 Pipeline 组合。如果应用尝试在配置后添加新的 Stream,可能导致 configure_streams() 返回错误。调试时应检查 logcat 中的 CAM_HAL_ERR 标签。

2.5 Request(请求)与 Result(结果)

Request 和 Result 构成了 HAL3 的捕获循环。每一次捕获操作都由一个 Request 发起,最终由一个 Result 完成。

Request -> Result 捕获循环 Request → Result 捕获循环 应用层 构建 Request HAL 层 处理 Request 硬件 捕获 & 处理 Result 返回给应用层 应用层 处理 Result 说明:每个 Request 对应一个唯一的 FrameNumber,Result 中会携带相同的 FrameNumber 用于匹配。

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;   // 部分结果序号
};
调试技巧: 当遇到“预览正常但拍照黑屏”的问题时,首先检查 Request 中是否正确指定了 STILL_CAPTURE 类型的 Stream,以及 Result 中对应的 Buffer 是否包含有效的图像数据。使用 dumpsys media.camera 可以查看当前活跃的 Request 队列状态。

2.6 核心概念总结表

概念 作用 生命周期 调试关注点
Pipeline 硬件处理路径抽象 Session 内创建/销毁 并发 Pipeline 数量限制
Stream 定义输出格式与用途 Session 配置阶段 格式/分辨率兼容性
Buffer 图像数据内存载体 Request 到 Result 期间 内存泄漏 / 空指针
Session 管理 Pipeline 生命周期 open() 到 close() configure_streams 失败
Request 发起一次捕获 提交到完成 参数设置错误
Result 返回捕获数据与元数据 捕获完成后 数据完整性 / 时间戳