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,

怎么写摄像头驱动程序:

  1. 分配video_device:video_device_alloc
  2. 设置
    .fops
    .ioctl_ops (里面需要设置11项)
    如果要用内核提供 的缓冲区操作函数,还需要构造一个videobuf_queue_ops
  3. 注册: video_register_device

本文章源于韦东山嵌入式

虚拟摄像头驱动程序彻底分析相关推荐

  1. WinXP下虚拟摄像头驱动程序开发 1

    WinXP下虚拟摄像头驱动程序开发 摄像头驱动程序的主要目的是通过硬件捕捉视频信号.微软公司提供了一套视频驱动的接口,可以满足这个接口的视频驱动程序.第三方厂商开发的软件,如QQ和MSN等软件,都可以 ...

  2. WinXP下虚拟摄像头驱动程序开发

    摄像头驱动程序的主要目的是通过硬件捕捉视频信号.微软公司提供了一套视频驱动的接口,可以满足这个接口的视频驱动程序.第三方厂商开发的软件,如QQ和MSN等软件,都可以通过这个接口读取视频摄像头采集的数据 ...

  3. 从vivi虚拟摄像头驱动开始分析v4l2

    Linux v4l2架构学习总链接 内核代码是基于linux4.9分析 vivi 代码在线查看 vivi.c - drivers/media/video/vivi.c - Linux source c ...

  4. 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写

    一.V4L2框架主要结构体分析 V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口. V4L2整体框架如下图: 图中主要包括两层 ...

  5. Linux摄像头驱动第一篇之虚拟摄像头驱动vivi.c

    本文学习自韦东山老师的摄像头驱动模块 目录 一 摄像头驱动程序学习切入点以及V4L2模型概览 二 简析虚拟视频驱动 VIVI.C 2.1 初始化.设置.注册过程 2.2 简析vivi.c的open,r ...

  6. 使用手机作为虚拟摄像头

    USB Lan 驱动,使得PC可以连接手机,从以下地址可以下载到: http://www.belcarra.com/host.html 以下这篇文章是MOTO的机器作为手机摄像头的说明档,从其中我们可 ...

  7. 深入学习Linux摄像头(三)虚拟摄像头驱动分析

    深入学习Linux摄像头系列 深入学习Linux摄像头(一)v4l2应用编程 深入学习Linux摄像头(二)v4l2驱动框架 深入学习Linux摄像头(三)虚拟摄像头驱动分析 深入学习Linux摄像头 ...

  8. 虚拟视频驱动程序vivi.c源码分析

    虚拟视频驱动程序vivi.c源码分析 以下先把上一篇文章中的最后一段,放在这里利于程序源码的分析: vivi.c 虚拟视频驱动程序----- 此代码模拟一个真正的视频设备V4L2 API (位于dri ...

  9. 虚拟摄像头之三: 重构android8.1 的 v4l2_camera_HAL 支持虚拟摄像头

    前言 接下来将了解Android HAL是如何与相机设备进行交互的,一般各硬件厂商的 camera HAL会有个 v4l2_camera_hal.cpp 文件,在这个文件中向frameworks提供H ...

  10. 摄像头驱动_摄像头驱动程序必需的11个ioctl及摄像头数据的获取过程

    摄像头驱动_摄像头驱动程序必需的11个ioctl及摄像头数据的获取过程 根据虚拟驱动vivi的使用过程彻底分析摄像头驱动 // 1~2都是在v4l2_open里调用 1. open 2. ioctl( ...

最新文章

  1. 在spoc上安装linux系统,郁闷,HACMP的C-SPOC没办法用
  2. MYSQL编译参数详解
  3. [How TO]-How to Install Python Pip on Ubuntu 20.04
  4. 线性判别分析LDA的数学原理(二)
  5. vue 箭头函数兼容性_前端学习计划之VUE学习(二)
  6. JAVA流程控制学习总结
  7. Serve Django Applications with uWSGI and Nginx
  8. leetcode专题训练笔记
  9. 系统封装教程集合电子书
  10. 团队作业4——第一次项目冲刺(Alpha版本)4.23
  11. iCode代码托管的一些基本指令
  12. 直流电机/步进电机/舵机区别
  13. 编译原理——NFA确定化和DFA最小化
  14. 码易手机站,现已轻快上线!
  15. easyphp 12 mysql 启动_EasyPHP启用MYSQL报错
  16. 台式机没声音怎么样才能解决
  17. java 累加器_Spark累加器(Accumulator)
  18. 程序中的地址转换(虚拟地址-物理地址)
  19. 《死亡搁浅》:在“联结”的世界里,是 “个人”在游戏中
  20. 玩转华为ENSP模拟器系列 | 配置BGP EVPN

热门文章

  1. 2019年十大物联网安全事件
  2. Vscode latex插件生成pdf目录空白问题
  3. ios中自定义相机_在iOS中制作自定义相机
  4. 【我的Android进阶之旅】Android 因为时间设置错误,请求报错 Could not validate certificate: Certificate expired at
  5. 【QT】自定义Toast消息提示
  6. DRAM内存原理(四)同步内存和异步内存技术
  7. Scrapy入门案例,抓取美剧天堂的前100最新
  8. Python网络爬虫《九》
  9. 1.9w粉丝带动近100w播放量,推广黑马不止一位
  10. 【NOI2015】bzoj4199 品酒大会【解法一】