转自: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):

$ export LD_PRELOAD=/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 <linux-media@vger.kernel.org>

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.

★emouse 思·睿博客文章★
原创文章转载请注明:http://emouse.cnblogs.com

libv4l 库【转】的更多相关文章

  1. 【Linux开发】OpenCV在ARM-linux上的移植过程遇到的问题4---共享库中嵌套库带路径【已解决】

    [Linux开发]OpenCV在ARM-linux上的移植过程遇到的问题4-共享库中嵌套库带路径[已解决] 标签:[Linux开发] 紧接着上一篇,我居然又尝试了一下编译opencv,主要是因为由于交 ...

  2. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  3. TinyWeb v1.0 正式完成第一个Release版本(功能基于 libuv 跨平台库)

    使用方法很简单,很容易融入现有项目,使现有项目拥有Web网站功能和WebSocket,以及Socket直连! 并且包含了一个跨平台(windows/linux)工具集合; 嗯,也挺棒的^,^ 在项目中 ...

  4. 在 Laravel 中使用图片处理库 Integration/Image

    系统需求 PHP >= 5.3 Fileinfo Extension GD Library (>=2.0) … or … Imagick PHP extension (>=6.5.7 ...

  5. [APUE]标准IO库(下)

    一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...

  6. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  7. Python标准库--typing

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 模块简介 Python 3.5 增加了一个有意思的库--typ ...

  8. Windows 常用运行库下载 (DirectX、VC++、.Net Framework等)

    经常听到有朋友抱怨他的电脑运行软件或者游戏时提示缺少什么 d3dx9_xx.dll 或 msvcp71.dll.msvcr71.dll又或者是 .Net Framework 初始化之类的错误而无法正常 ...

  9. vs2010静态链接MFC库报链接错误

    由于需要将MFC程序在其它电脑上运行,所以需要将动态链接的MFC改成静态链接,本以为很简单,没想到链接的时候出现下面的链接错误: uafxcw.lib(afxmem.obj) : error LNK2 ...

随机推荐

  1. Bootstrap3适配IE8浏览器的方法

    <!--[if lte IE 8]> <script src="js/respond.min.js"></script> <script ...

  2. HTML中body相关标签-02

    今日内容: 字体标签: h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub> ...

  3. python 三目运算

    python中的三目运算: result = a if condition else b #当满足condition返回a否则返回b 三目运算可以使你的代码看起来简洁,且运算高效

  4. 《Cracking the Coding Interview》——第9章:递归和动态规划——题目3

    2014-03-20 03:01 题目:给定一个已按升序排序的数组,找出是否有A[i] = i的情况出现. 解法1:如果元素不重复,是可以严格二分查找的. 代码: // 9.3 Given a uni ...

  5. 【Invert Binary Tree】cpp

    题目: Invert Binary Tree Total Accepted: 20346 Total Submissions: 57084My Submissions Question Solutio ...

  6. Python 快速部署安装所需模块

    需求 我们需要在拷给别人或者提交至服务器也用同样的模块,好保持和开发的一样,所以我们需要自己手动写配置模块信息. 方法 在根目录下创建一个 requirements.txt  文件 里面写 模块名== ...

  7. CandyCrush 糖果传奇

    1.unity自带触发事件 unity的每一个Collider对象都有类似OnMouseDown.OnMouseOver等事件.此事件是存在于MonoBehaviour脚本里的,而MonoBehavi ...

  8. makefile规则整理

    makefile规则整理 实际开发中,makefile改的多,写的少. 为了后面不要在编译链接这种地方花费太多的时间,在这里系统性的整理其规则: 基本格式 TARGET : PREREQUISITES ...

  9. springboot08 jdbc

    一.JDBC&连接池 1. jdbc介绍 ​ JDBC(Java DataBase Connectivity ,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数 ...

  10. HDU 4262 Juggler 树状数组

    将每个球按输入顺序编号,建立 它第几个被扔掉->编号 的映射关系. 记录当前在手里的球的编号,按扔掉的顺序查找这个球的编号,看看这个球是逆时针转到手里更近还是顺时针转到手里更近,即当前扔掉球的编 ...