Node 处理 request 的过程中,都会更新哪些 metadata 和 property
什么是 Metadata?
-
用于描述帧状态、控制参数、处理结果等
-
是随 request 流动的结构,通常是
PerFrameMetaData
,每一帧一份 -
属于 HAL3 metadata 树的组成部分
什么是 Property?
-
是 CamX 内部定义的一种帧级别的轻量信息块
-
不一定会传到上层,但用于 Node 之间的同步和依赖判断
-
通常以
PropertyID_*
定义,和Node::PublishData()
配套使用
1. Node 处理 Request 过程中的 Metadata 更新
每个 Node 可以调用 PublishMetadata()
或 WriteToPerFrameMetadata()
等 API 来更新 metadata。以下是典型的更新项:
Metadata Key | 来源 Node | 说明 |
---|---|---|
ANDROID_CONTROL_AE_STATE | AEC Node | AE 状态(如 CONVERGED) |
ANDROID_SENSOR_EXPOSURE_TIME | Sensor Node | 当前帧曝光时间 |
ANDROID_SENSOR_SENSITIVITY | Sensor Node | 当前帧 ISO |
ANDROID_CONTROL_AF_STATE | AF Node | AF 状态 |
ANDROID_CONTROL_AWB_STATE | AWB Node | AWB 状态 |
ANDROID_STATISTICS_FACE_RECTANGLES | FD Node | 人脸检测结果 |
ANDROID_JPEG_ORIENTATION | Jpeg Node | 拍照方向信息 |
ANDROID_CONTROL_SCENE_MODE | Usecase Node | 场景模式 |
ANDROID_CONTROL_CAPTURE_INTENT | Usecase | 当前是 preview 还是 still capture |
ANDROID_CONTROL_ENABLE_ZSL | Usecase | ZSL 启用状态 |
这些 metadata 最终会通过 Camera3Device
返回给 framework 层。
2. Node 处理过程中可能发布的 Property(CamX 内部)
CamX 使用 PropertyID_*
枚举类型来定义所有 property,Node 通常通过 PublishData()
来发布。下面是典型的一些:
PropertyID | 来源 | 用途 |
---|---|---|
PropertyIDUsecaseAECState | AEC Node | 当前帧是否 AE converged |
PropertyIDUsecaseAFState | AF Node | 当前帧 AF 状态 |
PropertyIDUsecaseSensorFrameDimension | Sensor Node | Sensor 输出图像的尺寸 |
PropertyIDIFEStatsConfig | IFE Node | IFE stats 配置(AE/AF window等) |
PropertyIDIFEStatsOutput | IFE Node | IFE 输出的 raw stats 数据 |
PropertyIDBPSMetadataOutput | BPS Node | Bayer Processing Stage 处理输出的 metadata |
PropertyIDIPEMetadataOutput | IPE Node | Image Processing Engine 输出的 YUV 元信息 |
PropertyIDJPEGEncodeOutputSize | JPEG Node | JPEG 编码后输出大小 |
PropertyIDRequestInputMetadataAvailable | 多个 Node | 表示当前 input metadata 已准备好 |
PropertyIDRequestOutputMetadataReady | 当前节点的 output metadata 写入完成 |
3. Composite / Fusion / HDR 场景特有 metadata & property
在多帧、多摄、fusion 场景中,Node 会发布这些附加信息:
类型 | Key | 描述 |
---|---|---|
Fusion | PropertyIDFusionResultStatus | Fusion 是否成功(例如双摄融合) |
HDR | PropertyIDHDRFrameGroupInfo | 当前帧是多帧 HDR 中的哪一张(long / short) |
MFNR | PropertyIDMFNRInputFrameCount | 多帧降噪时使用了多少帧 |
Frame Select | PropertyIDFrameSelectorSelectedFrameIDList | 被选中的 ZSL 帧 ID |
4. 如何追踪这些 Metadata 和 Property?
你可以在以下地方看到它们:
位置 | 用途 |
---|---|
camxpropertydefs.h | 定义了所有 PropertyID_XXX 枚举 |
camxhal3metadatatags.h | 定义了 HAL3 metadata tag |
各 Node 的 ProcessRequest() 实现 | 查找 PublishMetadata() 和 PublishData() 调用 |
Feature2RequestObject::UpdateMetadata() | 汇总每个 Node 的 metadata 和 property |
DeferredRequestQueue::OnMetadataUpdate() | 被触发用于依赖判断 |
举个例子:IPE Node 中的 property 更新
pNode->PublishData(PropertyIDIPEMetadataOutput, ...);
pNode->PublishMetadata(ANDROID_STATISTICS_HISTOGRAM, histogramData, count);
IPE 可能会同时:
-
发布 YUV 输出图像的处理信息
-
发布处理完成的 signal,供 downstream 触发依赖
总结一下
类型 | 举例 | 发布方式 | 目的 |
---|---|---|---|
Metadata | AE 状态,曝光时间,AF 状态 | PublishMetadata() | 提供给上层、下游模块 |
Property | frame 处理状态,内部依赖标记,frame group info | PublishData() | 用于 CamX 内部节点依赖调度 |