当前位置: 首页 > news >正文

网站源码在线提取百度竞价排名推广

网站源码在线提取,百度竞价排名推广,app自助平台制作,wordpress编辑空两格V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。v4L2是针对uvc#xff08;USB Video Class#xff09;免驱usb设备的编程框架#xff0c;主要用于采集usb摄像头等。 下图是V4L2的框架#xff0c;首先系统核心层分配设置注册一个名为cdev结构体变量#x…       V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。v4L2是针对uvcUSB Video Class免驱usb设备的编程框架主要用于采集usb摄像头等。 下图是V4L2的框架首先系统核心层分配设置注册一个名为cdev结构体变量cdev结构体是video_device结构体里的一部分并设置cdev-ops v4l2_fops在硬件层我们分配设置注册了一个名为vfd结构体变量video_device结构体并设置vfd-fops vivi_fopsvfd-ioctl_ops   vivi_ioctl_ops当应用程序APP调用read、open等函数时会调用到v4l2_fops里的read、open函数然后v4l2_fops里的read、open函数会再调用到硬件层相关的vfd-fops里的read、open函数。ioctl函数也类似。 下面我们从程序入手来分析V4L2的框架本文借助Linux内核目录下的drivers\medio\video里的虚拟视频驱动程序vivi.c(这段代码使用v4l2 api模拟真实的视频设备)来分析V4L2的框架。它的总体框架如下所示 vivi_initvivi_create_instancev4l2_device_register // 不是主要, 只是用于初始化一些东西比如自旋锁、引用计数video_device_alloc// 设置1. vfd:.fops vivi_fops,.ioctl_ops vivi_ioctl_ops,.release video_device_release,2.vfd-v4l2_dev dev-v4l2_dev;3. 设置ctrl属性(用于APP的ioctl)v4l2_ctrl_handler_init(hdl, 11);dev-volume v4l2_ctrl_new_std(hdl, vivi_ctrl_ops,V4L2_CID_AUDIO_VOLUME, 0, 255, 1, 200);dev-brightness v4l2_ctrl_new_std(hdl, vivi_ctrl_ops,V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);dev-contrast v4l2_ctrl_new_std(hdl, vivi_ctrl_ops,V4L2_CID_CONTRAST, 0, 255, 1, 16); video_register_device(video_device, type:VFL_TYPE_GRABBER, nr)__video_register_devicevdev-cdev cdev_alloc();vdev-cdev-ops v4l2_fops;cdev_addvideo_device[vdev-minor] vdev;if (vdev-ctrl_handler NULL)vdev-ctrl_handler vdev-v4l2_dev-ctrl_handler; ①我们从vivi.c里的vivi_init函数入手发现它调用了v4l2_device_register该函数用于初始化一些东西比如自旋锁、引用计数这个并不是必需的②调用了video_device_alloc分配video_device结构体并对其进行相应的设置例如 .fops              vivi_fops, .ioctl_ops      vivi_ioctl_ops, .release        video_device_release, 等设置然后video_register_device注册该结构体 ③video_register_device函数调用了__video_register_device实现了如下操作 vdev-cdev cdev_alloc(); vdev-cdev-ops v4l2_fops; cdev_add                  video_device[vdev-minor] vdev; if (vdev-ctrl_handler NULL)     vdev-ctrl_handler vdev-v4l2_dev-ctrl_handler; 上图是vivi_create_instance函数的一部分首先分配一个video_device结构体的变量vfd然后设置*vfd vivi_template;其中vivi_template是一个video_device的结构体变量它本身设置好了一些如.fops之类信息如下图此操作便相当于设置 1. vfd: .fops              vivi_fops, .ioctl_ops      vivi_ioctl_ops, .release        video_device_release, static struct video_device vivi_template {.name vivi,.fops vivi_fops,.ioctl_ops vivi_ioctl_ops,.release video_device_release,.tvnorms V4L2_STD_525_60,.current_norm V4L2_STD_NTSC_M, }; 然后进入video_register_device函数下面是video_register_device里的一部分源码首先分配一个cdev结构体 然后设置cdev-ops v4l2_fops;v4l2_fops本身指向了一些函数如下图这样cdev便也指向了这些函数当APP调用read函数时便会调用cdev里面的read函数 static const struct file_operations v4l2_fops {.owner THIS_MODULE,.read v4l2_read,.write v4l2_write,.open v4l2_open,.get_unmapped_area v4l2_get_unmapped_area,.mmap v4l2_mmap,.unlocked_ioctl v4l2_ioctl, #ifdef CONFIG_COMPAT.compat_ioctl v4l2_compat_ioctl32, #endif.release v4l2_release,.poll v4l2_poll,.llseek no_llseek, }; cdev里面的read函数如下图首先根据filp获取到video_device结构体然后判断该video_device结构体里的read函数是否存在若存在则调用它所以最后便调用到了前面我们设置的vfd.fops里的read函数。 相比open、read函数ioctl的调用过程更复杂一些下面我们来看一下我们以VIDIOC_QUERYCAP为例。下图是v4l2_fops里的.unlocked_ioctl指向的v4l2_ioctl函数。 它调用了前面vivi_template的fops里面的ioctl。 vivi_template的fops里面的ioctl里调用到下图的__video_do_ioctl函数该函数最终调用到vfd里的ioctl_ops成员里面的函数即vivi_ioctl_ops里的函数 比如调用的是 VIDIOC_QUERYCAP则最终会调用到下面的函数。 /* ------------------------------------------------------------------IOCTL vidioc handling------------------------------------------------------------------*/ static int vidioc_querycap(struct file *file, void *priv,struct v4l2_capability *cap) {struct vivi_dev *dev video_drvdata(file);strcpy(cap-driver, vivi);strcpy(cap-card, vivi);strlcpy(cap-bus_info, dev-v4l2_dev.name, sizeof(cap-bus_info));cap-version VIVI_VERSION;cap-capabilities V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | \V4L2_CAP_READWRITE;return 0; } 总结ioctl的调用比open、read多了一层当APP调用ioctl函数时便会调用cdev里面的ioctl函数然后调用到了前面我们设置的vfd.fops里的ioctl函数即和read、open函数同一结构体里的v4l2_ioctl然后最终再去调用到和   .fops           vivi_fops,同一结构体里的 .ioctl_ops      vivi_ioctl_ops,里对应的函数。 相关文章 https://blog.csdn.net/qingkongyeyue/article/details/53447331 https://blog.csdn.net/qingkongyeyue/article/details/52372960
http://wiki.neutronadmin.com/news/40569/

