4、Usecase配置详解:Usecase的组成、Session配置、Pipeline选择逻辑、不同场景下的Usecase模板(Preview, Video, Snapshot)
在Camx HAL架构中,Usecase是连接上层应用请求与底层Pipeline执行的桥梁。一个Usecase定义了一次完整的拍照或录像行为所涉及的Session、Pipeline、Stream以及传感器配置。本章将深入剖析Usecase的组成结构、Session配置方法、Pipeline选择逻辑,并给出Preview、Video、Snapshot三大核心场景的配置模板。
4.1 Usecase的组成结构
一个完整的Usecase由以下核心元素组成:
- Usecase Name:唯一标识,如
UsecasePreview、UsecaseVideo、UsecaseSnapshot。 - Session List:一个Usecase可以包含多个Session,每个Session对应一个独立的Pipeline执行上下文。
- Pipeline Descriptor:描述Pipeline的拓扑结构,包括Node、Link、Port等。
- Stream Config:定义输入输出流的格式、分辨率、帧率等参数。
- Sensor Config:指定使用的传感器模式、曝光参数、增益等。
- Feature Flags:启用或禁用特定功能,如HDR、MFNR、EIS等。
关键概念:Usecase是应用层与硬件抽象层之间的契约。应用层通过Usecase ID请求特定功能,HAL层根据Usecase配置实例化对应的Pipeline并执行。
下表列出了Usecase配置文件中常见的字段及其含义:
| 字段名 | 类型 | 说明 |
|---|---|---|
usecase_id |
uint32 | Usecase唯一标识符 |
session_count |
uint32 | 该Usecase包含的Session数量 |
pipeline_name |
string | 关联的Pipeline模板名称 |
stream_combinations |
array | 支持的流组合列表 |
feature_mask |
uint64 | 功能位掩码 |
4.2 Session配置详解
Session是Usecase的执行单元,每个Session包含一个独立的Pipeline实例。Session配置决定了Pipeline的拓扑结构、资源分配以及执行策略。
Session配置的核心参数包括:
- Session ID:在Usecase内唯一标识Session。
- Pipeline ID:指向具体的Pipeline模板。
- Node Overrides:允许对Pipeline中的特定Node进行参数覆盖。
- Buffer Management:定义输入输出缓冲区的分配策略(如预分配、按需分配)。
- Synchronization:多Session之间的同步机制(如帧同步、事件同步)。
性能提示:在配置Session时,应尽量减少Node Overrides的使用,因为每次Override都会增加Pipeline实例化的开销。推荐在Pipeline模板中定义通用配置,仅在必要时通过Session进行微调。
以下是一个典型的Session配置代码片段:
session {
session_id = 0
pipeline_id = "pipeline_preview_default"
node_overrides {
node_name = "IFE"
parameter {
name = "output_format"
value = "NV12"
}
}
buffer_pool {
pool_size = 4
allocation_strategy = "pre_allocate"
}
}
4.3 Pipeline选择逻辑
Pipeline选择是Usecase配置中最关键的决策点。Camx HAL通过一套优先级规则从多个候选Pipeline中选择最合适的实例。选择逻辑基于以下因素:
- Usecase类型:Preview、Video、Snapshot等不同场景优先匹配对应的Pipeline模板。
- Stream配置:根据请求的流数量、分辨率、格式筛选兼容的Pipeline。
- Feature需求:检查Pipeline是否支持请求的功能(如HDR、MFNR)。
- 性能预算:评估Pipeline的执行时间是否满足帧率要求。
- 硬件资源:确认Pipeline所需的硬件模块(如ISP、DSP)当前可用。
常见陷阱:当多个Pipeline同时满足条件时,选择逻辑默认优先选择功能最完整的Pipeline。这可能导致不必要的功耗开销。建议在配置中显式指定
preferred_pipeline 以覆盖默认行为。
下图展示了Pipeline选择的核心流程:
4.4 不同场景下的Usecase模板
Camx HAL为最常见的三大场景提供了预定义的Usecase模板:Preview、Video、Snapshot。每个模板针对其使用场景进行了专门的优化。
4.4.1 Preview Usecase模板
Preview场景要求低延迟、持续输出。其Usecase模板配置要点如下:
- Session数量:通常为1个Session,避免多Session同步开销。
- Pipeline拓扑:Sensor → IFE → IPE → Display,减少处理节点以降低延迟。
- Buffer管理:使用双缓冲或三缓冲机制,确保帧率稳定。
- Feature限制:默认关闭计算密集型功能(如MFNR、HDR),仅在用户显式请求时启用。
usecase_preview {
usecase_id = 1
session_count = 1
session {
session_id = 0
pipeline_id = "pipeline_preview_low_latency"
stream_config {
output_stream {
format = "NV12"
resolution = "1920x1080"
framerate = 30
}
}
feature_mask = 0x0001 // 仅启用基础功能
}
}
4.4.2 Video Usecase模板
Video场景在保证帧率的同时,对画质和编码效率有更高要求。其模板配置特点:
- Session数量:通常为2个Session,一个用于预览,一个用于编码。
- Pipeline拓扑:预览路径 Sensor → IFE → IPE → Display;编码路径 Sensor → IFE → IPE → Video Encoder。
- Buffer管理:编码路径使用更大的Buffer池(如6~8个Buffer),以应对编码器突发负载。
- Feature启用:根据视频规格启用EIS(电子防抖)、HDR等。
性能优化点:Video场景中,预览Session和编码Session共享Sensor输出流。通过配置
stream_share 机制,可以避免重复的Sensor读取,显著降低功耗。
usecase_video {
usecase_id = 2
session_count = 2
session {
session_id = 0 // 预览Session
pipeline_id = "pipeline_video_preview"
stream_config {
output_stream {
format = "NV12"
resolution = "1920x1080"
framerate = 30
}
}
}
session {
session_id = 1 // 编码Session
pipeline_id = "pipeline_video_encode"
stream_config {
output_stream {
format = "NV12"
resolution = "1920x1080"
framerate = 30
}
encoded_stream {
codec = "H264"
bitrate = 20000000
}
}
feature_mask = 0x0012 // 启用EIS和HDR
}
}
4.4.3 Snapshot Usecase模板
Snapshot场景追求最高画质,允许牺牲一定的延迟。其模板配置要点:
- Session数量:通常为1个Session,但Pipeline包含后处理节点。
- Pipeline拓扑:Sensor → IFE → IPE → MFNR → JPEG Encoder,包含多帧降噪和编码。
- Buffer管理:使用大Buffer池(如8~12个Buffer),支持多帧输入。
- Feature启用:默认启用MFNR、HDR、Super Resolution等画质增强功能。
usecase_snapshot {
usecase_id = 3
session_count = 1
session {
session_id = 0
pipeline_id = "pipeline_snapshot_high_quality"
stream_config {
output_stream {
format = "JPEG"
resolution = "4032x3024"
quality = 95
}
}
feature_mask = 0x00FF // 启用所有画质增强功能
node_overrides {
node_name = "MFNR"
parameter {
name = "frame_count"
value = "4"
}
}
}
}
下表总结了三大Usecase模板的核心差异:
| 特性 | Preview | Video | Snapshot |
|---|---|---|---|
| 延迟要求 | 低(< 50ms) | 中(< 100ms) | 高(可接受 > 200ms) |
| 帧率 | 30~60 fps | 24~60 fps | 单帧 |
| Session数量 | 1 | 2 | 1 |
| Buffer池大小 | 2~3 | 6~8 | 8~12 |
| 核心Feature | 基础处理 | EIS, HDR | MFNR, Super Res |
下图展示了三大Usecase的Pipeline拓扑对比:
4.5 Usecase配置最佳实践
配置原则:Usecase配置应遵循“最小化原则”——只包含当前场景必需的Session和Pipeline,避免冗余配置导致资源浪费。
- 复用Pipeline模板:对于相似的Usecase(如不同分辨率的Preview),尽量复用同一个Pipeline模板,通过Session参数微调差异。
- 显式指定Feature:不要依赖默认Feature掩码,显式列出每个Usecase需要的Feature,避免意外启用不需要的功能。
- 性能测试验证:每次修改Usecase配置后,必须进行帧率、延迟、功耗的基准测试,确保配置变更不会引入性能退化。
- 版本管理:Usecase配置文件应纳入版本管理,每次修改记录变更原因和性能影响。