2. HAL层核心组件解析:Camera HAL3接口、Pipeline、Stream、Session、Request的概念与关系
在高通Camera HAL3架构中,理解核心组件及其关系是配置ISP Pipeline的基础。本章将深入解析HAL3接口、Pipeline、Stream、Session和Request这五个核心概念,并通过结构图和表格阐明它们之间的协作关系。
2.1 Camera HAL3接口:应用与硬件的桥梁
Camera HAL3(Hardware Abstraction Layer 3)是Android Camera框架定义的硬件抽象层接口,它位于Android Camera Service与底层硬件驱动之间。高通平台在此基础上实现了自定义的HAL层,称为Chx(Camera HAL eXtension)。
HAL3接口的关键方法包括:
- open():打开Camera设备,初始化Pipeline。
- configureStreams():配置数据流(Stream),定义图像格式、分辨率、方向等。
- processCaptureRequest():提交捕获请求(Request),触发一次图像采集与处理。
- flush():清空所有待处理的Request队列。
- close():关闭Camera设备,释放资源。
2.2 Pipeline:图像处理流水线
Pipeline是ISP图像处理的核心执行单元,它定义了一条从传感器原始数据(RAW)到最终输出图像(YUV/JPEG)的完整处理链路。在高通平台上,Pipeline由多个IFE(Image Front End)、IPE(Image Processing Engine)、BPS(Bayer Processing Segment)等硬件模块串联而成。
Pipeline的主要属性包括:
| 属性 | 说明 | 示例值 |
|---|---|---|
| Pipeline ID | 唯一标识一条处理流水线 | 0x1001 |
| Sensor ID | 绑定的物理传感器 | 0 / 1 |
| Stream Config | 支持的流配置集合 | YUV_420_888@1920x1080 |
| Max Frame Rate | 最大帧率限制 | 30fps / 60fps |
| HW Block List | 经过的硬件模块列表 | IFE0 → IPE0 → BPS |
2.3 Stream:数据流的抽象
Stream是图像数据流的抽象描述,它定义了从Pipeline输出到内存缓冲区的数据格式和路径。一个Pipeline可以同时输出多个Stream,例如预览流(Preview Stream)、拍照流(Snapshot Stream)和视频流(Video Stream)。
Stream的关键参数:
- Format:像素格式,如NV12、YUV420、JPEG、RAW10。
- Resolution:图像分辨率,如1920x1080、3840x2160。
- Usage:用途标记,如GRALLOC_USAGE_HW_TEXTURE、GRALLOC_USAGE_HW_VIDEO_ENCODER。
- Rotation:输出旋转角度(0°/90°/180°/270°)。
2.4 Session:配置会话的容器
Session是HAL3中管理一组Stream和Pipeline配置的会话上下文。当应用调用configureStreams()时,HAL层会创建一个Session,将用户请求的Stream集合与可用的Pipeline资源进行匹配和绑定。
Session的生命周期:
- 创建:应用调用configureStreams(),HAL分配Pipeline资源。
- 激活:Session进入就绪状态,等待Request提交。
- 处理:多个Request在Session内排队执行。
- 销毁:应用关闭Camera或重新配置Stream时销毁。
2.5 Request:一次捕获的指令单元
Request是HAL3中最细粒度的执行单元,它描述了一次完整的图像捕获请求。每个Request包含以下核心信息:
- Frame Number:帧序号,用于追踪和同步。
- Settings:3A参数(AE/AWB/AF)、曝光时间、ISO、增益等。
- Output Buffers:目标输出缓冲区列表,每个缓冲区对应一个Stream。
- Input Buffer:可选,用于重处理(Reprocess)的输入缓冲区。
// 典型的CaptureRequest结构(伪代码)
struct CaptureRequest {
uint32_t frameNumber; // 帧序号
CameraMetadata settings; // 3A参数与自定义设置
std::vector<StreamBuffer> outputBuffers; // 输出缓冲区列表
StreamBuffer inputBuffer; // 重处理输入(可选)
int32_t sensorId; // 目标传感器
};
2.6 核心组件关系图
下图展示了HAL3接口、Pipeline、Stream、Session和Request之间的层级关系与数据流向:
2.7 组件关系总结表
| 组件 | 层级 | 生命周期 | 与上层关系 | 与下层关系 |
|---|---|---|---|---|
| HAL3接口 | 最顶层 | Camera打开到关闭 | 接收Framework调用 | 创建/管理Session |
| Session | 配置层 | configureStreams到close | 由HAL3接口创建 | 绑定Pipeline和Stream |
| Pipeline | 处理层 | Session创建到销毁 | 由Session分配 | 执行Request的处理 |
| Stream | 数据层 | Session创建到销毁 | 由Session配置 | 定义输出格式/分辨率 |
| Request | 执行层 | 提交到完成 | 由应用通过HAL3提交 | 触发Pipeline执行 |
2.8 高通平台特殊处理
在高通平台上,上述组件有额外的实现细节:
- Multi-Camera Session:一个Session可以同时绑定多个物理Camera的Pipeline,实现双摄/多摄融合。
- Realtime vs Non-Realtime Pipeline:高通区分实时Pipeline(预览/视频)和非实时Pipeline(拍照/重处理),前者有严格的帧率保证。
- Usecase抽象:高通引入Usecase概念,将常见的相机场景(如普通拍照、HDR、夜景)预定义为Pipeline模板,简化配置。