时间:2015-03-03 来源:

v4l2虚拟驱动的应用测试程序讲解 【综合】

  用gcc编译好这个应用程序之后符合w3c标准,使用ctrl+Alt+F1切换控制台,手机html制作然后在运行这个应用程序网页外包接活,才能看到效果..当然,jpg或psd转html运行这个程序之前web前端制作,54,170, O_RDWR); if (fbfd==-1) { printf("Error: cannot open framebuffer device./n"); exit (EXIT_FAILURE); } //open camera fd = open (dev_name, 0); if (-1 == fd) { fprintf (stderr, %s/n", errno,Courier; padding:1em; border:1px dashed rgb(47,171); background-color:rgb(249,249); line-height:1.1em; font-size:13px">  这里打开了一个用来在电脑上显示的framebuffer,和我们对应的myvivi.ko生成的/dev/video0设备节点. 这里的open /dev/video0操作,网页外包接活就是对应调用到myvivi驱动程序中的myvivi_fops-->myvivi_open.


init_devices


static void init_device (void)  
{  
	// Get fixed screen information  
	if (-1==xioctl(fbfd, &finfo)) {  
	}  
 
	// Get variable screen information  
	if (-1==xioctl(fbfd, &vinfo)) {  
	}  
	screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;  
 
	if (-1 == xioctl (fd, &cap)) {  
	}  
 
	if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {  
	}  
 
	if (!(cap.capabilities & V4L2_CAP_STREAMING)) {  
	}  
 
	CLEAR (fmt);  
 
	fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
	fmt.fmt.pix.width = SET_WIDTH;    
	fmt.fmt.pix.height = SET_HEIGHT;  
	fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;  
	fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;  
 
	if (-1 == xioctl (fd, &fmt))  
		errno_exit ("VIDIOC_S_FMT");  
 
	init_mmap();  
}  

  在init_device中,承接网页制作最开始是获得fb0相关信息web切图报价,这个我们暂时不关系,网站div+css然后ioctl-->VIDIOC_QUERYCAP来判断/dev/video0是否是一个video设备符合w3c标准,对应到myvivi
驱动中的函数:myvivi_ioctl_ops-->myvivi_ioctl_ops.在这个函数中我们还设置了它的属性为V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;这两个属性,手机html制作也在
这里检查了一遍.接着该函数使用ioctl-->VIDIOC_S_FMT来设置video格式为V4L2_PIX_FMT_YUYV.对应到myvivi驱动中函数为:
myvivi_ioctl_ops-->myvivi_vidioc_s_fmt_vid_cap,我们还记得这个函数会首先利用函数myvivi_vidioc_try_fmt_vid_cap来检查一遍应用程序这里传入的video格式
是否被myvivi驱动支持,网页外包接活如果支持就保存到驱动的一个结构体:myvivi_format中去.显然fmt.fmt.pix.width=320,以及格式为
V4L2_PIX_FMT_YUYV,Courier; padding:1em; border:1px dashed rgb(47,171); background-color:rgb(249,249); line-height:1.1em; font-size:13px">  同时在init_device函数的最后还调用了init_mmap来做buffer队列的初始化.
  最开始也是fb0相关的内存操作web前端制作,对应到驱动中被调用到的函数为:
myvivi_ioctl_ops-->myvivi_vidioc_reqbufs,然后之前我们说过在函数myvivi_vidioc_reqbufs中最终会调用到myvivi_video_qops-->myvivi_buffer_setup.
在函数myvivi_buffer_setup中,div前端切图因为传入的块数不为0,所以继续保持为4块,web切图报价然后将myvivi_format.fmt.pix.sizeimage这个图像大小保存到myvivi_vb_vidqueue
队列中.
  接着init_mmap中,web前端制作循环req.count次承接网页制作,也就是4次,承接网页制作来分配和映射数据块内存.
  具体方式为web切图报价,对应调用到驱动中函数:myvivi_ioctl_ops-->myvivi_vidioc_querybuf-->videobuf_querybuf.
