虚拟摄像头驱动程序彻底分析
xawtv(虚拟摄像头)涉及的vivi驱动的系统调用。
步骤:
1.打开摄像头设备:open(“/dev/video0”, O_RDWR|O_LARGEFILE) = 4
2.查询 当前driver是否合乎规范:ioctl(4, VIDIOC_QUERYCAP or VT_OPENQRY, 0xbfaccd44) = 0
3.获得摄像头所提供数据的格式:ioctl(4, VIDIOC_G_FMT or VT_SENDSIG, 0xbfaccc78) = 0
4.for循环列举出摄像头所支持的格式:ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0xbfaccbec) = 0(非必须的)
5.查询 当前driver是否合乎规范,列举性能:ioctl(4, VIDIOC_QUERYCAP
6.获取当前使用源:ioctl(4, VIDIOC_G_INPUT, 0xbfacca2c) = 0(非必须的)
7.列举所有的输入源:ioctl(4, VIDIOC_ENUMINPUT, 0xbfacca2c) = 0(非必须的)
8.查询属性,比如亮度和对比度:ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0xbfacca78) = -1 EINVAL (Invalid argument)
9.ioctl(4, VIDIOC_QUERYCAP or VT_OPENQRY, 0x9b40998) = 0
10.for循环查询到底有多少个输入点:ioctl(4, VIDIOC_ENUMINPUT, 0x9b40acc) = 0
11.for循环列举标准(制式):ioctl(4, VIDIOC_ENUMSTD, 0x9b40f8c) = 0
12.for循环列举图片数据的格式:ioctl(4, VIDIOC_ENUM_FMT or VT_SETMODE, 0x9b4138c) = 0
13.获取参数:ioctl(4, VIDIOC_G_PARM, 0x9b40a00) = 0
14.for循环查询属性(比如亮度值最小值/最大值/默认值):ioctl(4, MATROXFB_TVOQUERYCTRL or VIDIOC_QUERYCTRL, 0x9b41b8c) = 0
15.获得当前使用的标准:ioctl(4, VIDIOC_G_STD, 0xbfacce08) = 0
16.列出当前使用的通道:ioctl(4, VIDIOC_G_INPUT, 0xbfacce1c) = 0
17.当前所使用的属性:ioctl(4, MATROXFB_G_TVOCTRL or VIDIOC_G_CTRL, 0xbfacce14) = 0
18.尝试能否 支持某种格式:ioctl(4, VIDIOC_TRY_FMT, 0x9b42ca4) = 0
19.如果支持某种格式,设置摄像头使用某种格式:ioctl(4, VIDIOC_S_FMT or VT_RELDISP, 0xbfacc754) = 0
20.请求系统分配多个缓冲区:ioctl(4, VIDIOC_REQBUFS or VT_DISALLOCATE, 0x9b42d80) = 0
21.查询系统所分配的缓冲区:ioctl(4, VIDIOC_QUERYBUF or VT_RESIZE, 0x9b42d94) = 0
22.for循环把缓冲区放入队列:ioctl(4, VIDIOC_QBUF, 0x9b42d94) = 0
23.启动摄像头:ioctl(4, VIDIOC_STREAMON, 0xbfacca2c) = 0
24.for循环设置属性:ioctl(4, MATROXFB_S_TVOCTRL or VIDIOC_S_CTRL, 0xbfacce10) = 0
25.设置输入源:ioctl(4, VIDIOC_S_INPUT, 0xbfacce84) = 0
26.设置标准(制式)ioctl(4, VIDIOC_S_STD, 0x9b40f90) = 0
26.for循环
①查看队列中的缓冲区是否有数据,有数据就取出数据: select(5, [4], NULL, NULL, {5, 0}) = 1 (in [4], left {4, 985979})
②把缓冲区从队列中取出ioctl(4, VIDIOC_DQBUF, 0xbfaccd00) = 0
③处理数据
⑤把缓冲区放入队列ioctl(4, VIDIOC_QBUF, 0x9b42d94) = 0
虚拟摄像头驱动程序的数据如何获得:
应用程序通过调用REQBUFS请求系统分配缓冲区,调用QUERYBUF查询缓冲区。调用mmap,告诉应用程序在哪个地址访问缓冲区。调用QBUF将缓冲区放入驱动程序中的某个队列中。调用STREAMON启动摄像头。调用select程序查询缓冲区是否有数据。如果驱动程序有数据之后,就会唤醒应用程序,唤醒完应用程序后,应用程序就会调用DQBUF,将缓冲区从队列中取出,获得缓冲区数据,进行处理。处理完后再将缓冲区放回队列。
重点函数:
1.v4l2_open打开摄像头设备,get_device_capabilities(h)获得摄像头属性2. v4l2_read_attr/v4l2_write_attr(读/写属性)3. v4l2_start_streaming(申请buf)4. v4l2_nextframe/v4l2_waiton
摄像头驱动程序必需的11个ioctl:
// 表示它是一个摄像头设备
.vidioc_querycap = vidioc_querycap,
/* 用于列举、获得、测试、设置摄像头的数据的格式 */
.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
.vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
.vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
.vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,/* 缓冲区操作: 申请/查询/放入队列/取出队列 */
.vidioc_reqbufs = vidioc_reqbufs,
.vidioc_querybuf = vidioc_querybuf,
.vidioc_qbuf = vidioc_qbuf,
.vidioc_dqbuf = vidioc_dqbuf,// 启动/停止
.vidioc_streamon = vidioc_streamon,
.vidioc_streamoff = vidioc_streamoff,
怎么写摄像头驱动程序:
- 分配video_device:video_device_alloc
- 设置
.fops
.ioctl_ops (里面需要设置11项)
如果要用内核提供 的缓冲区操作函数,还需要构造一个videobuf_queue_ops - 注册: video_register_device
本文章源于韦东山嵌入式
虚拟摄像头驱动程序彻底分析相关推荐
- WinXP下虚拟摄像头驱动程序开发 1
WinXP下虚拟摄像头驱动程序开发 摄像头驱动程序的主要目的是通过硬件捕捉视频信号.微软公司提供了一套视频驱动的接口,可以满足这个接口的视频驱动程序.第三方厂商开发的软件,如QQ和MSN等软件,都可以 ...
- WinXP下虚拟摄像头驱动程序开发
摄像头驱动程序的主要目的是通过硬件捕捉视频信号.微软公司提供了一套视频驱动的接口,可以满足这个接口的视频驱动程序.第三方厂商开发的软件,如QQ和MSN等软件,都可以通过这个接口读取视频摄像头采集的数据 ...
- 从vivi虚拟摄像头驱动开始分析v4l2
Linux v4l2架构学习总链接 内核代码是基于linux4.9分析 vivi 代码在线查看 vivi.c - drivers/media/video/vivi.c - Linux source c ...
- 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写
一.V4L2框架主要结构体分析 V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口. V4L2整体框架如下图: 图中主要包括两层 ...
- Linux摄像头驱动第一篇之虚拟摄像头驱动vivi.c
本文学习自韦东山老师的摄像头驱动模块 目录 一 摄像头驱动程序学习切入点以及V4L2模型概览 二 简析虚拟视频驱动 VIVI.C 2.1 初始化.设置.注册过程 2.2 简析vivi.c的open,r ...
- 使用手机作为虚拟摄像头
USB Lan 驱动,使得PC可以连接手机,从以下地址可以下载到: http://www.belcarra.com/host.html 以下这篇文章是MOTO的机器作为手机摄像头的说明档,从其中我们可 ...
- 深入学习Linux摄像头(三)虚拟摄像头驱动分析
深入学习Linux摄像头系列 深入学习Linux摄像头(一)v4l2应用编程 深入学习Linux摄像头(二)v4l2驱动框架 深入学习Linux摄像头(三)虚拟摄像头驱动分析 深入学习Linux摄像头 ...
- 虚拟视频驱动程序vivi.c源码分析
虚拟视频驱动程序vivi.c源码分析 以下先把上一篇文章中的最后一段,放在这里利于程序源码的分析: vivi.c 虚拟视频驱动程序----- 此代码模拟一个真正的视频设备V4L2 API (位于dri ...
- 虚拟摄像头之三: 重构android8.1 的 v4l2_camera_HAL 支持虚拟摄像头
前言 接下来将了解Android HAL是如何与相机设备进行交互的,一般各硬件厂商的 camera HAL会有个 v4l2_camera_hal.cpp 文件,在这个文件中向frameworks提供H ...
- 摄像头驱动_摄像头驱动程序必需的11个ioctl及摄像头数据的获取过程
摄像头驱动_摄像头驱动程序必需的11个ioctl及摄像头数据的获取过程 根据虚拟驱动vivi的使用过程彻底分析摄像头驱动 // 1~2都是在v4l2_open里调用 1. open 2. ioctl( ...
最新文章
- 在spoc上安装linux系统,郁闷,HACMP的C-SPOC没办法用
- MYSQL编译参数详解
- [How TO]-How to Install Python Pip on Ubuntu 20.04
- 线性判别分析LDA的数学原理(二)
- vue 箭头函数兼容性_前端学习计划之VUE学习(二)
- JAVA流程控制学习总结
- Serve Django Applications with uWSGI and Nginx
- leetcode专题训练笔记
- 系统封装教程集合电子书
- 团队作业4——第一次项目冲刺(Alpha版本)4.23
- iCode代码托管的一些基本指令
- 直流电机/步进电机/舵机区别
- 编译原理——NFA确定化和DFA最小化
- 码易手机站,现已轻快上线!
- easyphp 12 mysql 启动_EasyPHP启用MYSQL报错
- 台式机没声音怎么样才能解决
- java 累加器_Spark累加器(Accumulator)
- 程序中的地址转换(虚拟地址-物理地址)
- 《死亡搁浅》:在“联结”的世界里,是 “个人”在游戏中
- 玩转华为ENSP模拟器系列 | 配置BGP EVPN
热门文章
- 2019年十大物联网安全事件
- Vscode latex插件生成pdf目录空白问题
- ios中自定义相机_在iOS中制作自定义相机
- 【我的Android进阶之旅】Android 因为时间设置错误,请求报错 Could not validate certificate: Certificate expired at
- 【QT】自定义Toast消息提示
- DRAM内存原理(四)同步内存和异步内存技术
- Scrapy入门案例,抓取美剧天堂的前100最新
- Python网络爬虫《九》
- 1.9w粉丝带动近100w播放量,推广黑马不止一位
- 【NOI2015】bzoj4199 品酒大会【解法一】