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中选择最合适的实例。选择逻辑基于以下因素:

  1. Usecase类型:Preview、Video、Snapshot等不同场景优先匹配对应的Pipeline模板。
  2. Stream配置:根据请求的流数量、分辨率、格式筛选兼容的Pipeline。
  3. Feature需求:检查Pipeline是否支持请求的功能(如HDR、MFNR)。
  4. 性能预算:评估Pipeline的执行时间是否满足帧率要求。
  5. 硬件资源:确认Pipeline所需的硬件模块(如ISP、DSP)当前可用。
常见陷阱:当多个Pipeline同时满足条件时,选择逻辑默认优先选择功能最完整的Pipeline。这可能导致不必要的功耗开销。建议在配置中显式指定 preferred_pipeline 以覆盖默认行为。

下图展示了Pipeline选择的核心流程:

Pipeline选择逻辑流程图 应用请求 步骤1:解析Usecase类型 步骤2:匹配Stream配置 步骤3:检查Feature支持 步骤4:性能与资源评估 选择优先级 1. 精确匹配Usecase 2. Stream兼容性 3. Feature完整性

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拓扑对比:

三大场景Pipeline拓扑对比 Preview Sensor IFE IPE Display Video Sensor IFE IPE Encoder Snapshot Sensor IFE IPE MFNR JPEG 拓扑差异说明 Preview: 最短路径,低延迟 Video: 分叉路径,预览+编码 Snapshot: 最长路径,多帧处理

4.5 Usecase配置最佳实践

配置原则:Usecase配置应遵循“最小化原则”——只包含当前场景必需的Session和Pipeline,避免冗余配置导致资源浪费。
  • 复用Pipeline模板:对于相似的Usecase(如不同分辨率的Preview),尽量复用同一个Pipeline模板,通过Session参数微调差异。
  • 显式指定Feature:不要依赖默认Feature掩码,显式列出每个Usecase需要的Feature,避免意外启用不需要的功能。
  • 性能测试验证:每次修改Usecase配置后,必须进行帧率、延迟、功耗的基准测试,确保配置变更不会引入性能退化。
  • 版本管理:Usecase配置文件应纳入版本管理,每次修改记录变更原因和性能影响。