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 在不同阶段被处理,从而最大化帧率。

关键概念:Pipeline 深度决定了同时处理的 Request 数量。深度越大,延迟越高,但帧率越稳定。
Camera HAL3 Pipeline 模型 App / Framework Camera HAL ISP / Sensor Output Buffer Request Queue Pipeline Depth Pipeline 工作流程: 1. App 通过 Framework 提交 CaptureRequest(包含 3A 参数、输出流等)。 2. HAL 将 Request 入队,按顺序或优先级调度到 ISP/Sensor 硬件。 3. 硬件处理完成后,HAL 填充 CaptureResult 并回调给 Framework。

3.2 Capture Request 与 Result

HAL3 的每一次拍照或预览都由一个 Capture Request 发起,对应一个 Capture Result 返回。这种“请求-响应”模式是 HAL3 控制相机行为的唯一途径。

3.2.1 Capture Request 结构

一个 Request 包含以下核心信息:

字段类型说明
streamsList<Stream>指定输出目标流(预览、拍照、视频等)
settingsCaptureRequest.Metadata包含 AE/AWB/AF 模式、曝光时间、ISO、裁剪区域等参数
inputBufferBuffer仅 reprocess 请求使用,指定输入 buffer
outputBuffersList<Buffer>每个 stream 对应的输出 buffer 列表

3.2.2 Capture Result 结构

Result 是 Request 的完成反馈,包含:

  • metadata:实际使用的 3A 参数、传感器时间戳、统计信息等。
  • outputBuffers:填充完成的图像 buffer,每个 buffer 关联一个 stream。
  • inputBuffer:reprocess 请求的输入 buffer(已释放)。
  • partialResult:部分结果,用于提前通知框架某些 metadata 已就绪。
开发提示:HAL 必须保证每个 Request 都返回一个 Result,即使出错也要返回 error 状态。丢失 Result 会导致 Framework 卡死。

3.3 Stream 与 Buffer 管理

Stream 定义了图像数据的去向和格式。Buffer 则是承载图像数据的实际内存块。HAL3 要求驱动实现高效的 Buffer 管理,避免内存拷贝和抖动。

3.3.1 Stream 配置

Stream 在 CameraDevice 创建时通过 configureStreams() 配置,包含以下属性:

属性可选值示例说明
formatYUV_420_888, JPEG, RAW10, HEIC像素格式
width/height1920x1080, 4000x3000分辨率
usageGRALLOC_USAGE_HW_TEXTURE, GRALLOC_USAGE_HW_CAMERA_WRITEBuffer 用途标记
maxBuffers3, 4, 8HAL 建议的 buffer 池深度
dataSpaceHAL_DATASPACE_STANDARD_BT709, HAL_DATASPACE_V0_JFIF色彩空间

3.3.2 Buffer 生命周期

Buffer 在 HAL 与 Framework 之间流转,遵循以下状态机:

  1. Framework 注册:通过 registerBuffer() 将 buffer 句柄交给 HAL。
  2. HAL 锁定:HAL 调用 lockBuffer() 获取 CPU/GPU 访问权限。
  3. HAL 填充:ISP 写入图像数据。
  4. HAL 释放:HAL 调用 unlockBuffer() 并回调 processCaptureResult()。
  5. Framework 消费:Framework 将 buffer 送显或编码。
Buffer 生命周期流转 Framework 注册 HAL 锁定 ISP 填充 HAL 释放 Buffer 回收复用 Buffer 管理要点: • 使用 Gralloc 分配器管理 buffer 内存,避免显式 malloc/free。 • 合理设置 maxBuffers 值,过小导致帧率抖动,过大浪费内存。

3.4 Metadata 系统

Metadata 是 HAL3 的“控制面板”和“状态报告”。它使用静态标签(static metadata)描述硬件能力,使用动态标签(dynamic metadata)传递每一帧的控制参数和结果数据。

3.4.1 Metadata 分类

类型作用域示例
StaticCamera 全局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:人脸检测开关。
常见陷阱:HAL 必须验证 Request 中的 metadata 值是否在 static metadata 声明的范围内。例如,如果 sensor 最大 ISO 为 3200,但 Request 传入 ISO 6400,HAL 应 clamp 到 3200 并在 Result 中报告实际值,而不是直接返回错误。

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_* 标签
架构哲学:HAL3 的设计核心是“显式控制”。Framework 不再猜测硬件行为,而是通过 Request 精确描述每一帧的需求,HAL 则通过 Result 如实报告实际执行结果。这种契约式设计使得相机行为可预测、可调试、可优化。