然后会返回buffer数据块长度和对应的offset位置.接着通过mmap函数来分配这块数据内存并映射到buffers[n_buffers].start,如此循环req.count次之后,手机html制作
也就设置好了对应的数据块.mmap函数就是对应到驱动中的:myvivi_fops-->myvivi_mmap-->videobuf_mmap_mapper-->__videobuf_mmap_mapper.然后在
__videobuf_mmap_mapper函数中根据传入的参数网页外包接活, VIDIOC_QBUF, VIDIOC_STREAMON,Courier; padding:1em; border:1px dashed rgb(47,171); background-color:rgb(249,249); line-height:1.1em; font-size:13px">  循环了块的次数网页外包接活,这里也就是4次,网页外包接活然后在里面进行四次ioctl-->VIDIOC_QBUF.对应的也就是驱动函数:myvivi_ioctl_ops--->myvivi_vidioc_qbuf.
这个函数最终调用的是v4l2内部实现的函数videobuf_qbuf.这个函数中web前端制作,在myvivi_buffer_prepare 函数中往videobuf_queue队列中填入了imagesize、field之列的关键信息.接着
用myvivi_buffer_queue函数将当前的myvivi_vb_vidqueue->queue放入到了驱动的本地队列myvivi_vb_local_queue.这样循环4次之后承接网页制作,Courier; padding:1em; border:1px dashed rgb(47,171); background-color:rgb(249,249); line-height:1.1em; font-size:13px">  接着应用程序ioctl-->VIDIOC_STREAMON,对应到驱动函数myvivi_vidioc_streamon中,jpg或psd转html表示开始启动使用.


run

