2. 高通Camera HAL层基础:HAL3架构详解、Camera Provider、Camera Device、Pipeline与Stream
本章深入剖析高通平台Camera HAL3架构的核心组件,包括Camera Provider、Camera Device、Pipeline与Stream。理解这些基础概念是后续集成UVC协议的前提,也是调试和优化相机性能的关键。
2.1 HAL3架构概览
Android Camera HAL3(HAL3)是Android 5.0引入的相机硬件抽象层标准,取代了HAL1的单一接口模式。HAL3采用流水线(Pipeline)模型,支持每帧级别的参数控制、多路输出流和高速连拍。高通平台在HAL3基础上扩展了Chi(Camera Hardware Interface)架构,进一步解耦了算法与硬件。
CaptureRequest描述期望的帧参数,HAL返回CaptureResult,实现帧级控制。
2.2 Camera Provider
Camera Provider是Android Treble架构引入的HAL服务进程,负责枚举相机设备、管理设备生命周期,并作为CameraService与HAL之间的桥梁。在高通平台上,Camera Provider通常以android.hardware.camera.provider@2.4或@2.5服务的形式运行。
2.2.1 核心职责
- 设备枚举:通过
getCameraIdList()返回所有可用相机ID列表。 - 设备创建:通过
getCameraDeviceInterface()为每个相机ID创建对应的CameraDevice实例。 - 权限管理:检查调用方是否有权限访问相机资源。
- 热插拔通知:通过回调通知CameraService设备连接/断开事件(对UVC设备尤为重要)。
2.2.2 高通平台实现
高通在vendor/qcom/proprietary/chi-cdk/中提供了Camera Provider的参考实现。关键文件包括:
| 文件/模块 | 作用 |
|---|---|
QCameraProvider.cpp |
Provider主实现,管理设备列表和生命周期 |
QCamera2Factory.cpp |
相机设备工厂,负责实例化Camera Device |
QCameraHAL3.cpp |
HAL3接口适配层,将Chi API映射到标准HAL3接口 |
getCameraIdList()中动态添加/移除UVC设备ID。默认的Provider只枚举板载传感器,需要修改QCameraProvider.cpp中的设备发现逻辑。
2.3 Camera Device
Camera Device是HAL3中代表单个相机硬件的抽象接口。每个物理或虚拟相机对应一个CameraDevice实例。它负责处理来自Framework的CaptureRequest,配置Stream,并返回CaptureResult。
2.3.1 关键接口方法
| 方法 | 描述 |
|---|---|
initialize() |
初始化设备,传入CameraService回调 |
configureStreams() |
配置输出流集合(Stream Configuration) |
processCaptureRequest() |
提交单帧或多帧CaptureRequest |
flush() |
清空所有待处理请求 |
dump() |
输出调试信息 |
2.3.2 高通Camera Device内部结构
高通平台的Camera Device内部包含多个模块:
- Session管理:管理Pipeline会话,每个Session对应一组Stream配置。
- Metadata处理器:解析和填充Android Camera Metadata(如
ANDROID_SENSOR_EXPOSURE_TIME)。 - Buffer管理:管理GraphicBuffer的分配、映射和释放。
- Chi回调:接收Chi Pipeline完成事件,转换为HAL3回调。
2.4 Pipeline
Pipeline是HAL3中处理图像数据的核心流水线。高通Chi架构将Pipeline定义为一系列节点(Node)的连接图,每个节点执行特定的图像处理任务(如Bayer处理、降噪、缩放、编码等)。
2.4.1 Pipeline类型
| Pipeline类型 | 用途 | 典型节点数 |
|---|---|---|
| Preview Pipeline | 预览流处理,低延迟优先 | 5-8 |
| Snapshot Pipeline | 拍照流处理,高画质优先 | 8-12 |
| Video Pipeline | 视频录制流处理,帧率稳定优先 | 6-10 |
| UVC Pipeline | UVC设备专用,需包含USB传输节点 | 4-6(简化) |
2.4.2 Pipeline配置流程
- 创建Session:根据Stream配置创建Pipeline Session。
- 选择Pipeline:根据Stream类型(预览/拍照/视频)选择对应的Pipeline模板。
- 实例化节点:为Pipeline中的每个Node创建实例,配置参数。
- 连接节点:建立Node之间的buffer传递关系(Link)。
- 启动Pipeline:提交第一个CaptureRequest,Pipeline开始处理。
2.5 Stream
Stream是HAL3中定义图像数据输出路径的抽象概念。每个Stream对应一个ANativeWindow(Surface),可以是预览Surface、拍照Surface、视频编码Surface或ImageReader。
2.5.1 Stream配置参数
| 参数 | 类型 | 说明 |
|---|---|---|
stream_type |
int | 输出类型:OUTPUT(输出到Surface)或 INPUT(输入到HAL) |
width / height |
int | 图像分辨率 |
format |
int | 像素格式(如HAL_PIXEL_FORMAT_YCbCr_420_888) |
usage |
uint64_t | Buffer使用标志(如GRALLOC_USAGE_HW_TEXTURE) |
data_space |
int | 色彩空间(如HAL_DATASPACE_STANDARD_BT709) |
rotation |
int | 旋转角度(0/90/180/270) |
2.5.2 Stream配置示例
以下代码展示了如何配置一个预览Stream和一个拍照Stream:
// 创建Stream配置
camera3_stream_configuration_t stream_config;
stream_config.num_streams = 2;
camera3_stream_t preview_stream;
preview_stream.stream_type = CAMERA3_STREAM_OUTPUT;
preview_stream.width = 1920;
preview_stream.height = 1080;
preview_stream.format = HAL_PIXEL_FORMAT_YCbCr_420_888;
preview_stream.usage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_HW_COMPOSER;
preview_stream.max_buffers = 4;
camera3_stream_t snapshot_stream;
snapshot_stream.stream_type = CAMERA3_STREAM_OUTPUT;
snapshot_stream.width = 4032;
snapshot_stream.height = 3024;
snapshot_stream.format = HAL_PIXEL_FORMAT_BLOB;
snapshot_stream.usage = GRALLOC_USAGE_SW_READ_OFTEN;
snapshot_stream.max_buffers = 2;
camera3_stream_t* streams[] = {&preview_stream, &snapshot_stream};
stream_config.streams = streams;
// 调用configureStreams
int ret = device->ops->configure_streams(device, &stream_config);
configureStreams()中,如果应用请求的格式UVC设备不支持,HAL需要返回-EINVAL或尝试格式转换。建议在getCameraCharacteristics()中如实报告UVC设备支持的Stream配置,避免配置失败。
2.6 总结:HAL3组件关系
Camera Provider、Camera Device、Pipeline和Stream之间的关系可以概括为:
- Camera Provider是服务管理者,负责发现和创建Camera Device。
- Camera Device是单个相机的抽象,管理Pipeline和Stream的生命周期。
- Pipeline是图像处理流水线,由多个Node组成,处理从Sensor到输出的数据流。
- Stream是输出路径定义,指定图像数据的目标Surface和格式。