v4l2驱动编写篇(2)
2011年04月01日
应用可以通过调用VIDIOC_G_FMT知道硬件现在的配置如何。这种情况下传递的参数是一个v4l2_format 结构体:
struct v4l2_format
{
enum v4l2_buf_type type;
union
{
struct v4l2_pix_format pix;
struct v4l2_window win;
struct v4l2_vbi_format vbi;
struct v4l2_sliced_vbi_format sliced;
__u8 raw_data[200];
} fmt;
};
同样,type 描述的是缓冲区类型;V4L2层会根据type的不同,将调用解释成不同的驱动的回调函数. 对于视频捕获设备而言,这个回调函数就是:
int (*vidioc_g_fmt_cap)(struct file *file, void *private_data,
struct v4l2_format *f);
对于视频捕获(和输出)设备, 联合体中pix 字段是我们关注的重点. 这是我们在上一期中见过的v4l2_pix_format 结构体;驱动应该用现在的硬件设置填充那个结构体并且返回。这个调用通常不会失败,除非是硬件出现了非常严重的问题。
其他的回调函数还有:
int (*vidioc_s_fmt_overlay)(file, private_data, f);
int (*vidioc_s_fmt_video_output)(file, private_data, f);
int (*vidioc_s_fmt_vbi)(file, private_data, f);
int (*vidioc_s_fmt_vbi_output)(file, private_data, f);
int (*vidioc_s_fmt_vbi_capture)(file, private_data, f);
int (*vidioc_s_fmt_type_private)(file, private_data, f);
vidioc_s_fmt_video_output()与捕获接口一样使用相同的方式使用同一个pix字段。
多数应用都想最终对硬件进行配置以使其为应用提供一种符合其目的的格式。改变视频格有两个接口。第一个是VIDIOC_TRY_FMT 调用,它在V4L2驱动中转化为下面的回调函数:
int (*vidioc_try_fmt_cap)(struct file *file, void *private_data,
struct v4l2_format *f);
int (*vidioc_try_fmt_video_output)(struct file *file, void *private_data,
struct v4l2_format *f);
/* And so on for the other buffer types */
要处理这个调用,驱动会查看请求的视频格式,然后断定硬件是否支持这个格式。如果应用请求的格式是不能支持的,就会返回-EINVAL.所以,例如,一个描述了一个不支持格的fourcc编码或者请求了一个隔行扫描的视频,而设备只支持逐行扫描的就会失败。在另一方面,驱动可以调整size字段,以与硬件支持的图像大小相适应。普便的做法是可能的话就将大小调小。所以一个只能处理VGA分辨率的设备驱动会根据情况相应地调整width和height参数而成功返回。v4l2_format 结构体会在调用后复制给用户空间;驱动应该更新这个结构体以反映改变的参数,这样应用才可以知道它真正得到就是什么。
VIDIOC_TRY_FMT 这个处理对于驱动来说是可选的,但是不推荐忽略这个功能.如果提供了的话,这个函数可以在任何时候调用,甚至时设备正在工作的时候。它不可以对实质上的硬件参数做任何改变,只是让应用知道都可以做什么的一种方式。
如果应用要真正的改变硬件的格式,它使用VIDIOC_S_FMT 调用,它以下面的方式到达驱动:
int (*vidioc_s_fmt_cap)(struct file *file, void *private_data,
struct v4l2_format *f);
int (*vidioc_s_fmt_video_output)(struct file *file, void *private_data,
struct v4l2_format *f);
与VIDIOC_TRY_FMT不同,这个调用是不能随时调用的.如果硬件正在工作,或者有流缓冲器己经开辟了(未来另一篇文章的),改变格式会带来无尽的麻烦。想想会发生什么,比如说,一个新的格式比现在使的缓冲区大的时候。所以驱动要一直保证硬件是空闲的,如果不空闲就对请求返回失败 (-EBUSY).
格式的改变应该是原子的
发表评论
-
Sharepoint+MOSS分册第2轮筛选结果文章列表
2012-01-20 00:34 731Sharepoint+MOSS分册第2轮筛 ... -
在 Android 平台上应用 Berkeley DB 11gR2 SQL(drop-in模式)(转http://www.cnmsdn.com/html/201004/1270362092ID3134.html)
2012-01-20 00:34 788在 Android 平台上应用 Ber ... -
编程心得
2012-01-20 00:34 681编程心得 2011年03月21日 转自:http://w ... -
在 C# 中通过 P/Invoke 调用Win32 DLL
2012-01-20 00:34 766在 C# 中通过 P/Invoke 调用Win32 DLL ... -
http://www.cnblogs.com/yungboy/archive/2010/05/28/1746376.html
2012-01-20 00:33 867http://www.cnblogs.com/yungboy/ ... -
10] 建立C帝国(GDAL编译安装以及一般的C库编译步骤)
2012-01-19 01:31 89010] 建立C帝国(GDAL编译安 ... -
Android开发之Android体系架构介绍
2012-01-19 01:31 1566Android开发之Android体系 ... -
EGLIBC库介绍
2012-01-19 01:31 603EGLIBC库介绍 2011年05月05 ... -
给Win32 GUI程序调试信息输出方法
2012-01-19 01:31 1357给Win32 GUI程序调试信息输出方法 2011年09月2 ... -
SAMSUNG S3C2440的简易BootLoader ㈢
2012-01-19 01:31 608SAMSUNG S3C2440的简易BootLoa ... -
Application/Session/Cookie/viewstate/Cache/隐藏域/查询字符串的比较
2012-01-17 00:48 650Application/Session/Cookie/view ... -
file_operation结构体详解
2012-01-17 00:48 1012file_operation结构体详解 2011年06月22 ... -
电脑蓝屏自动关机故障的检修方法
2012-01-17 00:48 657电脑蓝屏自动关机故障的检修方法 2011年09月23日 ... -
Video4Linux
2012-01-17 00:48 777Video4Linux 2011年12月05日 Vide ... -
HK-2000数据采集仪WEB服务器BOA的移植方法
2012-01-15 19:37 686HK-2000数据采集仪WEB服务器BOA的移植方法 200 ... -
如何为linux嵌入式开发建立交叉编译环境(2.4内核)
2012-01-15 19:36 700如何为linux嵌入式开发建立交叉编译环境(2.4内核) 2 ... -
【转】如何为嵌入式开发建立交叉编译环境
2012-01-15 19:36 755【转】如何为嵌入式开发建立交叉编译环境 2009年10月26 ... -
EGLIBC库介绍
2012-01-15 19:36 550EGLIBC库介绍 2011年05月05 ... -
c库函数qsort使用方法实例
2012-01-15 19:36 549c库函数qsort使用方法实例 2010年01月03日 ...
相关推荐
### V4L2驱动编写指南 #### 一、API介绍 Video for Linux Two(V4L2)是一种广泛应用于Linux操作系统中的视频捕获和处理框架。该框架为开发者提供了丰富的API,使得各种视频设备能够更好地集成到Linux系统中。V4L2...
V4L2驱动编写指南通常涵盖以下几个关键部分: 1. **驱动结构**:首先,理解V4L2驱动的基本结构至关重要。一个V4L2驱动需要实现一系列的函数指针,这些函数指针对应于V4L2 API的不同操作,例如打开、关闭设备、配置...
V4L2驱动编程指南是指导开发者如何编写基于V4L2框架的视频驱动的文档,通常涉及到视频设备的注册、初始化、配置以及数据传输等核心概念。文档基于经典系列文章《Video4Linux2》进行翻译和整理,适合对V4L2编程有初步...
在给定文件的标题和描述中提到的是V4L2中文手册的全五章版本,包括了对驱动程序编写的指南,这意味着手册不仅包含了API的使用方法,还包括了如何为支持V4L2的设备编写驱动程序的详细指南。这些信息对于想要深入了解...
总的来说,"v4l2驱动学习"涵盖了硬件接口、设备驱动编程、Linux内核子系统等多个方面的知识,对于希望在嵌入式领域尤其是多媒体应用方面发展的工程师来说,是一项宝贵的技能。通过系统的学习和实践,你不仅可以掌握...
Linux V4L2驱动详解的知识点包括以下几个重要部分: 一、API介绍 V4L2(Video for Linux Two)是Linux内核中用于视频设备的驱动开发的API。它在1998年首次亮相,到2002年11月成为Linux内核的一部分。V4L2旨在支持...
在编写V4L2驱动程序时,有几个关键步骤是必不可少的: 1. 打开设备文件:通常为`/dev/video0`或类似。 2. 设置图像格式:使用`VIDIOC_S_FMT` ioctl命令,指定图像的宽度、高度、像素格式(如YUV420)等。 3. 分配和...
这些结构体是理解和编写V4L2驱动程序的关键,它们构成了V4L2框架的基础,并且是开发过程中必不可少的部分。 ### 结论 V4L2作为Linux内核中的视频设备驱动框架,通过提供一组统一的接口和数据结构,极大地简化了...
花了很大的经历,搜集并整理了v4l2开发的文档,这些文档写的比较...⑤V4L2驱动编写指南 ⑥V4L2驱动程序架构 ⑦v4l2驱动高级编写篇 ⑧V4L2驱动的移植与应用(一) ⑨V4L2驱动的移植与应用(二) ⑩V4L2驱动的移植与应用(三)
### 基于Linux的V4L2视频架构驱动编写详解 #### 一、V4L2概述 V4L2 (Video for Linux Version 2) 是Linux操作系统中用于视频采集设备的一种标准接口,它是V4L (Video for Linux) 的升级版本。V4L最初在1997年发布...
在集成过程中,首先需要在Linux系统中确保V4L2驱动正确安装并且摄像头设备可用。然后,在OpenCV程序中,使用`cv::VideoCapture`对象指定V4L2设备节点(通常是`/dev/video0`)。通过调用`VideoCapture::open()`方法...
它的设计目标是提供良好的兼容性,支持不同类型的硬件,并且允许硬件厂商通过实现V4L2驱动来简化开发过程。 **OV9650驱动开发** OV9650驱动程序的开发涉及以下几个关键步骤: 1. **初始化硬件**:驱动首先要进行...
本主题主要探讨的是如何将V4L2驱动移植到目标系统以及如何在应用程序中使用V4L2接口来操作这些设备。 一、V4L2驱动结构 V4L2驱动通常由两部分组成:内核模块和用户空间库。内核模块实现了与硬件设备的直接交互,而...
1. **驱动模型**:V4L2驱动模型基于字符设备驱动,通过`struct video_device`结构体来定义视频设备,并通过内核注册机制进行管理。开发者可以通过这个模型来编写特定硬件的驱动程序。 2. **缓冲区管理**:V4L2引入...
这篇博客文章详细介绍了如何使用V4L2驱动USB摄像头,我们将在此基础上深入探讨V4L2驱动的相关知识点。 首先,了解V4L2的基本概念至关重要。V4L2是V4L(Video for Linux)的升级版本,旨在解决旧版接口的局限性,...
V4L2(Video for Linux Two)是Linux内核中用于处理视频输入和输出设备的接口,它提供了与多媒体硬件交互的标准化方法。...通过阅读内核源码、官方文档以及社区资源,开发者可以深入理解和掌握V4L2驱动的编写技巧。
5. C/C++实现:使用C/C++编写V4L2应用程序,需要理解相关的结构体和枚举类型,比如`struct v4l2_format`定义了视频格式,`struct v4l2_pix_format`包含了像素格式的具体信息。同时,需要熟练掌握ioctl调用,如`...
V4L2是Linux内核提供的一套驱动程序接口,它允许用户空间程序访问视频设备,如内置或外接的摄像头。下面将详细解释如何利用C语言和V4L2来处理图像,特别是YUYV格式,并将其保存为BMP图像。 1. V4L2简介: V4L2是...
基于 V4L2 的视频驱动开发需要了解摄像头方面的知识、Camera 解码器和控制器、V4L2 的 API 和数据结构、V4L2 驱动架构等几个知识点,开发者需要了解每个组件的作用和配置方法,以便编写出符合 V4L2 规范的视频驱动。