2. Metadata 基础概念
在 Camera HAL3 架构中,Metadata 是连接 Framework、HAL 与 ISP 之间的核心数据契约。它并非图像像素数据,而是描述“如何拍摄、当前状态、期望结果”的结构化信息集合。理解 Metadata 是掌握 HAL3 测试验证的前提。
2.1 什么是 Metadata
Metadata(元数据)是关于数据的数据。在 Camera 系统中,它携带了每一帧图像的配置参数、设备状态、算法结果以及控制指令。例如:
- 传感器尺寸(静态信息)
- 当前曝光时间(动态信息)
- 期望的 AE 目标(控制信息)
Android Camera 使用 camera_metadata_t 结构体在进程间传递这些信息,其序列化格式紧凑、可扩展,支持快速查找。
关键认知: Metadata 是 HAL3 的“神经系统”——没有正确的 Metadata 传递,即使 ISP 硬件正常,也无法输出符合预期的图像。
2.2 Tag / Value 结构
Android Camera Metadata 采用 Tag-Value 键值对模型。每个 Metadata 条目由一个唯一的 Tag(32 位整数)标识,对应一个 Value(可以是多种数据类型)。
| 组件 | 说明 | 示例 |
|---|---|---|
| Tag | 全局唯一标识符,由 section + 序号组成 | ANDROID_SENSOR_EXPOSURE_TIME (0x00000001) |
| Type | 数据类型枚举(BYTE, INT32, FLOAT, INT64, DOUBLE, RATIONAL 等) | TYPE_INT64 |
| Count | 该 Tag 包含的元素个数(数组长度) | 1(标量)或 4(如 4 元素区域) |
| Value | 实际数据,按 Type 和 Count 解释 | 10000000(表示 10ms) |
测试提示: 验证 Metadata 传递时,最常检查的是 Tag 是否缺失、Value 是否在合法范围内、Count 是否与预期一致。例如
ANDROID_SENSOR_EXPOSURE_TIME 的值不能为负数。
2.3 静态 / 动态 / 控制 Metadata 的区别
根据生命周期与用途,Metadata 分为三大类。测试验证时需要针对不同类别采用不同的检查策略。
| 类别 | 生命周期 | 设置者 | 典型 Tag 示例 | 测试关注点 |
|---|---|---|---|---|
| 静态 (Static) | Camera 打开后不变 | HAL 在 getCameraCharacteristics() 中返回 |
ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE |
值是否与硬件规格一致;是否在合法范围内 |
| 动态 (Dynamic) | 每帧可能变化 | HAL 在 capture_result 中填充 |
ANDROID_SENSOR_EXPOSURE_TIME |
是否随场景变化;是否与预期算法输出一致 |
| 控制 (Control) | 每帧由 Framework 下发 | Framework 在 capture_request 中设置 |
ANDROID_CONTROL_AE_MODE |
HAL 是否正确解析;是否按控制值执行 |
常见测试陷阱: 动态 Metadata 中经常出现“残留值”问题——HAL 未更新某 Tag,导致 Framework 拿到上一帧的旧值。这是 HAL3 合规性测试的重点检查项。
2.4 三类 Metadata 的测试验证要点
- 静态 Metadata 验证: 使用
CameraCharacteristicsAPI 读取所有 Tag,与设备规格书逐项比对。重点检查分辨率范围、AE 补偿步长、可用 FPS 区间等。 - 控制 Metadata 验证: 构造不同的
capture_request,检查 HAL 是否按预期将控制值传递给 ISP。例如设置AE_MODE = OFF后,检查曝光时间是否变为手动设定值。 - 动态 Metadata 验证: 连续采集多帧
capture_result,检查动态 Tag 是否合理变化。例如 AE 收敛过程中EXPOSURE_TIME应逐渐稳定,而非跳变。
测试策略总结: 静态 Metadata 做“一致性检查”;控制 Metadata 做“闭环检查”(下发→执行→反馈);动态 Metadata 做“合理性检查”(时序、范围、趋势)。