4. Metadata Tag 分类:核心 Tag 组详解

在 Camera HAL 开发中,Metadata 按照功能域划分为多个 Tag 组。每个组对应相机 pipeline 的一个逻辑模块,理解这些分组是正确读写 Metadata 的前提。本章聚焦 android.statistics、android.control、android.sensor、android.lens 四个核心 Tag 组,分析其数据结构、典型用途与调试要点。

关键认知:Metadata Tag 组并非孤立存在,它们通过 pipeline 时序和算法依赖形成网状关系。例如 android.control.aeMode 会直接影响 android.sensor.exposureTime 和 android.lens.aperture 的取值。

4.1 android.statistics:统计与后处理数据

该组承载 ISP 或算法模块输出的统计结果,主要用于 3A 算法、人脸检测、场景识别等后处理流程。HAL 必须正确填充这些 Tag,Framework 才能完成自动曝光、自动白平衡等闭环控制。

Tag 名称 类型 说明 调试关注点
android.statistics.faceDetectMode byte 人脸检测模式:OFF / SIMPLE / FULL 确认 HAL 是否支持 FULL 模式下的 landmarks 输出
android.statistics.faceRectangles int32[4] 检测到的人脸矩形框(归一化坐标) 检查坐标范围是否在 [0, 1000] 内
android.statistics.lensShadingMap float[] 镜头阴影校正增益图 验证 map 尺寸与 sensor 输出分辨率匹配
android.statistics.hotPixelMap Point2D[] 坏点坐标列表 确保坏点数量不超过 sensor 规格上限
调试技巧:使用 dumpsys media.camera 查看当前会话的 statistics 输出。如果 faceDetectMode 返回 OFF 但应用已请求 FULL,检查 HAL 的 isFaceDetectSupported() 实现是否遗漏了 FULL 模式。
android.statistics 数据流与调试节点 ISP Raw 数据 统计引擎 3A 统计 人脸检测 校正数据 调试检查点 1. 统计引擎使能 2. 输出频率匹配 3. 坐标归一化范围

4.2 android.control:3A 控制与场景策略

该组是 Framework 与 HAL 之间最活跃的控制接口,涵盖 AE、AWB、AF 三大自动算法的模式选择、触发策略和结果反馈。HAL 需要根据 control 参数实时调整 sensor 和 ISP 配置。

  • AE 控制:android.control.aeMode(OFF / ON / ON_AUTO_FLASH / ON_ALWAYS_FLASH / ON_AUTO_FLASH_REDEYE),配合 aeRegions 实现区域测光。
  • AWB 控制:android.control.awbMode(OFF / AUTO / INCANDESCENT / FLUORESCENT / DAYLIGHT / CLOUDY_DAYLIGHT / TWILIGHT / SHADE),HAL 需映射到对应的色温校正矩阵。
  • AF 控制:android.control.afMode(OFF / AUTO / MACRO / CONTINUOUS_VIDEO / CONTINUOUS_PICTURE / EDOF),触发方式通过 afTrigger 控制。
  • 场景模式:android.control.sceneMode(FACE_PRIORITY / ACTION / PORTRAIT / NIGHT / SPORTS 等),HAL 可据此调整 ISP 参数组合。
常见陷阱:当 android.control.aeMode 设置为 OFF 时,HAL 必须忽略 aeRegions 和 aeCompensation,但 android.sensor.exposureTime 和 android.sensor.sensitivity 必须由 HAL 手动设置有效值。如果 HAL 返回 0 或非法值,Framework 会判定为无效 capture。
控制模式 HAL 行为要求 常见调试问题
AE ON 根据统计结果自动调整曝光时间与增益 收敛速度慢、闪烁(未同步帧边界)
AE OFF 使用 HAL 预设或应用指定的曝光参数 参数越界、未更新 sensor 寄存器
AF CONTINUOUS_PICTURE 持续对焦,在 capture 前锁定 来回搜索(hunting)、锁定失败
AWB AUTO 基于统计自动计算色温增益 偏色、场景切换响应滞后
android.control 3A 控制流程 Framework 请求 HAL 控制解析 AE 执行 AWB 执行 AF 执行 结果 Metadata

4.3 android.sensor:物理传感器参数

