4. Usecase XML 详解:Usecase 定义、Stream 配置、Node 连接、Target FPS 与分辨率设置
Usecase XML 是 CHI 架构中连接 Pipeline(处理管线)与 App Session(应用会话)的核心配置文件。它定义了相机启动后“拍什么”、“怎么拍”、“拍多快”以及“输出给谁”。本章将深入解析 Usecase 的四大核心要素:Usecase 定义、Stream 配置、Node 连接逻辑以及 Target FPS 与分辨率的协同设置。
核心认知: Usecase XML 不描述算法细节,它是一张“拓扑图”+“参数表”。它告诉 CHI 驱动:当 App 请求某个 Session 时,需要激活哪些 Node,这些 Node 如何连接,以及输出流的格式、帧率和尺寸。
4.1 Usecase 定义:会话的“身份牌”
每个 Usecase 在 XML 中通过 <usecase> 标签定义,包含唯一的 ID 和名称。它是整个配置的入口点,驱动通过匹配 App 传入的 Usecase ID 来加载对应的管线拓扑。
<usecase id="0x1001" name="com.qti.usecase.preview">
<!-- Stream 配置与 Node 连接在此定义 -->
</usecase>
| 属性 | 说明 | 典型值 |
|---|---|---|
id |
Usecase 的唯一标识符,十六进制整数 | 0x1001 (预览), 0x1003 (拍照) |
name |
人类可读的名称,用于调试和日志 | com.qti.usecase.preview |
stream_include |
引用外部 Stream 配置文件的路径 | stream/preview.xml |
调优要点: 在调试多摄像头场景时,务必确保 App 请求的 Usecase ID 与 XML 中定义的 ID 一致。ID 不匹配是导致 Session 创建失败的最常见原因之一。
4.2 Stream 配置:定义“数据管道”的规格
Stream 配置描述了从 Sensor 输出到最终目标(如 Display、JPEG、Video Encoder)的数据流规格。每个 Stream 包含分辨率、格式、帧率以及目标用途。
<stream_config>
<stream id="0" type="input">
<dimension width="1920" height="1080"/>
<format>NV12</format>
<fps_range min="30" max="30"/>
</stream>
<stream id="1" type="output" target="display">
<dimension width="1920" height="1080"/>
<format>NV12</format>
<fps_range min="30" max="30"/>
</stream>
</stream_config>
Stream 类型与目标
- input:来自 Sensor 或 IFE 的原始数据流。
- output:经过管线处理后,输出给特定硬件或应用的数据流。
- internal:仅在管线内部传递的中间流,不对外暴露。
| Target 属性 | 用途 | 典型分辨率 |
|---|---|---|
display |
预览画面输出到屏幕 | 1920x1080, 2340x1080 |
jpeg |
拍照输出到 JPEG 编码器 | 4000x3000, 4032x3024 |
video_encoder |
录像输出到视频编码器 | 1920x1080, 3840x2160 |
analysis |
算法分析(如人脸检测、HDR 合成) | 640x480, 1280x720 |
常见陷阱: 当存在多个 output Stream 时,它们的
fps_range 必须与 input Stream 的帧率兼容。例如,若 input 为 30fps,则所有 output 的 max fps 不应超过 30fps,否则会导致帧丢失或管线阻塞。
4.3 Node 连接:构建处理拓扑
Node 连接定义了数据在管线中的流动路径。每个 Node 代表一个硬件处理模块(如 IFE、IPE、BPS、JPEG),通过 <link> 标签将上游 Node 的输出端口连接到下游 Node 的输入端口。
<node_connections>
<link src_node="IFE" src_port="output0" dst_node="IPE" dst_port="input0"/>
<link src_node="IPE" src_port="output0" dst_node="Display" dst_port="input0"/>
<link src_node="IPE" src_port="output1" dst_node="JPEG" dst_port="input0"/>
</node_connections>
Node 连接的关键属性
- src_node / dst_node:对应 Pipeline XML 中定义的 Node 名称。
- src_port / dst_port:Node 的输入/输出端口名称,必须与 Node 定义中的端口匹配。
- 多路分支:一个输出端口可以连接到多个输入端口(如 IPE 同时输出到 Display 和 JPEG)。
调优实践: 在低功耗场景下,应尽量减少不必要的 Node 连接。例如,若仅需预览,则不应连接 JPEG 或 Video Encoder 节点,以节省带宽和功耗。
4.4 Target FPS 与分辨率设置:性能与画质的平衡
Target FPS 和分辨率是 Usecase 中最直接影响用户体验的参数。它们通过 <fps_range> 和 <dimension> 标签在 Stream 中定义,并受到 Sensor 能力、ISP 带宽以及 DDR 带宽的约束。
FPS 配置策略
| 场景 | 推荐 FPS | 说明 |
|---|---|---|
| 普通预览 | 30 fps | 标准流畅度,功耗与性能的平衡点 |
| 高帧率录像 | 60 / 120 fps | 需要 Sensor 支持高帧率模式,且 ISP 管线需降分辨率 |
| 夜景模式 | 15 / 24 fps | 降低帧率以延长曝光时间,提升暗光画质 |
| HDR 拍照 | 30 fps (多帧合成) | 帧率不变,但内部会连续采集多帧进行合成 |
分辨率与 FPS 的协同约束
在 CHI 架构中,分辨率与 FPS 存在以下硬性约束关系:
- ISP 像素时钟限制:IFE 和 IPE 的像素处理速率是固定的。分辨率越高,可支持的最大 FPS 越低。
- DDR 带宽限制:高分辨率 + 高 FPS 会产生巨大的数据吞吐量,可能超过 DDR 带宽上限,导致帧丢失。
- Sensor 输出模式:Sensor 本身有 binning 和 skipping 模式,用于在高 FPS 下降低分辨率。
实际配置示例:高帧率录像 Usecase
<usecase id="0x1005" name="com.qti.usecase.hfr_video">
<stream_config>
<stream id="0" type="input">
<dimension width="1920" height="1080"/>
<format>NV12</format>
<fps_range min="120" max="120"/>
</stream>
<stream id="1" type="output" target="video_encoder">
<dimension width="1920" height="1080"/>
<format>NV12</format>
<fps_range min="120" max="120"/>
</stream>
</stream_config>
<node_connections>
<link src_node="IFE" src_port="output0" dst_node="IPE" dst_port="input0"/>
<link src_node="IPE" src_port="output0" dst_node="VideoEncoder" dst_port="input0"/>
</node_connections>
</usecase>
性能验证: 配置高帧率 Usecase 后,务必通过
adb shell dumpsys media.camera 或 CHI 日志确认实际输出帧率是否达到目标值。若实际帧率低于配置值,通常表明 ISP 或 DDR 带宽已达到瓶颈,需要降低分辨率或帧率。
4.5 综合案例:预览 + 拍照双路 Usecase
以下是一个典型的双路 Usecase 配置,同时输出预览流和拍照流:
<usecase id="0x1002" name="com.qti.usecase.preview_and_snapshot">
<stream_config>
<stream id="0" type="input">
<dimension width="4032" height="3024"/>
<format>NV12</format>
<fps_range min="30" max="30"/>
</stream>
<stream id="1" type="output" target="display">
<dimension width="1920" height="1080"/>
<format>NV12</format>
<fps_range min="30" max="30"/>
</stream>
<stream id="2" type="output" target="jpeg">
<dimension width="4032" height="3024"/>
<format>NV12</format>
<fps_range min="1" max="30"/>
</stream>
</stream_config>
<node_connections>
<link src_node="IFE" src_port="output0" dst_node="IPE" dst_port="input0"/>
<link src_node="IPE" src_port="output0" dst_node="Display" dst_port="input0"/>
<link src_node="IPE" src_port="output1" dst_node="JPEG" dst_port="input0"/>
</node_connections>
</usecase>
| Stream ID | 类型 | 分辨率 | FPS | 说明 |
|---|---|---|---|---|
| 0 | input | 4032x3024 | 30 | Sensor 全分辨率输出 |
| 1 | output (display) | 1920x1080 | 30 | 预览流,由 IPE 下采样 |
| 2 | output (jpeg) | 4032x3024 | 1~30 | 拍照流,全分辨率输出,仅在拍照时触发 |
关键调优点: 在此配置中,预览流(1080P)和拍照流(4K)共享同一个 Sensor 输入。若预览卡顿,可检查 IPE 的下采样能力是否足够;若拍照延迟高,可检查 JPEG 编码器的处理速度是否匹配 4K 分辨率。