• usb host 驱动 - UVC 掉包


    1. issue description

    yavta 是一款测试APP,测试UVC 摄像头的数据采集回传。

    yavta -f YUYV -s 1280x720 -t 1/60 -c100 /dev/video0 -F/data/yua
    
    • 1

    帧率60FPS 不能正常运行,blocked, all frame fail。

    yavta -f YUYV -s 1280x720 -t 1/30 -c100 /dev/video0 -F/data/yua
    
    • 1

    帧率30FPS 能正常运行,但中间也会有一些丢包。

    1.1 图像的一些参数

    帧率:FPS(每秒钟要多少帧画面); 以及Gop(表示多少秒一个I帧),影响流畅度。

    -t 1/60		// 帧率60,一秒钟传输60 帧
    
    • 1

    分辨率:单位英寸中所包含的像素点数; VGA:Video Graphics Array(视频图像分辨率),影响清晰度。

    -s 1280x720		// 分辨率720P
    
    • 1

    视频大小:分辨率 x 2(每个像素占多少字节) x 8 x 帧率 x 时间(s) /1024/1024
    YUV422 格式帧大小:分辨率 x 2 Byte

    对于YUV422 格式的 1080P 视频而言,一帧图像是 1920x1080x2x8/1024/1024 = 31.64Mbit,1秒钟30帧图像的话,则有949.2Mb/s。

    1.2 yavta 控制流程

    root@qrb5165-rb5:/# strace yavta -f YUYV -s 1280x720 -t 1/60 -c100 /dev/video0
    // 解析参数
    execve("/usr/bin/yavta", ["yavta", "-f", "YUYV", "-s", "1280x720", "-t", "1/60", "-c100", "/dev/video0"], 0x7fc5203a80 /* 16 vars */) = 0
    // 打开设备节点
    openat(AT_FDCWD, "/dev/video0", O_RDWR) = 3
    // 回显显示
    write(1, "Device /dev/video0 opened.\n", 27Device /dev/video0 opened.) = 27
    // 设备节点的ioctl
    ioctl(3, VIDIOC_QUERYCAP, {driver="uvcvideo", card="KS2A418: KS2A418", bus_info="usb-xhci-hcd.0.auto-1.3", version=4.19.125, ...) = 0
    // 回显显示
    write(1, "Device `KS2A418: KS2A418' on `us"..., 117Device `KS2A418: KS2A418' on `usb-xhci-hcd.0.auto-1.3' (driver 'uvcvideo') supports video, capture, without mplanes.) = 117
    // ioctl 设置参数
    ioctl(3, VIDIOC_G_PARM, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE, parm.capture={capability=V4L2_CAP_TIMEPERFRAME, capturemode=0, timeperframe=1/60, extendedmode=0, readbuffers=0}}) = 0
    write(1, "Current frame rate: 1/60\n", 25Current frame rate: 1/60) = 25
    write(1, "Setting frame rate to: 1/60\n", 28Setting frame rate to: 1/60) = 28
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这些ioctl 对应驱动的接口为:

    // \drivers\media\usb\uvc\uvc_v4l2.c
    const struct v4l2_ioctl_ops uvc_ioctl_ops = {
    	.vidioc_querycap = uvc_ioctl_querycap,
    	...
    	.vidioc_reqbufs = uvc_ioctl_reqbufs,
    	.vidioc_querybuf = uvc_ioctl_querybuf,
    	.vidioc_qbuf = uvc_ioctl_qbuf,
    	.vidioc_expbuf = uvc_ioctl_expbuf,
    	.vidioc_dqbuf = uvc_ioctl_dqbuf,
    	.vidioc_create_bufs = uvc_ioctl_create_bufs,
    	.vidioc_streamon = uvc_ioctl_streamon,
    	.vidioc_streamoff = uvc_ioctl_streamoff,
    	...
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    Flask 学习-20. route 路由中的 endpoint 参数
    【DevPress】V2.1.0版本发布,优化博文详情页
    bootstrap5 常用类大全
    EMQX数据流转MySQL踩坑日记:EMQX VER 4.2.3
    java调用其他项目接口
    【opencv图像处理】--2. 颜色空间,绘制图形,绘制(中文)文本
    Handsontable JavaScript 12.2 Crack
    docker 安装 mysql 5.7 线上实战 (复制直接就能用)
    微信小程序开发学习笔记——3.11完成form评论案例的实现逻辑
    Uniapp零基础开发学习笔记(1) - 项目初步创建
  • 原文地址:https://blog.csdn.net/weixin_42129680/article/details/125626399