1. Metadata概述:什么是Camera Metadata、Metadata在HAL中的角色、Metadata与Android Camera框架的关系

1.1 什么是Camera Metadata

Camera Metadata是Android Camera框架中用于描述相机设备状态、控制相机行为、传递图像数据属性的结构化数据集合。它采用键值对(Key-Value)的形式,每个Metadata项由一个唯一的整数标识符(Tag)和对应的数据值组成。

Metadata覆盖了相机系统的全部可配置参数和状态信息,包括但不限于:

  • 传感器信息:感光度范围、曝光时间范围、帧率
  • 镜头参数:光圈值、焦距、对焦距离
  • 图像格式:输出分辨率、像素格式、色彩空间
  • 3A算法状态:自动对焦(AF)、自动曝光(AE)、自动白平衡(AWB)
  • 图像处理效果:降噪强度、锐化程度、HDR模式
  • 统计信息:人脸检测结果、场景检测结果

关键概念:Camera Metadata是Android相机系统的"神经中枢",它承载了从应用层到底层硬件之间的所有控制指令和状态反馈。

Metadata的数据结构定义在 system/media/camera/docs 目录下的文档中,并通过 camera_metadata.h 头文件实现。每个Metadata项包含以下字段:

字段 说明 示例
Tag 唯一标识符,用于索引Metadata项 ANDROID_SENSOR_EXPOSURE_TIME
Type 数据类型(BYTE、INT32、FLOAT、INT64、DOUBLE、RATIONAL) TYPE_INT64
Count 数据元素个数 1
Value 实际数据值 33333333(纳秒)

1.2 Metadata在HAL中的角色

在Camera HAL(Hardware Abstraction Layer)中,Metadata扮演着双向数据通道的角色:

  • 下行通道(应用→HAL):应用层通过CaptureRequest携带Metadata,向HAL下发拍摄参数和控制指令。
  • 上行通道(HAL→应用):HAL通过CaptureResult携带Metadata,向应用层返回实际使用的参数和传感器状态。

HAL层对Metadata的处理遵循以下核心原则:

  1. 完整性校验:HAL必须验证所有输入Metadata的合法性,对非法参数返回错误或使用默认值。
  2. 状态同步:HAL需要将硬件实际状态(如实际曝光时间、实际帧率)写入输出Metadata。
  3. 性能优化:HAL可以基于Metadata中的参数进行硬件加速处理,如ISP管线配置。

最佳实践:HAL实现中,Metadata的生成应尽量在硬件事件回调中完成,确保状态信息的实时性和准确性。延迟生成Metadata会导致应用层获取到过时的相机状态。

以下SVG图展示了Metadata在HAL中的双向流转路径:

Metadata在HAL中的双向流转 应用层 Camera API Camera HAL Metadata处理引擎 硬件层 Sensor / ISP CaptureRequest (控制参数) 硬件控制 (寄存器配置) 硬件状态 (传感器读数) CaptureResult (状态反馈) Metadata双向通道说明 下行:应用层通过CaptureRequest下发控制参数 → HAL解析 → 硬件执行 上行:硬件采集状态 → HAL封装为CaptureResult → 应用层获取实际参数 Metadata示例(CaptureRequest) ANDROID_SENSOR_EXPOSURE_TIME = 33333333 (33.3ms) ANDROID_CONTROL_AE_MODE = ON

1.3 Metadata与Android Camera框架的关系

Android Camera框架采用分层架构,Metadata贯穿整个框架的各个层级:

框架层级 组件 Metadata角色 关键类/接口
应用层 Camera App 构造CaptureRequest,解析CaptureResult CameraCaptureSession
框架层 CameraService Metadata路由、权限校验、格式转换 CameraMetadataNative
HAL层 Camera HAL Metadata解析、硬件控制、状态生成 camera3_capture_request
内核层 V4L2 / ISP驱动 硬件寄存器读写、中断处理 ioctl 调用

Metadata在框架中的生命周期包含以下关键阶段:

  1. 静态信息获取:应用层通过 CameraCharacteristics 获取相机设备的静态Metadata(如支持的分辨率列表、传感器尺寸)。
  2. 请求构造:应用层创建 CaptureRequest,填充控制类Metadata(如曝光时间、对焦模式)。
  3. 框架转发:CameraService将CaptureRequest转换为HAL可识别的 camera3_capture_request_t 结构体。
  4. HAL处理:HAL解析Metadata,配置硬件寄存器,触发图像采集。
  5. 结果生成:HAL将硬件实际状态封装为 CaptureResult,包含结果类Metadata。
  6. 应用回调:框架层将CaptureResult回调给应用层,应用层解析Metadata获取拍摄结果。

常见陷阱:应用层设置的Metadata参数并不总是被硬件精确执行。例如,设置曝光时间为100ms,但硬件可能因为帧率限制实际只执行了33ms。因此,应用层必须通过CaptureResult中的实际值来确认硬件执行结果,而不是依赖请求值。

以下SVG图展示了Metadata在Android Camera框架各层级间的流转关系:

Metadata与Android Camera框架关系 应用层(Application Layer) CameraCharacteristics(静态) CaptureRequest(控制) CaptureResult(结果) 框架层(Framework Layer) CameraService Metadata路由 / 权限校验 格式转换 HAL层(Hardware Abstraction Layer) camera3_capture_request_t Metadata解析 / 硬件控制 状态生成 内核层(Kernel Layer) V4L2驱动 ISP管线 硬件寄存器 Metadata贯穿四层架构:应用层构造 → 框架层路由 → HAL层处理 → 内核层执行

1.4 Metadata的分类体系

根据用途和生命周期,Camera Metadata可分为以下三大类:

分类 前缀 特点 典型示例
静态Metadata ANDROID_INFO_* 设备初始化时固定不变,只读 ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL
控制Metadata ANDROID_CONTROL_* 应用层下发,控制拍摄行为 ANDROID_CONTROL_AE_TARGET_FPS_RANGE
结果Metadata ANDROID_STATISTICS_* HAL返回,反映实际状态 ANDROID_STATISTICS_FACE_RECTANGLES

核心要点:理解Metadata的分类体系是掌握Camera HAL开发的基础。静态Metadata决定了设备能力边界,控制Metadata是应用与HAL交互的主要手段,结果Metadata是验证硬件执行正确性的唯一依据。

在HAL开发中,Metadata的生成与消费遵循以下数据流模式:

// 伪代码:HAL层Metadata处理流程
void process_capture_request(camera3_capture_request_t *request) {
    // 1. 解析输入Metadata(消费)
    camera_metadata_ro_entry_t entry;
    find_camera_metadata_ro_entry(request->settings,
        ANDROID_SENSOR_EXPOSURE_TIME, &entry);
    int64_t exposure_time = entry.data.i64[0];

    // 2. 配置硬件
    sensor_set_exposure(exposure_time);

    // 3. 生成输出Metadata(生产)
    camera_metadata_t *result_metadata = allocate_camera_metadata();
    int64_t actual_exposure = sensor_get_actual_exposure();
    camera_metadata_entry_t result_entry;
    add_camera_metadata_entry(result_metadata,
        ANDROID_SENSOR_EXPOSURE_TIME, &actual_exposure, 1);

    // 4. 返回结果
    return_result(request->frame_number, result_metadata);
}

通过以上分析可以看出,Metadata是Android Camera框架中连接应用层与硬件层的核心数据载体。掌握Metadata的生成与消费机制,是深入理解Camera HAL开发的关键前提。