该组描述图像传感器的物理特性和当前配置,包括曝光时间、模拟/数字增益、帧持续时间、像素阵列大小等。HAL 必须保证这些 Tag 的值与 sensor 驱动实际写入的寄存器一致。

精度要求:android.sensor.exposureTime 单位为纳秒(ns),有效范围通常为 1000 ~ 1000000000(1µs ~ 1s)。android.sensor.sensitivity 单位为 ISO 等效值,HAL 需根据 sensor 原生增益曲线做线性映射。
// 典型 sensor 参数设置示例(HAL 实现片段)
camera_metadata_entry_t entry;
int32_t exposure_ns = 33333333;  // 33.33ms
float sensitivity = 200.0f;      // ISO 200

// 写入 exposureTime
if (find_camera_metadata_entry(metadata, ANDROID_SENSOR_EXPOSURE_TIME, &entry) == 0) {
    update_camera_metadata_entry(metadata, entry.index, &exposure_ns, 1, NULL);
}

// 写入 sensitivity
if (find_camera_metadata_entry(metadata, ANDROID_SENSOR_SENSITIVITY, &entry) == 0) {
    update_camera_metadata_entry(metadata, entry.index, &sensitivity, 1, NULL);
}
Tag 名称 单位 典型范围 调试检查
android.sensor.exposureTime 纳秒 (ns) 1000 ~ 1000000000 与帧率是否匹配(exposureTime ≤ frameDuration)
android.sensor.frameDuration 纳秒 (ns) 10000000 ~ 1000000000 是否满足 target FPS 要求
android.sensor.sensitivity ISO 100 ~ 3200(典型) 模拟增益与数字增益的分配比例
android.sensor.timestamp 纳秒 (ns) CLOCK_MONOTONIC 与 buffer 时间戳偏差 < 1ms

4.4 android.lens:镜头与光学特性

该组描述镜头模组的物理参数和当前状态,包括光圈值、焦距、光学防抖(OIS)状态、镜头姿态(用于 EIS 和 OIS 校准)以及镜头阴影校正参数。HAL 需要从镜头驱动 IC 或 EEPROM 中读取校准数据。

  • 光圈控制:android.lens.aperture 为 float 类型,典型值 1.8 ~ 2.4。固定光圈镜头返回恒定值。
  • 焦距信息:android.lens.focalLength 用于计算视场角(FOV),影响数字变焦的裁剪区域。
  • 光学防抖:android.lens.opticalStabilizationMode(OFF / ON),HAL 需在 OIS 开启时同步 gyro 数据。
  • 镜头姿态:android.lens.poseRotation 和 android.lens.poseTranslation 用于多摄像头系统的坐标对齐。
调试方法:使用 adb shell dumpsys media.camera -D 导出完整 Metadata 转储,搜索 android.lens 组检查 aperture 和 focalLength 是否与镜头规格书一致。如果发现 opticalStabilizationMode 为 ON 但画面仍有抖动,检查 OIS 驱动是否在 capture 前完成稳定。
android.lens 参数来源与依赖关系 镜头 EEPROM 镜头驱动 IC HAL Lens 模块 aperture focalLength poseRotation 调试检查点 1. EEPROM 校准值 2. OIS 使能状态 3. 多摄 pose 一致性 4. 光圈物理范围

4.5 跨组依赖与调试策略

实际调试中,问题往往跨越多个 Tag 组。以下列出最常见的跨组依赖关系,帮助快速定位根因。

现象 可能涉及的 Tag 组 排查路径
预览画面过亮 android.control + android.sensor 检查 aeMode 是否为 ON → 检查 exposureTime 和 sensitivity 是否超出预期范围
自动对焦不工作 android.control + android.lens 确认 afMode 设置正确 → 检查 lens 驱动是否返回 focusDistance
人脸检测无结果 android.statistics + android.control 确认 faceDetectMode 已使能 → 检查 statistics 输出频率是否匹配 capture 请求
多摄切换画面跳变 android.lens + android.sensor 对比两路 sensor 的 exposureTime 和 lens 的 focalLength 是否对齐
调试工具链建议:在 HAL 层增加 Metadata 日志打印点,使用 ALOGD 输出每次 capture 的关键 Tag 值。配合 cameraserver 的 dumpsys 输出,可以快速建立“应用请求 → HAL 处理 → sensor 执行”的全链路数据视图。