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)架构,进一步解耦了算法与硬件。

核心设计理念:HAL3将相机视为一个可编程的ISP(图像信号处理器)流水线,应用层通过CaptureRequest描述期望的帧参数,HAL返回CaptureResult,实现帧级控制。
对比HAL1:HAL1仅支持简单的预览/拍照/录像切换,无法逐帧调整曝光、增益、白平衡等参数。HAL3则允许每一帧独立配置,是实现专业模式、多帧合成、UVC扩展设备控制的基础。
HAL3 架构分层图 应用层 (Camera2 API / CameraX) Framework层 (CameraService / CameraProvider) HAL层 (Camera HAL3 + Chi) Camera Device | Pipeline | Stream 内核/硬件层 (V4L2 / ISP / Sensor) UVC协议集成主要工作在HAL层与内核层之间,通过V4L2桥接

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接口
UVC集成注意:当集成UVC设备时,Camera Provider需要额外处理USB热插拔事件,并在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回调。
Camera Device 内部结构 Camera Device (QCameraDevice) Session Manager Pipeline会话管理 Metadata Processor 参数解析与填充 Buffer Manager GraphicBuffer管理 Chi Callback Pipeline完成回调 Stream Config 流配置管理 Error Handler 错误处理与恢复 UVC设备集成时,需在Session Manager中增加UVC Pipeline类型,并在Buffer Manager中处理USB传输的buffer

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配置流程

  1. 创建Session:根据Stream配置创建Pipeline Session。
  2. 选择Pipeline:根据Stream类型(预览/拍照/视频)选择对应的Pipeline模板。
  3. 实例化节点:为Pipeline中的每个Node创建实例,配置参数。
  4. 连接节点:建立Node之间的buffer传递关系(Link)。
  5. 启动Pipeline:提交第一个CaptureRequest,Pipeline开始处理。
UVC Pipeline特殊性:UVC设备通常不需要复杂的ISP处理(因为USB摄像头自带ISP),因此UVC Pipeline可以大幅简化,只需包含:USB接收节点 → 格式转换节点 → 输出节点。这可以降低延迟和功耗。
典型Preview Pipeline节点连接图 Sensor Node Bayer Node IPE Node Scale Node Output UVC Pipeline简化示例:USB Node → Format Convert Node → Output Node(跳过ISP处理) USB Node Format Convert Output Node

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);
UVC Stream注意事项:UVC设备通常只支持有限的格式和分辨率(如YUYV 640x480、MJPEG 1920x1080)。在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和格式。