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>
Usecase Node 连接拓扑示例 Sensor IFE IPE Display JPEG 数据流从 Sensor 出发,经 IFE 处理后分两路:一路送 Display 预览,一路送 JPEG 编码拍照。

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 下降低分辨率。
分辨率与 FPS 协同约束关系 分辨率 vs FPS 协同约束 ISP 像素时钟 4K @ 30fps 1080P @ 60fps DDR 带宽 4K @ 60fps 可能超限 需降分辨率或降帧率 Sensor 输出模式 Binning: 高帧率低分辨率 Skipping: 裁剪输出 调优原则:优先满足目标 FPS,再选择该 FPS 下 Sensor 和 ISP 能支持的最高分辨率。 若 4K @ 60fps 无法稳定,可尝试 4K @ 30fps 或 1080P @ 60fps。

实际配置示例:高帧率录像 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 分辨率。