- 浏览: 1388767 次
- 性别:
- 来自: 陕西.西安
-
文章分类
最新评论
-
dare_:
经过试验 设置之后反而更慢没有调用ensureCapacity ...
ensureCapacity()方法提高ArrayList的初始化速度 -
wangchao9053:
[flash=200,200][url][img][list] ...
Only the original thread that created a view hierarchy can touch its views的相关 -
cyb504:
考虑将rb文件代码隐藏:我先使用命令jrubyc将所有rb文件 ...
Ruby学习十 JRuby中调用java代码 -
4562xse3460:
大哥,您这个写反了,差点误导我,我觉得看着就不对。百度第一条就 ...
portrait表示纵向,landscape表示横向 -
yin138:
portrait是肖像画,即竖屏,landscape是风景画, ...
portrait表示纵向,landscape表示横向
这部分spec的内容没有全看懂,但是根据FSL的代码能知道这其中的sequence,下面就结合着FSL的代码来描述下video overlay过程的sequence。
首先介绍一下video overlay,vieo overlay不同于video capture,是指不需要对video信号的帧进行copy,直接将视频信号转化成显卡的VGA信号或者将捕获到的视频帧直接存放在显卡的内存中,具体过程就是将视频帧直接写入framebuffer中,不需要经过android 平台的处理。实际上看过FSL的camera preview过程之后就知道,它就是直接将视频数据 写入framebuffer,而没有经过android的surfaceflinger的处理。Video overlay需要硬件的支持,必须是支持video overlay的camera才能使用这套overlay interface。
因为video overlay直接使用linux 的framebuffer来显示捕获到的image,所以和capture相比它更具有效率,而不是将捕获到的image拷贝以后通过其他的方式(android surfaceflinger)来显示。Viedo overlay只用来preview,又被称为framebuffer overlay或previwing。
从spec上来看,实际上video capture interface也能实现preview,只是没有overlay有效率,因为video capture是将数据经过copy以后由android surfaceflinger来控制进行显示(实际上最后surfaceflinger还是通过framebuffer来显示的)。
Video overlay和Video capture使用同样的device,overlay的功能只有在调用VIDIOC_S_FMT后才会有效。下面就看看overlay流程的sequcence。
1、open device
这部分同video capture,首先是要打开设备。如果是同时进行overlay和capture,应该尽量不使用同一个文件 描述符,比如说如果此时在overlay,要拍照的话应该再打开设备,使用一个分开的文件描述符来进行capture。如果driver支持同时进行overlay和capture的话,必须支持使用分开的文件描述符来分别进行overlay和capture 。
camera_device = open(VIDEO_DEVICE, O_RDWR)) ;
2、set output
对于这个设置 输出不是太理解,但overlay换个角度来说是将捕获的image重新组合成能在屏幕上显示的视频信号,在这里的设置输出应该是如果device有多个输出的话,选择一个输出来将数据输入到屏幕,也就是framebuffer。
ioctl(camera_device, VIDIOC_S_OUTPUT, &g_display_lcd) ;
3、set control[可选]
设置用户控制参数,FSL在这里使用了他们驱动自定义的控制参数,不是很理解这个参数设置是想实现什么操作,我觉得这个应该是可选的。
ioctl(camera_device, VIDIOC_S_CTRL, &ctl) ;
4、set crop
这个同video capture是一样的,只是type由V4L2_BUF_TYPE_VIDEO_CAPTURE换成了V4L2_BUF_TYPE_VIDEO_OVERLAY,然后是取景参数的设置:left,top,width,height。
ioctl(camera_device, VIDIOC_S_CROP, &crop) ;
5、set format
这个format应该是最后preview我们在屏幕上看到的image的格式,如果在video capture中,这个就是我们拍照时image的格式。
ioctl(camera_device, VIDIOC_S_FMT, fmt) ;
6、 get video std
这个我觉得肯定是可选的,取得当前视频标准
ioctl(camera_device, VIDIOC_G_STD, &id) ;
7、set stream param
设置流参数,这个和video capture是相同的,这里的param.type是V4L2_BUF_TYPE_VIDEO_CAPTURE,其中timeperframe的分母是需要设定的帧率,而分子是1。
ioctl(camera_device, VIDIOC_S_PARM, &parm) ;
[PS]这里补充一点stream param方面的spec:
一般来说当前的帧率是由当前的视频标准来决定的,如果默认采用视频标准的帧率就不需要设置流参数,但是如果想获得或者设定自己的帧率就需要使用VIDIOC_G_PARM, VIDIOC_S_PARM:
int ioctl(int fd, int request, v4l2_streamparm *argp);
struct v4l2_stramparam包含以下主要成员:
enum v4l2_buf_type type
union param
struct v4l2_captureparm capture
struct v4l2_outputparam output
//要注意的是在这里,不管是overaly还是capture,这里的buffer type都是选择的V4L2_BUF_TYPE_VIDEO_CAPTURE。
Struct v4l2_captureparam包含以下主要成员:
__u32 capturemode
//是否支持高质量图像捕捉
struct v4l2_fract timeperframe
//设置帧率,通过分母分子实现
这里要注意的是,通过 VIDIOC_S_PARM设置帧率不一定成功,driver会根据硬件限制来设置这些参数,所以一般设置以后可以通过VIDIOC_G_PARM来看设定是否成功。
前面从1-8都是设置overlay的参数,然后需要设置framebuufer的参数,framebuffer参数部分的设置通过VIDIOC_G_FBUF,VIDIOC_S_FBUF来实现,这里的参数也是比较复杂,具体可以去参照这个spec:http://v4l2spec.bytesex.org/spec/r10595.htm
我看FSL的代码,它也是采用了默认的framebuffer的参数,唯一的就是改变了一下flag:
ioctl(camera_device, VIDIOC_G_FBUF, &fb_v4l2) ;
fb_v4l2.flags = V4L2_FBUF_FLAG_OVERLAY;
ioctl(camera_device, VIDIOC_S_FBUF, &fb_v4l2) ;
在设置framebubffer参数之前,FSL打开了framebuffer设备,并对屏幕进行了一系列的配置,因为overlay状态下是直接写屏,所以它这里加入了对framebuffer设备的配置工作。
完成这一系列的配置以后通过调用overlay即开始了overlay过程,在这里overlay的数为0时为关闭overlay,为1时为打开overlay。
ioctl(camera_device, VIDIOC_OVERLAY, &overlay) ;
实际上看FSL的preview代码,虽然也加入了线程的概念,但线程内没有作什么实际性的内容,在preview线程起来之前,overlay实际上已经开始了。个人觉得这个preview线程是一个多余的操作。而且它也没有用到android内部的memory,因此在overlay preview的启动过程中对initHeapLocked()的调用也完全是多余的,没有进行实质性的操作。由此可见FSL code完全就是通过linux和v4l2来实现了camera preview的功能,甚至连previewcallback都省去了。
FSL camera take picture with v4l2
首先说明一下可能是因为FSL 的camera 不支持autofocus ,所以它没有实现对autofocus 的支持,autofucus 线程直接调用了callback ,没有进行操作。
FSL 对拍照提供了一套它自己的jpeg 编码,获得的数据可以进行jpeg 编码,也可以直接将捕获的raw data 以call back 返回。Take picture 是建立在preview 的基础 上的,实际上就是将preview 中捕获的某个image 保存下来。在FSL code 中是在overlay 的基础上,重新打开设备,在新的文件描述符上设置take picture 相关的参数,从设备中读到数据以后,再将参数还原到overlay 的状态。下面我们看看take picture 的sequence :
1 、shutter callback
因为拍照是通过快门事件激发的,所以首先会调用mShutterCallback ;
2 、open device
打开一个新的文件描述符来进行take picture 的操作
3 、set format
设置capture 的image format ,可以看看它对参数的设置:
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.pixelformat = g_still_pixelformat;
fmt.fmt.pix.width = g_width;
fmt.fmt.pix.height = g_height;
fmt.fmt.pix.sizeimage = fmt.fmt.pix.width * fmt.fmt.pix.height * g_still_bpp / 8;
fmt.fmt.pix.bytesperline = g_width * g_still_bpp / 8;
其中bpp 是每个像素所占有的比特位
ioctl(fd_v4l, VIDIOC_S_FMT, &fmt) ;
4 、set crop
同样可以看看设置的crop parameter :
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
crop.c.left = 0;
crop.c.top = 0;
crop.c.width = g_width;
crop.c.height = g_height;
ioctl(fd_v4l, VIDIOC_S_CROP, &crop) ;
5 、set stream paramter
parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
parm.parm.capture.timeperframe.numerator = 1;
parm.parm.capture.timeperframe.denominator = g_still_camera_framerate;
parm.parm.capture.capturemode = g_capture_mode;
ioctl(fd_v4l, VIDIOC_S_PARM, &parm) ;
6 、read image data
read(camera_device, buf1, fmt.fmt.pix.sizeimage) ;
这里存在一点疑问,这个camera_device 中的数据是从何而来的,根据v4l2 协议 就是当前overlay 到的数据么?
7 、将数据直接以rawcallback 返回或者压缩成jpeg 返回。
http://zhougaofeng.ixiezi.com/2009/12/02/android-camera-preview-and-take-picture-with-v4l2/
发表评论
-
Android检查是否已经连接到网络
2012-05-14 15:40 1288http://blog.csdn.net/kerenigma/ ... -
Android Framework系列之IMF(二)
2011-06-02 10:09 2212InputConnection是IMF里面一个重要的接口,他是 ... -
Android Frameworks系列之IMF(一)
2011-06-02 10:03 1891http://www.pin5i.com/showtopic- ... -
Android线程优先级设置方法
2011-05-28 14:15 3556http://blog.sina.com.cn/s/blog_ ... -
如何连接android数据库
2011-05-27 15:18 2325http://zhidao.baidu.com/questio ... -
ensureCapacity()方法提高ArrayList的初始化速度
2011-05-27 14:33 11586http://www.gznc.edu.cn/yxsz/jjg ... -
java的isAlive 和 join
2011-05-27 13:38 1606join()用于停止当前线程而运行别的线程。 isAli ... -
Linux系统下.ko文件是什么文件?.so文件是什么文件?
2011-05-25 18:55 5615.so 文件是动态链接库文件,相当于 win下的 .dll ... -
使用Geocoder
2011-05-11 10:46 62127.6 使用Geocoder 地理编 ... -
Gallery学习总结--Cache缓存及数据处理流程
2011-05-09 14:21 2208http://hi.baidu.com/%D6%C7%B4%E ... -
关注的网站
2011-04-06 14:37 1080http://blog.sina.com.cn/s/blog_ ... -
gallery3d源码学习总结(二)
2011-04-01 10:40 3565http://www.j2megame.com/htm ... -
gallery3d源码学习总结(一)——绘制流程drawFocusItems
2011-04-01 10:14 4954eoe·Android开发者门户 标题: gallery3d ... -
Android 启动过程详解(学习1)
2011-03-31 09:27 2251Android 启动过程详解 http://blog.csd ... -
Android中的WatchDog (2)
2011-03-31 09:11 1103http://wenku.baidu.com/view/09c ... -
Android平台WindowManager运用
2011-03-30 10:00 1823Android平台WindowManager运用 我们A ... -
JPEG Rotation and EXIF Orientation
2011-03-17 14:26 3932http://blog.csdn.net/daisyhd/ar ... -
Android 的动作、广播、类别等标识大全
2011-03-11 10:19 1336Android 的动作、广播、类别等标识大全 Stri ... -
浅析Android MediaProvider之二
2011-03-08 08:27 2691http://www.poemcode.net/2010/01 ... -
Task和Activity相关
2011-02-28 09:21 1572Task和Activity相关 这段时间在做一个项目,发 ...
相关推荐
Android的视频输入输出系统是一个复杂且强大的架构,通过Camera和Overlay系统分别处理视频的输入和输出。这两个系统都依赖于硬件抽象层(HAL),以提供高效且跨平台的解决方案。HAL的存在不仅提高了系统的可移植性,...
"mxc_v4l2_overlay.out"可能是一个与i.MX27平台相关的V4L2驱动程序的输出文件,用于处理视频叠加等功能,即在视频流上添加图形信息,如时间戳、水印等。 "ov9650_mx27"和"ov9650_v4l/ov9650_v4l2"标签表明驱动程序...
#### 二、V4L2 API通用元素 编程以支持V4L2设备的一般流程包括以下几个步骤: 1. **打开设备**:通过标准的Linux系统调用来打开设备文件。 2. **改变设备属性**:配置视频输入、输出参数,如分辨率、格式、亮度等...
#### 二、V4L2 API概述 V4L2 API为视频采集设备提供了一套完整的接口规范,它定义了一系列函数和数据结构,使得开发者能够轻松地控制视频采集硬件。V4L2不仅提供了基本的视频捕获功能,还支持视频叠加、流式传输等...
#include <QtGui> #include "processImage h" int main int argc char argv[] { QApplication app argc argv ; ProcessImage process; process resize 480 240 ; process show ;...}
### V4L2驱动编写指南 #### 一、API介绍 Video for Linux Two(V4L2)是一种广泛应用于Linux操作系统中的视频捕获和处理框架。该框架为开发者提供了丰富的API,使得各种视频设备能够更好地集成到Linux系统中。V4L2...
#### 二、V4L2设备节点与设备号分配 V4L2驱动程序为视频设备创建了特定的设备节点,这些节点通常位于`/dev/video/`目录下,具体命名为`videoX`(如`/dev/video0`, `/dev/video1`等)。每个视频设备都有一个唯一的...
基于Android Overlay机制的资源替换方法研究 本文主要研究了基于Android Overlay机制的资源替换方法,旨在满足 Android 手机研发厂商修改产品界面的需求。文章首先介绍了 Android 系统的资源查找机制,然后阐述了...
You can clone this repo, then run the Demo project by doing ./gradlew app:installDebug and launching the application: Installation The Voice overlay is available as a gradle dependency via JCenter. ...
【标题】:“百度地图Android SDK拖拽Overlay Item” 在Android应用开发中,使用地图API是常见的需求,尤其在导航、定位、位置服务等方面。百度地图Android SDK提供了丰富的功能,其中包括在地图上添加自定义覆盖物...
在Android开发中,高德地图是一个广泛使用的地图API,提供了丰富的功能,如定位、路径规划、地图绘制等。本文将详细讲解如何实现自定义点聚合Marker图片以及Overlay的点击选中功能。 首先,我们需要理解“点聚合”...
本主题"Embedded Programming with Android:从零开始搭建Android系统"深入探讨了如何在各种嵌入式硬件上启动和配置Android系统。 Android系统的核心是Linux内核,它的构建过程涉及多个层次。首先,你需要了解Linux...
You'll learn to integrate, animate, and overlay 3D objects on your camera feed, before moving on to implement sensor-based AR applications. You'll explore various concepts by creating an AR ...
`Overlay`是Android SDK中用于在地图上绘制图形或文本的对象,它允许我们在地图上添加自定义的图标或标注。 首先,我们需要在项目中引入Google Maps API。在`build.gradle`文件中添加依赖: ```groovy ...
《android技术内幕:系统卷》 前言 第1章 准备工作 /1 1.1 深入认识android /2 1.1.1 android的系统构架 /2 1.1.2 android的初始化流程 /5 1.1.3 各个层次之间的相互关系 /8 1.1.4 android系统开发(移植)和应用...
### V4L2 (Video for Linux 2) 驅動技術詳解 #### V4L2 技術概述 **V4L2 (Video for Linux 2)** 是 Linux 核心的一部分,專門用於支持各種視頻設備。自 1998 年由 Bill Dirks 提出以來,經歷了長期的發展和完善,...
本文档主要讲述的是Android平台Overlay机制;Android overlay 机制允许在不修改packages中apk的情况下,来自定义 framework和package中的资源文件,实现资源的定制。来达到显示不同的UI得目的(如MIUI)。 希望本...
#### 二、关键技术点 **1. 如何制作带尾巴的气泡View** - **使用9-patch图片** 在Android中,9-patch图片是一种特殊的图片格式,它允许开发者定义图片的拉伸区域,从而使图片在不同尺寸下保持良好的显示效果。...
第8章“Android的Video输入输出系统”,介绍Android的Video输入输出系统,包括Overlay系统和Camera系统两个部分,前者只有本地的内容,后者各个层次均有内容。 第9章“Android的多媒体系统”,介绍Android的...
在Android开发中,"Overlay Menu"通常指的是一个悬浮在应用主界面之上的菜单,它可以提供额外的功能选项,而不会遮挡或干扰用户对主要界面的交互。这种设计模式在许多现代应用中非常常见,比如社交媒体应用或者游戏...