3. Pipeline核心概念:Pipeline定义、Stream与Pipeline的关系、Pipeline生命周期
在Camera HAL框架中,Pipeline是连接图像传感器(Sensor)、图像信号处理器(ISP)以及应用层请求之间的核心执行单元。理解Pipeline的定义、它与Stream的绑定关系以及完整的生命周期管理,是实现多摄切换和资源高效调度的基础。
3.1 Pipeline定义
Pipeline在HAL层中代表一条从图像采集到最终输出的完整数据处理链路。它封装了硬件资源(如CSI接口、ISP模块、DMA通道)和软件处理模块(如3A算法、HDR合成、畸变校正)。
Pipeline的主要属性包括:
- Pipeline ID:全局唯一标识符,用于资源追踪和调试。
- 绑定的Camera ID:指示该Pipeline服务于哪个物理或逻辑摄像头。
- 支持的Stream配置集合:定义该Pipeline能够处理的Stream格式、分辨率和帧率范围。
- 硬件资源句柄:指向已分配的ISP、时钟、内存缓冲区等底层资源。
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、带宽、内存 |
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队列深度。
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。
3.3.3 生命周期管理最佳实践
- 延迟创建:仅在确认需要时才创建Pipeline,避免预创建浪费资源。多摄场景中,备用Camera的Pipeline可以在切换前200ms创建。
- 配置缓存:停止阶段保留配置信息,使得快速重启时无需重新配置Stream参数,减少切换延迟。
- 资源隔离:不同Pipeline之间应使用独立的硬件资源句柄,避免一个Pipeline的崩溃影响其他Pipeline。
- 超时处理:启动和停止阶段必须设置超时机制,防止硬件挂起导致整个HAL线程阻塞。