libv4l 库【转】-程序员宅基地

技术标签: 操作系统  

转自:http://www.cnblogs.com/emouse/archive/2013/03/05/2944522.html

V4L2摸索了两天还是一头雾水,今天调试一个程序发现两个头文件:

#include "libv4l2.h" 
#include "libv4lconvert.h"

没有找到,网上搜索了下,发现这是在一个库libv4l中集成的,这个库用于编写v4l2 camera应用程序,里面除有常用的v4l2 ioctl调用的封装API外,还有yuv到rgb转换、rgb到yuv转换和jpeg decoder 等API,更多的信息也没有细致的去看。

下载地址:http://people.atrpms.net/~hdegoede/

这个目录下有很多个版本,目前最新版本为0.6.2 我下载了libv4l-0.6.1.tar.gz ,安装也很简单:

tar zxvf libv4l-0.6.1.tar.gz
make install PREFIX=/usr/local

下面是解压后的说明文档,有兴趣的可以看看他的用途,更多的用法后面用到的时候再琢磨着使用吧。


Introduction 
------------

libv4l is a collection of libraries which adds a thin abstraction layer on 
top of video4linux2 devices. The purpose of this (thin) layer is to make it 
easy for application writers to support a wide variety of devices without 
having to write seperate code for different devices in the same class.

All libv4l components are licensed under the GNU Lesser General Public 
License version 2 or (at your option) any later version.

libv4l consists of 3 different libraries:


libv4lconvert 
-------------

libv4lconvert started as a library to convert from any (known) pixelformat to 
V4l2_PIX_FMT_BGR24, RGB24, YUV420 or YVU420.

The list of know source formats is large and continually growing, so instead 
of keeping an (almost always outdated) list here in the README, I refer you 
to the source, see the list of defines at the top of 
libv4lconvert/libv4lconvert.c for the full list. 
For more details on the v4lconvert_ functions see libv4lconvert.h.

Later on libv4lconvert was expanded to also be able to do various video 
processing functions to improve webcam video quality on a software basis. So 
the name no longer 100% covers the functionality. The video processing is 
split in to 2 parts, libv4lconvert/control and libv4lconvert/processing.

The control part is used to offer video controls which can be used to control 
the video processing functions made available by libv4lconvert/processing. 
These controls are stored application wide (until reboot) by using a 
persistent shared memory object.

libv4lconvert/processing offers the actual video processing functionality.


libv4l1 
-------

This offers functions like v4l1_open, v4l1_ioctl, etc. which can by used to 
quickly make v4l1 applications work with v4l2 devices. These functions work 
exactly like the normal open/close/etc, except that libv4l1 does full emulation 
of the v4l1 api on top of v4l2 drivers, in case of v4l1 drivers it will just 
pass calls through. For more details on the v4l1_ functions see libv4l1.h .


libv4l2 
-------

