高通平台Camera HAL层UVC协议集成 - 第3节

3.1 USB Video Class 标准概述

USB Video Class(UVC)是 USB 实现组织(USB-IF)定义的设备类标准,用于规范通过 USB 总线传输视频流数据的设备行为。UVC 标准的核心目标是让操作系统和应用程序能够通过统一的驱动程序接口访问不同厂商的摄像头设备,无需为每款摄像头单独安装驱动。

UVC 标准经历了多个版本迭代,每个版本在带宽、帧率、分辨率支持和协议扩展上都有显著提升:

版本 发布时间 最大带宽(USB 2.0) 关键特性
UVC 1.0 2003 480 Mbps 基础视频流、静态图像捕获、基本控制
UVC 1.1 2005 480 Mbps 增加 H.264 编码支持、改进帧同步
UVC 1.5 2012 5 Gbps(USB 3.0) 4K 分辨率、MJPEG 优化、多流支持
实战提示:在高通平台 Camera HAL 层集成 UVC 时,优先选择 UVC 1.5 兼容设备,以充分利用 USB 3.0 带宽,支持 4K@30fps 或 1080p@60fps 的高帧率视频流。

3.2 UVC 描述符体系

UVC 描述符是设备向主机报告自身能力的数据结构,位于 USB 配置描述符(Configuration Descriptor)内部。主机通过解析这些描述符,获知摄像头的控制能力、流格式、帧尺寸、编码类型等信息。

UVC 描述符体系分为三个层级:

  1. Class-Specific 描述符:定义 UVC 设备特有的功能单元和终端。
  2. 标准 USB 描述符:设备描述符、配置描述符、接口描述符、端点描述符。
  3. 帧格式描述符:描述支持的视频格式(YUY2、MJPEG、H.264)和帧尺寸。

以下是一个典型的 UVC 描述符解析流程:

// 伪代码:UVC 描述符解析入口
void parse_uvc_descriptor(usb_device_handle *dev) {
    // 1. 获取配置描述符
    struct usb_config_descriptor *config = get_config_descriptor(dev);
    
    // 2. 遍历接口描述符,查找 VideoControl Interface
    for (int i = 0; i < config->bNumInterfaces; i++) {
        struct usb_interface *iface = &config->interface[i];
        if (iface->altsetting->bInterfaceClass == 0x0E &&  // Video Class
            iface->altsetting->bInterfaceSubClass == 0x01) { // VideoControl Subclass
            parse_video_control_descriptor(iface);
        }
    }
    
    // 3. 遍历 VideoStreaming 接口描述符
    for (int i = 0; i < config->bNumInterfaces; i++) {
        struct usb_interface *iface = &config->interface[i];
        if (iface->altsetting->bInterfaceClass == 0x0E &&
            iface->altsetting->bInterfaceSubClass == 0x02) { // VideoStreaming Subclass
            parse_video_streaming_descriptor(iface);
        }
    }
}
常见陷阱:部分低端 UVC 设备描述符中可能缺少帧间隔描述符(dwFrameInterval),导致 HAL 层无法正确计算帧率。集成时需添加默认帧率回退逻辑(如 30fps)。

3.3 VideoControl Interface(VCI)

VideoControl Interface(VCI)是 UVC 设备中负责控制功能的接口,不传输视频数据。它通过控制端点(Endpoint 0)与主机通信,实现摄像头参数调节、设备状态查询等功能。

VCI 内部包含以下核心单元:

  • Input Terminal(IT):视频输入源,如传感器、HDMI 输入。
  • Output Terminal(OT):视频输出目标,如 USB 端点。
  • Processing Unit(PU):图像处理单元,控制亮度、对比度、饱和度等。
  • Extension Unit(XU):厂商自定义扩展单元,用于私有控制功能。
  • Selector Unit(SU):多路选择器,切换不同输入源。

以下 SVG 图展示了 VCI 内部单元之间的拓扑关系:

VideoControl Interface 内部拓扑 Input Terminal Selector Unit Processing Unit Extension Unit Output Terminal 说明: 实线表示视频数据流路径,虚线表示控制信号路径。 Extension Unit 为可选单元,用于厂商自定义功能(如自动白平衡、人脸追踪)。
高通平台集成要点:在 Camera HAL 层中,VCI 的控制请求通过 USB 控制传输(bmRequestType=0x21)发送。HAL 需要实现一个控制请求封装层,将 Android Camera 的 metadata 参数(如 AE、AWB)映射为 UVC 控制选择子(Control Selector)。

3.4 VideoStreaming Interface(VSI)

VideoStreaming Interface(VSI)是 UVC 设备中负责视频数据传输的接口。它通过等时端点(Isochronous Endpoint)或批量端点(Bulk Endpoint)向主机发送视频帧数据。VSI 支持多个备选设置(Alternate Setting),每个设置对应不同的带宽占用和帧格式。

VSI 描述符中定义了以下关键信息:

描述符类型 bDescriptorSubtype 内容说明
Input Header 0x01 VSI 头部信息,包含总长度、时钟频率等
Format Descriptor 0x02 视频格式类型(YUY2、MJPEG、H.264)
Frame Descriptor 0x03 帧宽度、高度、帧间隔(帧率)
Color Matching 0x0D 色彩空间、传输特性、矩阵系数

以下 SVG 图展示了 VSI 在 USB 总线上的数据传输流程:

VideoStreaming Interface 数据传输流程 摄像头传感器 UVC 设备固件 (编码+打包) USB 总线 主机 HAL 层 (解析+分发) 数据包结构(UVC Payload Header + Data): [Header: 2 bytes] bHeaderLength + bmHeaderInfo(帧开始/结束标志、PTS、SCR) [Payload: N bytes] 视频帧数据(YUY2/MJPEG/H.264 编码流) [Padding: 0-3 bytes] 对齐到 USB 数据包边界 注意:等时传输模式下,每个微帧(125μs)最多发送 3 个数据包。
性能优化建议:在高通平台上,建议使用批量端点(Bulk Endpoint)替代等时端点,因为批量传输具有重传机制,在 USB 总线繁忙时能提供更稳定的帧率。但需注意批量传输不支持实时性要求极高的场景(如 USB 摄像头预览延迟 < 50ms)。

3.5 VCI 与 VSI 的协同工作

在实际 UVC 设备中,VCI 和 VSI 通过同一个 USB 配置描述符下的两个不同接口协同工作。VCI 负责控制通道,VSI 负责数据通道。主机通过 VCI 下发控制命令(如设置分辨率、调节曝光),VSI 则根据当前配置开始或停止视频流传输。

以下表格总结了 VCI 和 VSI 的核心差异:

对比维度 VideoControl Interface VideoStreaming Interface
主要功能 摄像头参数控制 视频数据传输
USB 端点类型 控制端点(Endpoint 0) 等时/批量端点
数据传输方向 双向(控制请求+响应) 单向(设备→主机)
带宽占用 极低(仅控制命令) 高(视频帧数据)
HAL 层处理 同步请求,阻塞等待响应 异步轮询,DMA 传输
架构设计要点:在高通 Camera HAL 中,建议将 VCI 控制逻辑放在单独的线程中处理,避免阻塞视频流接收线程。同时,VSI 的数据接收应使用零拷贝(ION buffer)机制,减少内存拷贝开销,提升 4K 视频流的处理效率。