Linux&UVC驱动
+ -

LINUX&UVC驱动枚举视频格式

2024-04-01 6 0

vidioc_enum_fmt_vid_cap 和 vidioc_enum_fmt_vid_out 是Linux内核中V4L2(Video for Linux 2)驱动程序中的两个ioctl命令,用于枚举视频设备的捕获(capture)和输出(output)格式。

  1. vidioc_enum_fmt_vid_cap:

    • 这个ioctl命令用于枚举视频设备(例如摄像头)支持的捕获格式。
    • 当应用程序想要捕获视频流时,它可以使用此命令来查询设备支持的不同捕获格式,如像素格式(RGB、YUV等)和分辨率。
    • 通常用于设置视频捕获的参数,如帧率、分辨率等。
  2. vidioc_enum_fmt_vid_out:

    • 这个ioctl命令用于枚举视频设备(例如视频显示卡)支持的输出格式。
    • 当应用程序想要输出视频流时,它可以使用此命令来查询设备支持的不同输出格式,例如显示屏上支持的像素格式和分辨率。
    • 通常用于设置视频输出的参数,如输出分辨率、缩放比例等。

因此,两者之间的主要区别在于它们涉及的操作对象和操作的方向。vidioc_enum_fmt_vid_cap用于捕获设备的格式枚举,而vidioc_enum_fmt_vid_out用于输出设备的格式枚举。不过在应用层都使用的控制码为VIDIOC_ENUM_FMT,故使用fmt_desc.type的值是V4L2_BUF_TYPE_VIDEO_CAPTURE还是V4L2_BUF_TYPE_VIDEO_OUTPUT等来区分。

enum v4l2_buf_type {
    V4L2_BUF_TYPE_VIDEO_CAPTURE        = 1,
    V4L2_BUF_TYPE_VIDEO_OUTPUT         = 2,
    V4L2_BUF_TYPE_VIDEO_OVERLAY        = 3,
    V4L2_BUF_TYPE_VBI_CAPTURE          = 4,
    V4L2_BUF_TYPE_VBI_OUTPUT           = 5,
    V4L2_BUF_TYPE_SLICED_VBI_CAPTURE   = 6,
    V4L2_BUF_TYPE_SLICED_VBI_OUTPUT    = 7,
    V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8,
    V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE = 9,
    V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE  = 10,
    V4L2_BUF_TYPE_SDR_CAPTURE          = 11,
    V4L2_BUF_TYPE_SDR_OUTPUT           = 12,
    V4L2_BUF_TYPE_META_CAPTURE         = 13,
    V4L2_BUF_TYPE_META_OUTPUT       = 14,
    /* Deprecated, do not use */
    V4L2_BUF_TYPE_PRIVATE              = 0x80,
};

在LINUX&UVC驱动中,分别使用uvc_ioctl_enum_fmt_vid_cap和uvc_ioctl_enum_fmt_vid_out函数来枚举视频设备的格式。不过其实两者的代码最终是相同的。

const struct v4l2_ioctl_ops uvc_ioctl_ops = {
...
    .vidioc_enum_fmt_vid_cap = uvc_ioctl_enum_fmt_vid_cap,
    .vidioc_enum_fmt_vid_out = uvc_ioctl_enum_fmt_vid_out,
...
}

最终都是使用的是uvc_ioctl_enum_fmt获取视频设备的格式:

static int uvc_ioctl_enum_fmt_vid_cap(struct file *file, void *fh,struct v4l2_fmtdesc *fmt)
{
    struct uvc_fh *handle = fh;
    struct uvc_streaming *stream = handle->stream;

    return uvc_ioctl_enum_fmt(stream, fmt);
}

static int uvc_ioctl_enum_fmt_vid_out(struct file *file, void *fh,struct v4l2_fmtdesc *fmt)
{
    struct uvc_fh *handle = fh;
    struct uvc_streaming *stream = handle->stream;

    return uvc_ioctl_enum_fmt(stream, fmt);
}

uvc_ioctl_enum_fmt

uvc_ioctl_enum_fmt的代码其实是将UVC视频流接口描述符中解析出的视频格式

static int uvc_ioctl_enum_fmt(struct uvc_streaming *stream,
                  struct v4l2_fmtdesc *fmt)
{
    struct uvc_format *format;
    enum v4l2_buf_type type = fmt->type;
    u32 index = fmt->index;

    if (fmt->type != stream->type || fmt->index >= stream->nformats)
        return -EINVAL;

    memset(fmt, 0, sizeof(*fmt));
    fmt->index = index;
    fmt->type = type;

