3. Pipeline核心概念:Pipeline定义、Stream与Pipeline的关系、Pipeline生命周期

在Camera HAL框架中,Pipeline是连接图像传感器(Sensor)、图像信号处理器(ISP)以及应用层请求之间的核心执行单元。理解Pipeline的定义、它与Stream的绑定关系以及完整的生命周期管理,是实现多摄切换和资源高效调度的基础。

3.1 Pipeline定义

Pipeline在HAL层中代表一条从图像采集到最终输出的完整数据处理链路。它封装了硬件资源(如CSI接口、ISP模块、DMA通道)和软件处理模块(如3A算法、HDR合成、畸变校正)。

核心定义:Pipeline是Camera HAL中用于处理一组Stream请求的最小资源分配单元。每个Pipeline实例对应一个物理或虚拟Camera设备的一次完整数据流处理路径。

Pipeline的主要属性包括:

  • Pipeline ID:全局唯一标识符,用于资源追踪和调试。
  • 绑定的Camera ID:指示该Pipeline服务于哪个物理或逻辑摄像头。
  • 支持的Stream配置集合:定义该Pipeline能够处理的Stream格式、分辨率和帧率范围。
  • 硬件资源句柄:指向已分配的ISP、时钟、内存缓冲区等底层资源。
Pipeline内部结构示意图 Pipeline 内部结构 Sensor Input ISP Processing 3A Algorithm Post-Processing Stream Output 硬件资源池 ISP / DMA / Clock

3.2 Stream与Pipeline的关系

Stream是应用层向Camera框架请求的抽象数据流,而Pipeline是HAL层负责实现该数据流的执行实体。二者之间存在明确的多对多映射关系,但在一次Capture Session中,通常是一个Pipeline处理一个或多个Stream。

维度 Stream Pipeline
定义层级 应用层(Framework) HAL层(硬件抽象)
核心属性 格式、分辨率、帧率、用途(Preview/Video/Snapshot) 硬件资源、处理能力、绑定的Camera ID
生命周期 由应用创建和销毁 由HAL根据资源策略创建和销毁
映射关系 一个Stream可被多个Pipeline处理(如多摄融合) 一个Pipeline可同时处理多个Stream(如同时输出Preview和Snapshot)
资源消耗 仅描述数据需求 实际占用ISP、带宽、内存
实战经验:在多摄切换场景中,HAL层需要根据当前激活的Stream配置动态决定是复用已有Pipeline还是创建新的Pipeline。例如,从主摄切换到超广角时,如果两个Camera共享同一ISP Pipeline,则只需重新配置Sensor输入,而不必销毁重建整个Pipeline。
Stream与Pipeline映射关系 Stream 与 Pipeline 映射关系 Stream A (Preview) Stream B (Snapshot) Stream C (Video) Pipeline #1 主摄 ISP 路径 Pipeline #2 超广角 ISP 路径 多对多映射 由 HAL 策略决定绑定

3.3 Pipeline生命周期

Pipeline的生命周期管理是HAL层资源调度的核心。一个Pipeline从创建到销毁经历五个关键阶段,每个阶段都有明确的触发条件和资源操作。

3.3.1 生命周期阶段总览

阶段 触发条件 主要操作 资源状态
创建 应用调用 configureStreams() 分配Pipeline ID、初始化硬件句柄、注册到资源管理器 已分配但未激活
配置 Stream配置下发 绑定Stream、设置Sensor模式、配置ISP参数、分配Buffer 已配置就绪
启动 应用调用 start() 或第一个Capture请求 使能时钟、启动Sensor流、激活ISP、开始帧中断 运行中
停止 应用调用 stop() 或Stream配置变更 停止帧中断、关闭Sensor流、释放Buffer、保留配置 已停止但可恢复
销毁 Session关闭或Camera设备关闭 释放所有硬件资源、从资源管理器注销、回收Pipeline ID 已释放

3.3.2 各阶段详细说明

1. 创建阶段

当应用层调用 ICameraDevice::configureStreams() 时,HAL层开始评估所需的Pipeline数量。创建阶段的核心任务是资源预分配,但不涉及硬件启动。

// Pipeline 创建伪代码示例
pipeline_id = resource_manager->allocate_pipeline_id();
pipeline = new Pipeline(pipeline_id, camera_id);

// 注册到资源管理器
resource_manager->register_pipeline(pipeline);

// 初始化硬件句柄(仅分配,不使能)
pipeline->hw_handle.isp = isp_manager->reserve();
pipeline->hw_handle.sensor = sensor_manager->reserve(camera_id);
pipeline->hw_handle.dma = dma_manager->reserve_channel();

2. 配置阶段

配置阶段将Stream需求转化为硬件参数。HAL需要验证Stream组合是否在当前Pipeline的能力范围内,并设置对应的Sensor输出尺寸、ISP处理流水线以及Buffer队列深度。

常见陷阱:配置阶段必须检查Stream的组合合法性。例如,同时请求4K 60fps Video和20MP Snapshot时,如果ISP带宽不足,HAL应返回错误而非在启动阶段崩溃。建议在配置阶段进行完整的带宽和延迟预算计算。

3. 启动阶段

启动阶段是Pipeline从静态配置进入实时运行的转折点。HAL需要保证所有硬件模块在正确的时序下使能,避免Sensor已经输出数据但ISP尚未就绪的情况。

// Pipeline 启动伪代码
pipeline->state = PipelineState::STARTING;

// 按顺序使能硬件
sensor_manager->start_stream(pipeline->hw_handle.sensor);
isp_manager->enable(pipeline->hw_handle.isp);
dma_manager->start_transfer(pipeline->hw_handle.dma);

// 等待第一个帧中断
pipeline->wait_for_first_frame(1000); // 超时1秒

pipeline->state = PipelineState::RUNNING;

4. 停止阶段

停止阶段需要优雅地关闭数据流,确保正在处理的帧能够完成,避免数据损坏。停止后的Pipeline保留配置信息,可以快速重新启动。

5. 销毁阶段

销毁阶段释放所有占用的硬件资源。在多摄切换场景中,销毁一个Pipeline可能触发资源重新分配,例如将ISP带宽让给另一个更高优先级的Pipeline。

Pipeline生命周期状态机 Pipeline 生命周期状态机 创建 配置 启动 停止 销毁 configureStreams start() stop() restart() close() 配置失败 / 异常销毁

3.3.3 生命周期管理最佳实践

  • 延迟创建:仅在确认需要时才创建Pipeline,避免预创建浪费资源。多摄场景中,备用Camera的Pipeline可以在切换前200ms创建。
  • 配置缓存:停止阶段保留配置信息,使得快速重启时无需重新配置Stream参数,减少切换延迟。
  • 资源隔离:不同Pipeline之间应使用独立的硬件资源句柄,避免一个Pipeline的崩溃影响其他Pipeline。
  • 超时处理:启动和停止阶段必须设置超时机制,防止硬件挂起导致整个HAL线程阻塞。
性能指标参考:在主流移动平台上,Pipeline创建耗时约5-15ms,配置耗时约3-8ms,启动耗时约10-30ms(取决于Sensor稳定时间),停止耗时约2-5ms,销毁耗时约1-3ms。多摄切换场景要求总切换时间控制在100ms以内,因此Pipeline的复用和快速重启策略至关重要。