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 模式。
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 | 基于统计自动计算色温增益 | 偏色、场景切换响应滞后 |
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 前完成稳定。
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 执行”的全链路数据视图。