    format = &stream->format[fmt->index];
    fmt->flags = 0;
    if (format->flags & UVC_FMT_FLAG_COMPRESSED)
        fmt->flags |= V4L2_FMT_FLAG_COMPRESSED;
    strscpy(fmt->description, format->name, sizeof(fmt->description));
    fmt->description[sizeof(fmt->description) - 1] = 0;
    fmt->pixelformat = format->fcc;
    return 0;
}

当然,这里只解析出了支持的视频格式,其下应还有分辨率Frame和帧率。

  • struct uvc_streaming
    • struct uvc_format
      • struct uvc_frame
struct uvc_frame {
    u8  bFrameIndex;
    u8  bmCapabilities;
    u16 wWidth;
    u16 wHeight;
    u32 dwMinBitRate;
    u32 dwMaxBitRate;
    u32 dwMaxVideoFrameBufferSize;
    u8  bFrameIntervalType;
    u32 dwDefaultFrameInterval;
    u32 *dwFrameInterval;
};

0 篇笔记 写笔记

常用图像像素格式 NV12、NV2、I420、YV12、YUYV
常用图像像素格式 RGB 和 YUV,像素格式描述了像素数据存储所用的格式,定义了像素在内存中的编码方式。RGB 和 YUV 为两种经常使用的像素格式。1.RGB 格式一般较为熟悉,RGB图像具有三个通道 R、G、B,分别对应红、绿、蓝三个分量,由三个分量的值决定颜色;这三种颜色称为 三原色,将它......
Linux支持的UVC视频格式
Linux支持的UVC视频格式位于linux-5.6.11linux-5.6.11driversmediausbuvcuvc_driver.c文件下:其数组结构定义如下:static struct uvc_format_desc uvc_fmts[] = { { .n......
YUV2摄像头相关数据大小计算
视备支持的分辨率格式如下:当我们使用YUV2 1280x720x10格式打开摄像头,通过BUSHOUND抓包如下:Length Phase Data ......
DirectShow摄像头视频格式格式UUID-GUID大全
使用DirectShow开发Windows摄像头Capture时,对于每一种支持的格式,都有一个与之对应的UUID.现将各UUID总结整理如下:(后续持续更新)以下UUID来自windows系统uuids.h,目标路径为:C:Program Files (x86)Windows Kits1......
USB中文网出品-UVC视频格式协商协议分析工具
有没有对USB摄像头在打开时数据协商时的UVC视频流接口控制请求的几十个字节分析有时有点郁闷,手动分析又麻烦,写个工具感觉又划不来。有时没办法为,为了定位问题所在,还得手动分析,但这几十个字节在分析时还得不停地查文档。我们知道UVC随着版本的不同,其VS_PROBE_CONTROL和VS_COM......
H264基本原理
本文的转载得到了零声教育的QQ同意。前言H264视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的。随着 x264/openh264以及ffmpeg等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大降低了人们使用H264的成本。但为了用好H264,我们还是要对H2......
USB相机UVC支持多视频格式关键点及配置描述符自动填充代码
一般的UVC相机会支持多种视频格式如MJPG,YUV2,NV12,H264等常见的格式,另外也会支持多种分辨率,如常见的1920x1080,当然也会支持一些特别的分辨率如4K的3840x2160。另外在固定视频格式和视频分辨率下,支持的帧率是由视频帧描述符确定的。由于自己平时虚拟的都是固件格式和固......
UVC视频格式细节详解及分类大全
UVC支持各类的视频格式,如I420,YUY2,MJPG,H264等格式,但这些格式有的是归为统一一类的,如YUY2和NV12就归为无压缩的格式。对于UVC视频流格式,其统一的视频流格式描述符如下:typedef struct _VIDEO_FORMAT_DESCRIPTOR UINT8......
LINUX&UVC驱动枚举视频格式
vidioc_enum_fmt_vid_cap 和 vidioc_enum_fmt_vid_out 是Linux内核中V4L2(Video for Linux 2)驱动程序中的两个ioctl命令,用于枚举视频设备的捕获(capture)和输出(output)格式。vidioc_enum_fmt_......
LINUX&UVC视频格式协商VS_PROBE_CONTROLL
UVC视频的协商其实走的是VS_PROBE_CONTROLL请求,使用该请求可以获取一个默认的视频格式、分辨率。当然,如果用户指定非默认的,会也使用VS_PROBE_CONTROLL请求来验证是否存在。无论是默认的还是新指定的,最终协商完成后,都会使用VS_COMMIT_CONTROL请求最后进行提......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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