This offers functions like v4l2_open, v4l2_ioctl, etc. which can by used to 
quickly make v4l2 applications work with v4l2 devices with weird formats. 
libv4l2 mostly passes calls directly through to the v4l2 driver. When the 
app does a TRY_FMT / S_FMT with a not supported format libv4l2 will get in 
the middle and emulate the format (if an app wants to know which formats the 
hardware can _really_ do it should use ENUM_FMT, not randomly try a bunch of 
S_FMT's). For more details on the v4l2_ functions see libv4l2.h .


wrappers 
--------

The functionality provided by libv4l1 for v4l1 apps and libv4l2 for v4l2 apps 
can also be used by existing apps without modifying them. For this purpose 
2 wrapper libraries are provided which can be preloaded before starting the 
application using the LD_PRELOAD environment variable. These wrappers will 
then intercept calls to open/close/ioctl/etc. and if these calls directed 
towards a video device the wrapper will redirect the call to the libv4lX 
counterparts.

The preloadable libv4l1 wrapper which adds v4l2 device compatibility to v4l1 
applications is called v4l1compat.so. The preloadable libv4l2 wrapper which 
adds support for various pixelformats to v4l2 applications is called 
v4l2convert.so.

Example usage (after install in default location): 
exportLDPRELOAD=/usr/local/lib/libv4l/v4l1compat.soexportLDPRELOAD=/usr/local/lib/libv4l/v4l1compat.so camorama


Prerequisites 
-------------

libv4l requires shmem file system support in the kernel (CONFIG_SHMEM).


Installation Instructions 
-------------------------

Simple type the following commands from the libv4l-x.y.z directory 
(adjusting PREFIX as desired): 
make 
make install PREFIX=/usr/local

Note: make install also supports the DESTDIR=... parameter for installation 
into chroots.

If you require static libraries to also be built, these can be compiled 
along with the dynamic equivalents by defining LINKTYPE to 'static', e.g.:

make LINKTYPE=static 
make install LINKTYPE=static


FAQ 
---

Q: Why libv4l, whats wrong with directly accessing v4l2 devices ? 
Q: Do we really need yet another library ? 
A: Current webcam using applications like ekiga contain code to handle many 
different specific pixelformats webcam's use, but that code only supports a 
small subset of all native webcam (compressed) pixelformats. Other current 
v4l2 applications do not support anything but rgb pixelformats (xawtv for 
example) and this will not work with most webcams at all.

With gspca being ported to v4l2 and thus decoding to normal formats being 
removed from the device driver as this really belongs in userspace, ekiga 
would need to be extended with many more often chip dependent formats, like 
the bayer compression used by the spca561 and the (different) compression used 
by the pac207 and the (again different) compression used by the sn9c102. Adding 
support for all these formats should not be done at the application level, as 
then it needs to be written for each application seperately. Licensing issues 
with the decompressors will then also become a problem as just cut and pasting 
from one application to another is bound to hit license incompatibilities.

So clearly this belongs in a library, and in a library with a license which 
allows this code to be used from as many different applications as possible. 
Hence libv4l was born.


Q: Under which license may I use and distribute libv4l? 
A: The libv4l libraries are licensed under the GNU Library General Publishing 
License version 2 or (at your option) any later version. See the included 
COPYING.LIB file. The decompression helpers are licensed under the GNU 
Library Publishing License version 2 (as they are derived from kernel code)


Q: Okay so I get the use of having a libv4lconvert, but why libv4l1 ? 
A: Many v4l2 drivers do not offer full v4l1 compatibility. They often do not 
implemented the CGMBUF ioctl and v4l1 style mmap call. Adding support to all 
these drivers for this is a lot of work and more importantly unnecessary 
adds code to kernel space.

Also even if the CGMBUF ioctl and v4l1 style mmap are supported, then most 
cams still deliver pixelformats which v4l1 applications do not understand.

This libv4l1 was born as an easy way to get v4l1 applications to work with 
v4l2 devices without requiring full v4l1 emulation (including format 
conversion) in the kernel, and without requiring major changes to the 
applications.


Q: Why should I use libv4l2 in my app instead of direct device access 
   combined with libv4lconvert? 
A: libv4l2 is mainly meant for quickly and easily adding support for more 
pixelformats to existing v4l2 applications. So if you feel better directly 
accessing the device in combination with libv4lconvert thats fine too.

Notice that libv4l2 also does emulation of the read() call on devices which 
do not support it in the driver. In the background this uses mmap buffers 
(even on devices which do support the read call). This mmap gives libv4lconvert 
zero-copy access to the captured frame, and then it can write the converted 
data directly to the buffer the application provided to v4l2_read(). Thus 
another reason to use liv4l2 is to get the no memcpy advantage of the mmap 
capture method combined with the simplicity of making a simple read() call.


Q: Where to send bugreports / questions? 
A: Please send libv4l questions / bugreports to the: 
   Linux Media Mailing List <[email protected]
   Subscription is not necessary to send mail to this list. If you're not 
   subscribed please put yourself in the CC of your original mail so you 
   will receive replies.





本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/6904553.html,如需转载请自行联系原作者



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33714884/article/details/90128711

智能推荐

BAT批处理创建文件桌面快捷方式_批处理创建桌面快捷方式-程序员宅基地

文章浏览阅读1.5w次,点赞9次,收藏26次。简介一个创建某个文件到桌面快捷方式的BAT批处理.代码@echooff::设置程序或文件的完整路径(必选)setProgram=D:\Program Files (x86)\格式工厂.4.2.0\FormatFactory.exe::设置快捷方式名称(必选)setLnkName=格式工厂v4.2.0::设置程序的工作路径,一般为程序主目录,此项若留空,脚本将..._批处理创建桌面快捷方式

射频识别技术漫谈(6-10)_芯片 ttf模式-程序员宅基地

文章浏览阅读2k次。射频识别技术漫谈(6-10),概述RFID的通讯协议;射频ID卡的原理与实现,数据的传输与解码;介绍动物标签属性与数据传输;RFID识别号的变化等_芯片 ttf模式

Python 项目实战 —— 手把手教你使用 Django 框架实现支付宝付款_django 对接支付宝接口流程-程序员宅基地

文章浏览阅读1.1k次。今天小编心血来潮,为大家带来一个很有趣的项目,那就是使用 Python web 框架 Django 来实现支付宝支付,废话不多说,一起来看看如何实现吧。_django 对接支付宝接口流程

Zabbix 5.0 LTS在清理历史数据后最新数据不更新_zabbix问题没有更新-程序员宅基地

文章浏览阅读842次。Zabbix 5.0 LTS,跑了一年多了一直很稳定,前两天空间显示快满了,于是手贱清理了一下history_uint表(使用mysql truncate),结果折腾了一周。大概故障如下:然后zabbix论坛、各种群问了好久都没解决,最后自己一番折腾似乎搞定了。初步怀疑,应该是由于历史数据被清空后,zabbix需要去处理数据,但是数据量太大,跑不过来,所以来不及更新了(?)..._zabbix问题没有更新

python学习历程_基础知识(2day)-程序员宅基地

文章浏览阅读296次。一、数据结构之字典 key-value

mybatis-plus字段策略注解strategy_mybatisplus strategy-程序员宅基地

文章浏览阅读9.7k次,点赞3次,收藏13次。最近项目中遇到一个问题,是关于mybatis-plus的字段注解策略,记录一下。1问题调用了A组件(基础组件),来更新自身组件的数据,发现自己组件有个字段总是被清空。2原因分析调用的A组件的字段,属于基础字段,自己业务组件,对这个基础字段做了扩展,增加了业务字段。但是在自己的组件中的实体注解上,有一个注解使用错误。mybatis-plus封装的updateById方法,如果..._mybatisplus strategy

随便推点

信息检索笔记-索引构建_为某一文档及集构件词项索引时,可使用哪些索引构建方法-程序员宅基地

文章浏览阅读3.8k次。如何构建倒排索引,我们将这个过程叫做“索引构建”。如果我们的文档很多,这样索引就一次性装不下内存,该如何构建。硬件的限制 我们知道ram读写是随机的操作,只要输入相应的地址单元就能瞬间将数据读出来或者写进去。但是磁盘不行,磁盘必须有一个寻道的过程,外加一个旋转时间。那么只有涉及到磁盘,我们就可以考虑怎么节省I/O操作时间。【注】操作系统往往以数据块为单位进行读写。因为读一_为某一文档及集构件词项索引时,可使用哪些索引构建方法

IT巨头英特尔看好中国市场前景-程序员宅基地

文章浏览阅读836次。英特尔技术与制造事业部副总裁卞成刚7日在财富论坛间隙接受中新社记者采访时表示,该公司看好中国市场前景,扎根中国并以此走向世界是目前最重要的战略之一。卞成刚说,目前该公司正面临战略转型,即从传统PC服务领域扩展至所有智能设施领域,特别是移动终端。而中国目前正引领全球手机市场,预计未来手机、平板电脑等方面的发明创新将大量在中国市场涌现,并推向全球。持相同态度的还有英特尔中国区执行董事戈峻。戈峻

ceph中的radosgw相关总结_radosgw -c-程序员宅基地

文章浏览阅读627次。https://blog.csdn.net/zrs19800702/article/details/53101213http://blog.csdn.net/lzw06061139/article/details/51445311https://my.oschina.net/linuxhunter/blog/654080rgw 概述Ceph 通过radosgw提供RES..._radosgw -c

前端数据可视化ECharts使用指南——制作时间序列数据的可视化曲线_echarts 时间序列-程序员宅基地

文章浏览阅读3.7k次,点赞6次,收藏9次。我为什么选择ECharts ? 本周学校课程设计,原本随机佛系选了一个51单片机来做音乐播放器,结果在粗略玩了CN-DBpedia两天后才回过神,课设还没有开始整。于是懒癌发作,碍于身上还有比赛的作品没交,本菜鸡对硬件也没啥天赋,所以就直接把题目切换成软件方面的题目。写python的同学选择了一个时间序列数据的可视化曲线程序设计题目,果真python在数据可视化这一点性能很优秀。..._echarts 时间序列

ApplicationEventPublisherAware事件发布-程序员宅基地

文章浏览阅读1.6k次。事件类:/** * *   * @className: EarlyWarnPublishEvent *   * @description:数据风险预警发布事件 *   * @param: *   * @return: *   * @throws: *   * @author: lizz *   * @date: 2020/05/06 15:31 * */public cl..._applicationeventpublisheraware

自定义View实现仿朋友圈的图片查看器,缩放、双击、移动、回弹、下滑退出及动画等_imageview图片边界回弹-程序员宅基地

文章浏览阅读1.2k次。如需转载请注明出处!点击小图片转到图片查看的页面在Android开发中很常用到,抱着学习和分享的心态,在这里写下自己自定义的一个ImageView,可以实现类似微信朋友圈中查看图片的功能和效果。主要功能需求:1.缩放限制:自由缩放,有最大和最小的缩放限制 2居中显示:.若图片没充满整个ImageView,则缩放过程将图片居中 3.双击缩放:根据当前缩放的状态,双击放大两倍或缩小到原来 4.单指_imageview图片边界回弹