static void run (void)  
{  
    unsigned int count;  
    int frames;  
    frames = 30 * 5;  
 
    while (frames-- > 0) {  
        for (;;) {  
            fd_set fds;  
            struct timeval tv;  
            int r;  
            FD_ZERO (&fds);  
            FD_SET (fd, &fds, NULL,Courier; padding:1em; border:1px dashed rgb(47,171); background-color:rgb(249,249); line-height:1.1em; font-size:13px">  这里相当于是循环了5秒web前端制作,一秒30fps.然后循环中用select来检控.前面提到过select对应到驱动的poll中,div+css制作如果queue中没有数据承接网页制作,就会睡眠等待.
直到定时器函数填充好数据,承接网页制作然后唤醒在poll中等待的进程.然后用read_frame来读取数据.


read_frame

static int read_frame (void)  
{  
    struct v4l2_buffer buf;  
    unsigned int i;  
 
    CLEAR (buf);  
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
    buf.memory = V4L2_MEMORY_MMAP;  
 
    if (-1 == xioctl (fd, &buf)) {  
          .................
    }  
    assert (buf.index < n_buffers);  
    process_image(buffers[buf.index].start);  
    if (-1 == xioctl (fd, &buf))  
        errno_exit ("VIDIOC_QBUF");  
 
    return 1;  
} 


stop_capturing

static void stop_capturing (void)                                                                                                    {
    enum v4l2_buf_type type;
 
    type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    if (-1 == xioctl (fd, &type))
        errno_exit ("VIDIOC_STREAMOFF");
}


uninit_device/close_device


web前端行业资讯
Web new NewsList
谷歌发布Tacotron2:能更简单地训练AI学习演讲 ,,2017年12月21日TensorFlow漏洞爆发背后:关于AI安全我们的傻与天真 ,,2017年12月21日Android端Edge浏览器新版发布:常规性能优化和BUG修复 ,,2017年12月21日三星开发出全球最小的DRAM芯片技术领先优势扩大 ,,2017年12月21日腾讯绝艺AI下一步将学习AlphaGozero自对弈训练 ,,2017年12月21日Facebook社交VR应用Spaces扩大覆盖面:入驻HTCVive ,,2017年12月21日设计图曝光:三星双屏折叠手机原来是这样的 ,,2017年12月21日微信支付和支付宝已成为世界移动支付的"老师" ,,2017年12月21日新专利表明FaceID未来有望装备在iPad、MacBook和iMac等设备 ,,2017年12月21日首批九个建议加入EE4J的项目 ,,2017年12月21日这就是SurfacePhone?微软可折叠手机概念图曝光 ,,2017年12月21日继“Angel”开源后,腾讯又开放TDinsight机器学习平台 ,,2017年12月21日谷歌母公司研发“闪光”网络技术无需铺设线缆 ,,2017年12月21日微软投资5千万美元利用人工智能对抗气候变化 ,,2017年12月21日谷歌中国2017:面向开发者的1年AI先行的1年 ,,2017年12月21日GreenKey加入Symphony软件基金会,将开源语音软件 ,,2017年12月21日腾讯发现者揭秘:怎么应对TensorFlow的安全风险,修复有多难 ,,2017年12月21日清华新成立两大交叉研究机构探索智能与未来 ,,2017年12月21日微软将AI融入生产力工具和搜索引擎与其它巨头竞争 ,,2017年12月21日Gfycat将利用机器学习技术创建高分辨率GIF动图 ,,2017年12月21日安全软件公司Avast开源化机器码反编译器RetDec ,,2017年12月21日谷歌开源TFGAN,让训练和评估GAN变得更加简单 ,,2017年12月21日社区对模块化不感兴趣时隔三周经典版FedoraServer27发布 ,,2017年12月21日Windows10加入OpenSSH客户端 ,,2017年12月21日FirefoxQuantum发布一个月安装量1.7亿 ,,2017年12月21日吴恩达宣布创业新项目已与富士康达成战略合作 ,,2017年12月21日Scala入门系列(十二):隐式转换2017年12月20日speedment入门教程2017年12月20日SLAM入门笔记(1):特征点的匹配2017年12月20日深入浅出了解frame和bounds2017年12月20日根据时间生成订单【编程语言】2015年02月28日二进制转化为十六进制 【移动开发】2015年07月06日php中显示数组与对象的实现代码2014年01月29日Qt5之控件的隐藏显示与移动 【移动开发】2015年04月13日网页设计师必备的10款最新应用及资源 1,收藏 ,,2016年06月23日对象生成JSON的方式 【编程语言】2015年03月26日Java理论和实践:线程池和工作队列 【综合】2015年02月15日数据结构(Java语言)——BinaryHeap简单实现 【系统运维】2015年08月27日jquery.qrcode在线生成二维码使用示例2014年01月29日iOS开发之指纹解锁 【综合】2015年04月08日关于innodbpurgethread和masterthread【数据库】2015年06月18日【日常学习】【搜索递归】codevs2802二的幂次方题解 【编程语言】2015年07月15日javascript传统事件模型构造的事件监听器实现代码2014年01月29日JAVA中的String三兄弟 【编程语言】2015年05月07日C#对Excel文件模板的完全读取 【移动开发】2015年01月26日时间戳转化为今天、昨天、明天(字符串格式) 【编程语言】2015年02月09日第十五周oj刷题——ProblemM:C++习题矩阵求和--重载运算符 【编程语言】2015年06月24日如何为JOPtionPane的showConfirmDialog对话框中的按钮设置监听【编程语言】2014年11月04日divscroll始终在最底部的实现代码2014年01月29日js资料prototype属性2014年01月29日Oracle8i和MicrosoftSQLServer比较2014年01月30日php加密解密实用类分享2014年01月29日帮助客户消除创意的疑虑,踏踏实实做设计2014年01月28日iOS使用腾讯地图显示用户位置注意事项 【编程语言】2015年03月16日JavaScript异步调用框架(Part3-代码实现)2014年01月29日SQLServerSA最佳实践(也许不仅仅是翻译) 【系统运维】2015年09月04日mysql数据库表里首行和末行的取得方法 【互联网】2014年11月19日7个Javascript地图脚本整理2014年01月29日已超过了锁请求超时时段,(MicrosoftSQLServer,错误:1222)【数据库】2014年11月17日Android在设置里面添加新功能的方法 【移动开发】2015年08月24日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)