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 错误码、厂商私有数据
Metadata Tag 五类分类架构图 Metadata Tag 静态 Tag 动态 Tag 控制 Tag 统计 Tag 辅助 Tag 分类依据说明 • 静态 Tag:传感器/模组出厂即固定,一次读取缓存,生命周期内不变。 • 动态 Tag:每帧捕获后由 HAL 填充,反映当前帧的实际硬件状态。 • 控制 Tag:应用通过 CaptureRequest 下发,HAL 解析后驱动硬件行为。 • 统计 Tag:3A 算法或 ISP 统计模块输出,用于反馈控制环路。 • 辅助 Tag:调试日志、错误码、厂商私有扩展,不参与核心数据流。

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 的生成流程

  1. 硬件寄存器读取:HAL 在 ISP 中断或帧结束回调中读取 Sensor/ISP 寄存器。
  2. 数据格式转换:将硬件原始值转换为 Android Metadata 标准格式(如曝光时间从 us 转为 ns)。
  3. 填充 CaptureResult:调用 camera_metadata_entry_t 接口写入动态 Tag。
  4. 时间戳对齐:确保动态 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 的消费链路

控制 Tag 消费链路 应用 CaptureRequest HAL 解析层 硬件驱动层 Sensor/ISP 示例:ANDROID_CONTROL_AE_MODE → HAL 解析 → Sensor 增益/曝光时间寄存器写入

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 并非孤立存在,而是形成闭环交互:

五类 Tag 交互闭环 静态 Tag 控制 Tag 动态 Tag 统计 Tag 辅助 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),避免跨类混用导致的数据污染。