UVC摄像头技术笔记
+ -

UVC摄像头的关闭流程及抓包分析

2021-04-01 2243 0

通过UVC协议规范可以知道,UVC的数据传输支持USB四种传输中的批量传输同步传输,所以对于UVC摄像头,当我们在摄像头正在工作时,需要停止摄像头工作,执行的操作是不同的。

在Linux的源代码中,摄像头的流关闭是由函数uvc_video_stop_streaming完成的。代码比较简单,我们直接给出原代码

linux-5.6.11\linux-5.6.11\drivers\media\usb\uvc\uvc_video.c:2080

void uvc_video_stop_streaming(struct uvc_streaming *stream)
{
    uvc_video_stop_transfer(stream, 1);

    if (stream->intf->num_altsetting > 1) {
        usb_set_interface(stream->dev->udev, stream->intfnum, 0);
    } else {
        /* UVC doesn't specify how to inform a bulk-based device
         * when the video stream is stopped. Windows sends a
         * CLEAR_FEATURE(HALT) request to the video streaming
         * bulk endpoint, mimic the same behaviour.
         */
        unsigned int epnum = stream->header.bEndpointAddress
                   & USB_ENDPOINT_NUMBER_MASK;
        unsigned int dir = stream->header.bEndpointAddress
                 & USB_ENDPOINT_DIR_MASK;
        unsigned int pipe;

        pipe = usb_sndbulkpipe(stream->dev->udev, epnum) | dir;
        usb_clear_halt(stream->dev->udev, pipe);
    }

    uvc_video_clock_cleanup(stream);
}

UVC摄像头同步传输的关闭

在UVC规范中,如果采用同步数据传输,那么数据流接口的转换接口为0的接口中默认是没有端点描述符中,是用于摄像头关闭或者不工作时;而转换接口非0的接口中含有对应的同步传输端点,用于数据传输。
如本人手中的一个摄像头,是一个多转换接口的UVC摄像头,在摄像头关闭时,抓包内容如下:

CTL    01 0b 00 00  01 00 00 00                  SET INTERFACE

可以看到,发送选择接口命令,接口ID=1,转换接口ID=0

视频流转换接口ID=1:

        ---------------- Interface Descriptor -----------------
bLength                  : 0x09 (9 bytes)
bDescriptorType          : 0x04 (Interface Descriptor)
bInterfaceNumber         : 0x01
bAlternateSetting        : 0x01
bNumEndpoints            : 0x01 (1 Endpoint)
bInterfaceClass          : 0x0E (Video)
bInterfaceSubClass       : 0x02 (Video Streaming)
bInterfaceProtocol       : 0x00
iInterface               : 0x06 (String Descriptor 6)
 Language 0x0409         : "Video Streaming"
Data (HexDump)           : 09 04 01 01 01 0E 02 00 06                        .........

        ----------------- Endpoint Descriptor -----------------
bLength                  : 0x07 (7 bytes)
bDescriptorType          : 0x05 (Endpoint Descriptor)
bEndpointAddress         : 0x81 (Direction=IN EndpointID=1)
bmAttributes             : 0x05 (TransferType=Isochronous  SyncType=Asynchronous  EndpointType=Data)
wMaxPacketSize           : 0x03FF
 Bits 15..13             : 0x00 (reserved, must be zero)
 Bits 12..11             : 0x00 (0 additional transactions per microframe -> allows 1..1024 bytes per packet)
 Bits 10..0              : 0x3FF (1023 bytes per packet)
bInterval                : 0x01 (1 ms)
Data (HexDump)           : 07 05 81 05 FF 03 01                              .......

通过BUSHOUND显示的设备端点信息:
VC摄像头同步传输端点

UVC摄像头批量传输的关闭

批量传输是需要是需要停止当前的数据传输,故需要Reset。在Linux源代码中是通过usb_clear_halt函数实现的。

int usb_clear_halt(struct usb_device *dev, int pipe)
{
    int result;
    int endp = usb_pipeendpoint(pipe);

    if (usb_pipein(pipe))
        endp |= USB_DIR_IN;

    /* we don't care if it wasn't halted first. in fact some devices
     * (like some ibmcam model 1 units) seem to expect hosts to make
     * this request for iso endpoints, which can't halt!
     */
    result = usb_control_msg_send(dev, 0,
                      USB_REQ_CLEAR_FEATURE, USB_RECIP_ENDPOINT,
                      USB_ENDPOINT_HALT, endp, NULL, 0,
                      USB_CTRL_SET_TIMEOUT, GFP_NOIO);

    /* don't un-halt or force to DATA0 except on success */
    if (result)
        return result;

    /* NOTE:  seems like Microsoft and Apple don't bother verifying
     * the clear "took", so some devices could lock up if you check...
     * such as the Hagiwara FlashGate DUAL.  So we won't bother.
     *
     * NOTE:  make sure the logic here doesn't diverge much from
     * the copy in usb-storage, for as long as we need two copies.
     */

    usb_reset_endpoint(dev, endp);

    return 0;
}

抓包如下:

  44.3                                 RESET

