LINUX&UVC驱动向V4L2提供的回调接口v4l2_ioctl_ops
2024-03-28
132
0
在 Linux 内核中,针对视频设备的驱动一般会使用 Video4Linux2(V4L2)接口。在 V4L2 中,ioctl 是一个用于设备控制的系统调用,用来发送各种命令给设备驱动程序。对于 UVC(USB Video Class)摄像头的驱动,通常会使用 uvc_v4l2.c 这个文件。
uvc_v4l2.c 中的 v4l2_ioctl_ops 结构体定义了对 V4L2 设备的 ioctl 操作的实现。下面是该结构体的一般形式及其成员介绍:
const struct v4l2_ioctl_ops uvc_ioctl_ops = {
.vidioc_querycap = uvc_ioctl_querycap,
.vidioc_enum_fmt_vid_cap = uvc_ioctl_enum_fmt_vid_cap,
.vidioc_g_fmt_vid_cap = uvc_ioctl_g_fmt_vid_cap,
.vidioc_try_fmt_vid_cap = uvc_ioctl_try_fmt_vid_cap,
.vidioc_s_fmt_vid_cap = uvc_ioctl_s_fmt_vid_cap,
.vidioc_reqbufs = uvc_ioctl_reqbufs,
.vidioc_querybuf = uvc_ioctl_querybuf,
.vidioc_qbuf = uvc_ioctl_qbuf,
.vidioc_dqbuf = uvc_ioctl_dqbuf,
.vidioc_streamon = uvc_ioctl_streamon,
.vidioc_streamoff = uvc_ioctl_streamoff,
.vidioc_enum_input = uvc_ioctl_enum_input,
.vidioc_g_input = uvc_ioctl_g_input,
.vidioc_s_input = uvc_ioctl_s_input,
.vidioc_g_parm = uvc_ioctl_g_parm,
.vidioc_s_parm = uvc_ioctl_s_parm,
.vidioc_cropcap = uvc_ioctl_cropcap,
.vidioc_g_crop = uvc_ioctl_g_crop,
.vidioc_s_crop = uvc_ioctl_s_crop,
.vidioc_enum_framesizes = uvc_ioctl_enum_framesizes,
.vidioc_enum_frameintervals= uvc_ioctl_enum_frameintervals,
.vidioc_g_fmt_vid_overlay = uvc_ioctl_g_fmt_vid_overlay,
.vidioc_try_fmt_vid_overlay= uvc_ioctl_try_fmt_vid_overlay,
.vidioc_s_fmt_vid_overlay = uvc_ioctl_s_fmt_vid_overlay,
};
每个成员的简要介绍及使用条件:
- vidioc_querycap: 用于查询设备的基本能力,如设备名称、驱动名称、支持的输入/输出格式等。无特殊条件。
- vidioc_enum_fmt_vid_cap: 枚举视频捕获设备支持的视频格式。无特殊条件。
- vidioc_g_fmt_vid_cap: 获取当前视频捕获设备的视频格式。无特殊条件。
- vidioc_try_fmt_vid_cap: 尝试设置视频捕获设备的视频格式。无特殊条件。
- vidioc_s_fmt_vid_cap: 设置视频捕获设备的视频格式。无特殊条件。
- vidioc_reqbufs: 请求内存缓冲区用于视频数据。无特殊条件。
- vidioc_querybuf: 查询内存缓冲区的信息。无特殊条件。
- vidioc_qbuf: 将缓冲区放入队列。无特殊条件。
- vidioc_dqbuf: 从队列中取出缓冲区。无特殊条件。
- vidioc_streamon: 打开数据流。无特殊条件。
- vidioc_streamoff: 关闭数据流。无特殊条件。
- vidioc_enum_input: 枚举视频输入。无特殊条件。
- vidioc_g_input: 获取当前视频输入。无特殊条件。
- vidioc_s_input: 设置视频输入。无特殊条件。
- vidioc_g_parm: 获取设备参数。无特殊条件。
- vidioc_s_parm: 设置设备参数。无特殊条件。
- vidioc_cropcap: 查询裁剪能力。无特殊条件。
- vidioc_g_crop: 获取当前裁剪设置。无特殊条件。
- vidioc_s_crop: 设置裁剪。无特殊条件。
- vidioc_enum_framesizes: 枚举帧大小。无特殊条件。
- vidioc_enum_frameintervals: 枚举帧间隔。无特殊条件。
- vidioc_g_fmt_vid_overlay: 获取视频叠加格式。无特殊条件。
- vidioc_try_fmt_vid_overlay: 尝试设置视频叠加格式。无特殊条件。
- vidioc_s_fmt_vid_overlay: 设置视频叠加格式。无特殊条件。
这些 ioctl 请求通常由用户空间的应用程序发起,例如视频采集应用或者视频播放器。应用程序可以通过 V4L2 接口与视频设备通信,发送相应的 ioctl 命令来控制视频设备的行为,如获取设备信息、设置采集参数、启动/停止数据流等。