3. Metadata Tag 分类:静态 Tag、动态 Tag、控制 Tag、统计 Tag、辅助 Tag
在 Camera HAL 框架中,Metadata 的 Tag 按照其生命周期、数据来源和用途被划分为五大类别。理解这五类 Tag 是掌握 Metadata 生成与消费机制的基础,也是设计 HAL 层与 Framework 层数据交互协议的关键。
3.1 分类总览
下表从数据特性、生成时机、消费者三个维度对五类 Tag 进行对比:
| 类别 | 数据特性 | 生成时机 | 主要消费者 | 典型示例 |
|---|---|---|---|---|
| 静态 Tag | 固定不变,一次查询 | HAL 初始化时 | Framework、应用 | 传感器尺寸、像素数 |
| 动态 Tag | 逐帧变化,实时更新 | 每帧捕获完成后 | Framework、应用 | 曝光时间、ISO 值 |
| 控制 Tag | 应用下发,驱动行为 | Capture Request 中 | HAL、ISP、Sensor | AE 模式、对焦区域 |
| 统计 Tag | 算法输出,辅助决策 | 3A 算法处理后 | 3A 模块、后处理 | AE 收敛状态、直方图 |
| 辅助 Tag | 调试/诊断/扩展 | 按需生成 | 调试工具、OEM | 错误码、厂商私有数据 |
3.2 静态 Tag(Static Metadata)
静态 Tag 描述 Camera 模组在出厂时即确定的物理特性和能力上限。这些 Tag 在 HAL 进程启动时通过 camera_info.static_capabilities 一次性上报给 Framework,之后在整个 Camera 生命周期内不再变化。
3.2.1 典型静态 Tag 列表
| Tag 名称 | 类型 | 说明 |
|---|---|---|
ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE |
int32[2] | 有效像素阵列宽高 |
ANDROID_SENSOR_INFO_SENSITIVITY_RANGE |
int32[2] | ISO 感光度范围 |
ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS |
float[] | 可用焦距列表 |
ANDROID_FLASH_INFO_AVAILABLE |
uint8 | 是否支持闪光灯 |
ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS |
int32[] | 支持的输出流格式与分辨率 |
开发提示:静态 Tag 的生成通常在 HAL 的
getCameraCharacteristics() 回调中完成。建议在 HAL 初始化阶段从传感器驱动或设备树中读取硬件参数,构建一个只读的 Metadata 缓存,避免每次查询都访问硬件。
3.3 动态 Tag(Dynamic Metadata)
动态 Tag 是每一帧捕获完成后,由 HAL 层根据实际硬件状态填充的实时数据。这些 Tag 被封装在 CaptureResult 中返回给 Framework,应用可以通过 CameraCaptureSession.CaptureCallback 获取。
3.3.1 动态 Tag 的生成流程
- 硬件寄存器读取:HAL 在 ISP 中断或帧结束回调中读取 Sensor/ISP 寄存器。
- 数据格式转换:将硬件原始值转换为 Android Metadata 标准格式(如曝光时间从 us 转为 ns)。
- 填充 CaptureResult:调用
camera_metadata_entry_t接口写入动态 Tag。 - 时间戳对齐:确保动态 Tag 与帧的
timestamp严格对应。
关键动态 Tag 示例:
ANDROID_SENSOR_EXPOSURE_TIME— 实际曝光时间(纳秒)ANDROID_SENSOR_SENSITIVITY— 实际 ISO 值ANDROID_LENS_APERTURE— 实际光圈值ANDROID_CONTROL_AE_STATE— AE 算法当前状态
3.4 控制 Tag(Control Metadata)
控制 Tag 是应用通过 CaptureRequest 下发给 HAL 的指令性参数。HAL 解析这些 Tag 后,将其转换为 Sensor、ISP、Flash 等硬件模块的寄存器配置。
3.4.1 控制 Tag 的消费链路
3.4.2 常用控制 Tag 分类
| 功能模块 | 控制 Tag 示例 | 值域说明 |
|---|---|---|
| 3A 控制 | ANDROID_CONTROL_AE_MODE |
ON / OFF / ON_AUTO_FLASH |
| 对焦控制 | ANDROID_CONTROL_AF_MODE |
AUTO / MACRO / CONTINUOUS_VIDEO |
| 白平衡 | ANDROID_CONTROL_AWB_MODE |
AUTO / INCANDESCENT / DAYLIGHT |
| 帧控制 | ANDROID_CONTROL_CAPTURE_INTENT |
PREVIEW / STILL_CAPTURE / VIDEO_RECORD |
3.5 统计 Tag(Statistics Metadata)
统计 Tag 是 HAL 内部 3A 算法或 ISP 统计模块计算产生的中间数据。这些 Tag 通常不直接暴露给应用,而是用于驱动 3A 控制环路或供后处理算法参考。
3.5.1 统计 Tag 的典型用途
- AE 统计:
ANDROID_STATISTICS_LENS_SHADING_MAP— 镜头阴影校正映射表。 - AF 统计:
ANDROID_STATISTICS_FOCUS_DISTANCE— 对焦距离置信度。 - AWB 统计:
ANDROID_STATISTICS_COLOR_TRANSFORM— 颜色校正矩阵。 - 场景检测:
ANDROID_STATISTICS_SCENE_FLICKER— 频闪检测结果。
注意事项:统计 Tag 的生成频率应与 3A 算法更新频率匹配。过高的统计输出会增加 ISP 带宽和 CPU 负载,建议在 HAL 中实现统计 Tag 的降采样或条件触发机制。
3.6 辅助 Tag(Auxiliary Metadata)
辅助 Tag 涵盖调试、诊断、错误处理和厂商私有扩展等非核心数据流场景。这类 Tag 在 Android 原生定义中数量较少,但 OEM 定制时经常大量扩展。
3.6.1 辅助 Tag 的典型场景
| 场景 | Tag 示例 | 说明 |
|---|---|---|
| 错误报告 | ANDROID_ERROR_CAMERA_DEVICE |
设备级错误码 |
| 调试日志 | ANDROID_STATISTICS_ERROR_CAMERA_ID |
错误 Camera ID |
| 厂商扩展 | VENDOR_SENSOR_TEMPERATURE |
传感器温度(OEM 自定义) |
| 性能统计 | VENDOR_HAL_PROCESSING_TIME |
HAL 处理耗时(OEM 自定义) |
3.7 五类 Tag 的交互关系
在实际的 Camera 数据流中,五类 Tag 并非孤立存在,而是形成闭环交互:
3.8 分类在 HAL 实现中的意义
在 HAL 代码实现中,明确区分五类 Tag 有助于:
- 内存管理:静态 Tag 可分配固定缓存,动态 Tag 使用环形缓冲区,控制 Tag 按 Request 生命周期管理。
- 线程安全:静态 Tag 无需加锁,动态 Tag 需读写锁保护,控制 Tag 在 Request 队列中串行化。
- 性能优化:统计 Tag 可降频输出,辅助 Tag 仅在调试模式启用。
- 兼容性:厂商扩展 Tag 统一归入辅助类,不影响原生 CTS 测试。
最佳实践:在 HAL 的 Metadata 管理模块中,建议为每类 Tag 建立独立的
camera_metadata_t 缓冲区,并实现对应的填充器(Filler)和解析器(Parser),避免跨类混用导致的数据污染。