从抓包分析可知,对该端点进行复位。
通过BUSHOUND显示该设备的端点信息.
UVC摄像头批量传输

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB音箱 工作抓包分析
USB音响打开Length Phase Data -------- ----- ------------------------------ -------------- CTL ......
Linux V4L2 UVC摄像头框架浅析
V4L2 :video for linux version 2 ,是 Linux 里一套标准的视频驱动,它支持 UVC 标准的摄像头。本文来分析一下它的核心框架。整个v4l2的框架分为三层:在应用层,我们可以在 /dev 目录发现 video0 类似的设备节点,上层的摄像头程序打开设备节点进行......
打开UVC摄像头(特定类请求)数据分析
通过上节可以知道,设备支持4种的视频格式,且每种格式如下:MPJPG数据格式bFormatIndexbFrameIndex分辩率及及帧率11640x480x(30,15,10)121280x720x(30,15,10)131920x1080x(30,15......
UVC摄像头扩展单元功能的开发步骤是什么?
写在扩展单元的题外话本人在开发支持UVC扩展单元的directShow应用时,必现并不需要注册接口,只需要在其源过滤器参照后续的代码枚举相关的接口如IKsControl,IKsTopologyInfo定位到指定的扩展单元接口后,直接使用其对应的IKsControl::KsProperty即可实现扩展......
UVC摄像头的延迟reduce latency
一般的ISP,200W30帧来说,sensor进来缓存一帧就是33ms+vpu处理时间大概10ms+jpeg编码时间16ms+USB传输时间200KB大概7、8ms,最后就是windows上的显示延迟时间,如果JPEG编码出来缓存不止一帧,时间就更长了,所以一般会超过100多ms另外,网络传输如使......
UVC Windows下UVC摄像头数据分析
这里我们分析一款UVC摄像头来进行数据分析。环境:win10 x64工具:bushound,usbviewer将摄像头插入PC后,打开usbviewer工具,可以看到关于此摄像头的相关信息。可以看到,这个摄像头其实是一个USB复合设备,所以其对应的系统驱动为USBCCGP,然后再由USB复合设......
简易摄像头playcap工程代码及应用程序
playcap是一个小巧的UVC摄像头测试工具,使用的是DirectShow,本人之前装饰部分代码发布到此网址:http://www.usbzh.com/article/detail-553.html但经常有人说编译不过,其实这都是工程配置问题引起的。现将工程代码及编译好的应用程序提供详细的下载地......
Windows下UVC虚拟摄像头的实现
最近在Windows10 x64环境下,开发了一个虚拟UVC摄像头驱动。确切的来说这不是摄像头驱动,而是一个虚拟USB总线驱动。使用该虚拟总线驱动使用应用软件通过IOCTL控制总线子设备的创建与卸载。驱动安装完成后,是一个单纯的USB虚拟总线。应用软件通过发送自定义IOCTL码IOCTL_BUSEN......
UVC摄像头的关闭流程及抓包分析
通过UVC协议规范可以知道,UVC的数据传输支持USB四种传输中的批量传输和同步传输,所以对于UVC摄像头,当我们在摄像头正在工作时,需要停止摄像头工作,执行的操作是不同的。在Linux的源代码中,摄像头的流关闭是由函数uvc_video_stop_streaming完成的。代码比较简单,我们直接给......
UVC摄像头批量传输的StreamOn和StreamOff
在UVC规范中,UVC摄像头视频数据的传输方式支持两种,分别为批量传输和同步传输。UVC摄像头数据传输的格式按负载数据头的方式按帧进行打包传输。根据USB规范可知,同步传输方式是只要带中带有同步端点的接口,系统会定时从设备中读取数据,无论设备中是否有数据。而如要要停止数据的传输,只需要选中不带有同步......
Linux源码分析UVC摄像头的初始化流程分析
UVC摄像头的初始化发生在硬件被接入USB集线器中,设备初USB驱动识别为摄像头的后续初始化流程。和Windows的AddDevice驱动函数一样,Linux设备的创建和侦测是通过int uvc_probe函数实现的。其函数的调用关系如下://linux/v5.11.11/source/drive......
Windows对红外相机摄像头的支持
从Windows10的1607版本开始,USB视频类(UVC)驱动程序支持产生红外(IR)流的摄像头。红外摄像头相机捕捉场景的亮度值,并通过USB以未压缩格式或压缩格式传输帧。这些相机及其流通过媒体捕获管道(pipeline)导出给应用程序。红外UVC摄像头相机帧类型红外UVC摄像头相机支持的格......
华为UAC麦克风的工作过程数据分析
看完了耳机的数据分析,再来分析麦克风,就相对来说很简单了,这是因为:第一:麦克风没有音频控制特效单元描述符,所以少了很多特定类请求。第二:麦克风只有一个音频流转换接口,且只支持采样率为48000HZ 16位。具体的过程见下:Length Phase Data-------- --......
BusHound的使用方法详解
在开始菜单日运行Bus Hound软件,将USB设备插入电脑U口。如图所示,进入”Devices”目录,在”Devices”内选择要监听的设备。例如:我的设备置是一个U盘,则装置为USB大容量储存设备,点选”USB大容量储存设备”图示,可以在下面的”Properties”图框内看到设备的设备树及设备......
UVC 输入终端描述符
输入终端描述符用于向主机报告视频数据输入终端的相关信息。输入终端描述符使用bTerminalID描述输入终端的ID,且这个ID是惟一的。输入终端描述符位于视频控制接口中。输入终端描述符结构体定义如下:// Input Terminal Descriptortypedef struct _USB......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!