相关文章:

  • 柳市网站优化2023年房地产最新消息
  • 关于网站策划的说法错误的是汕头制作企业网站
  • 重庆双八自助建设网站网站建设的软件叫啥
  • 网站子站怎么建设企业所得税优惠政策最新2023规定公告
  • 网站域名如何备案北京网站建设哪便宜
  • 泛微e8做网站门户微信推广方案范文
  • 网站加载效果怎么做的网页设计尺寸1920
  • 小网站源码移动端网站建设需要注意哪些问题
  • 网站上怎么做动画广告视频在线观看做同城相亲网站
  • 学生怎么制作网站中企动力公司网站价格
  • 鹤壁做网站价格你的网站尚未进行备案
  • 公司网站建设及推广wordpress会员登录界面美化
  • 厦门网站建设培训班深圳 建网站
  • 江苏网站建设开发网站建设需求分析怎么写
  • 网站开发与系统开发用python做音乐网站
  • 策划书模板范文抖音seo排名系统哪个好用
  • 做网站就业要会什么263企业邮箱怎么注册
  • 移动端 pc网站开发开发公司名字起名大全
  • 考试源码网站wordpress岳阳网站界面设计
  • 南通网站建设公司哪家好集团网站建设特色
  • 富阳网站建设报价河北省建设工程信息网招标公告
  • 加强网站制度建设电子商务网站规划与建设的论文
  • 济南网站建设询问臻动传媒百度小程序wordpress
  • 建app网站要多少钱海南网站建设粤icp备
  • 安阳专业网站建设软通动力外包值得去吗
  • 网站出现500wordpress 基于 网店
  • 龙华营销型网站制作哪家好建设工程合同的内容
  • iis管理器添加网站单页网站编辑器
  • 企业展厅设计公司100%正品保障十堰seo优化教程
  • 站长工具下载appdede免费模板教育网站