Android Camera系统

news/2024/7/21 3:52:29 标签: android, video, linux, 数据结构, 框架, 图像处理

1. Overview

1.1 物理架构

1.2 Android架构

2. CameraService

3. HAL

4. Overlay

5. Video for Linux


1. Overview

 本文以Freescale IMX为例剖析camera摄像头的系统架构。

1.1 物理架构

 硬件方面,camera系统分为主控制器和摄像头设备,功能上主要有取景,拍照和摄影。

1) IPU - Image Process Unit 图像处理单元,用于控制摄像机和显示屏。

2)图像采集 - 由camera采集的图像数据信息通过IPU的ICS接口控制。

3)DMA映射到内存 - IPU将采集到得数据通过DMA映射到一段内存。

4)队列机制 - 为了更高效地传送数据,将内存中的数据取出加入一队列,并传送到另一队列。

5)视频输出 - 将视频数据从队列中取出,通过IPU控制这段独立显存,最终将视频显示出来。

1.2 Android架构

Android的camera系统架构自上而下分别为应用层-框架层-硬件抽象层-linux驱动层。

1) APP - Framework

应用层与java框架层的间主要由Binder机制进行通信。

系统初始化时会开启一个CameraService的守护进程,为上层应用提供camera对的功能接口。

2) Framework - HAL

框架层与硬件抽象层间通过回调函数传递数据。

3) Overlay

Overlay层由ServiceFlinger和OverlayHal组成,实现视频输出功能,只有camera框架层或者视频框架层能调用它,上层无法直接调用。

4) HAL - driver

抽象层位于用户空间,通过系统调用如open(),read(),ioctl()等与内核空间进行数据传递。

2 CameraService

 Camera的主要功能有取景Preview,拍照takePicture和摄影Recording,下文以取景为例,剖析camera系统架构。

 

要实现取景Preview功能,主要须调用CameraService::Client::startPreview()和 CameraService::Client::setOverlay(),前者通过mHardware->startPreview();调用 cameraHal硬件抽象层以实现取景的整个流程,后者通过mSurface->createOverlay();调用 surfaceFlinger层创建overlay_object对象。

3 HAL

startPreview主要完成三项任务,配置图象,配置内存,开启两个存取buf队列的线程。

1) cameraPreviewConfig()配置预览图象参数

CameraOpen() - 通过打开设备节点/dev/video0得以由系统接口与设备驱动交互。

S_FMT - ioctl()的指令,设置图象像素格式,将数据由硬件抽象层传递至Linux驱动,这里也就是v4l2。

G_FMT - 得到图象像素格式,将数据由底层驱动v4l2返回至硬件抽象层。

S_PARM - 设置模式的指令,这个指令传到底层后,将会实现对camera硬件的控制。

2) cameraPreviewStart()开启预览,实际上配置了内存

REQBUFS - 申请内存,通过dma_alloc_coherent()为camera申请一端连续的dma内存。

QUERYBUF - 询问内存,将申请到内存的物理地址,虚拟地址等数据从内核空间传递到用户空间。

QBUF - 加入队列,将通过询问得到的buf加入一个队列。

3) PreviewShowFrameThread()和PreviewShowFrameThread()

PreviewCaptureFrameThread()捕捉一帧数据的线程,通过DQBUF,从队列中取出一个buf数据,这里,一个buf即一帧数据即一张图片。注意,如果camera没有采集到图片,这个线程会在DQBUF阻塞。

PreviewShowFrameThread()显示一帧数据的线程。

mDataCb() - 回调函数,将采集到的图象数据传回CameraService,再由CameraService传递给上层应用。

mOverlay->dequeueBuffer() - 调用Overlay层,从Overlay层得到一个空闲的overlaybuffer,将图象数据拷贝到这个buffer里。至于这个buffer后续的工作,即视频输出,则交给了Overlay去完成。

QUERYBUF & QBUF - 由于已经从队列里取出了一个buf,需要再询问并加入另一个buf到队列里。

4) Overlay

CameraService::Client::startPreview()完成mHardware->startPreview();后 便去执行CameraService::Client::setOverlay(),如果没有任何overlay,则创建一个新的,通过 mHardware->setOverlay(new Overlay(mOverlayRef))调用到SurfaceFlinger层,再由 overlay_dev->createOverlay();调用到overlay的硬件抽象层,抽象层创建并初始化overlay对象,与 cameraHal类似,通过ioctl()指令与底层v4l2通信,配置视频参数和内存空间。随后开启一个overlay线程,用于存取队列中的视频数 据。

注意,SurfaceFlinger里也会开启一个处理overlay的surfaceFlinger线程,用于等待用户事件,作相应的overlay控制。

5 Video for Linux

v4l2 - video for linux 2是linux为视频驱动抽象出的一层统一的接口,数据结构如下,

v4l2作为master主设备由(*attach)与camera从设备进行绑定。

初始化函数probe()如下,

1) init_camera_struct()初始化v4l2主设备的数据结构,实现open(), read(), ioctl(), mmap()等操作。

2) v4l2_int_device_register(),注册v4l2主设备,绑定camera从设备。

3) video_register_device()注册linux video设备,建立/dev/video0设备节点。

 

http://blog.csdn.net/zjc0888/archive/2011/05/18/6428993.aspx


http://www.niftyadmin.cn/n/1720052.html

相关文章

微信小程序之微信登陆 —— 微信小程序教程系列,计算机移动应用开发

success: function(res) { console.log(res); if (res.code) { //发起网络请求 //doSomething } else { console.log(‘获取用户登录态失败!’ res.errMsg) } }, fail: function(){ console.log(“启用wx.login函数,失败!”); },…

kmp详解(详尽版)(重拾笔记)

又是考试考到了板子,看出是Kmp板子题后心态直接炸裂然后题意看错暴力打错。。。 就是知识点理解掌握的并不扎实就像exgcd一样课下自己推了一遍理解透了考试现推也能打但是理解不透,记得再熟也会打不出来尴尬。 一直认为Kmp简单而且理解透了回去在看全是细…

机器视觉-相机镜头光源介绍及选型-10相机分类

相机分类 1.1.分类 感光芯片:有CCD和CMOS两种 模拟相机:用于电视和监控,通用性好、成本低,分辨率低、采集速度慢,易受噪声干扰 数字相机:输出标准:IEEE1394;USB2.0;DCOM3;RS-644 LVDS;Came…

微信小程序开发之——获取系统信息,2021阿里、网易、京东等大厂最新Android面试题

用户字体大小 {{result.fontSizeSetting}} 客户端基础库版本 {{result.SDKVersion}} 设备性能等级 {{result.benchmarkLevel}} 设备方向 {{result.deviceOrientation}} 允许微信使用相册 {{result.albumAuthorized}} 允许微信使用摄像头 {{result.cameraAuthorized}} 允许…

为什么开发人员对于PHP语言褒贬不一

PHP 语言,作为服务器端开发的脚本语言,在网站开发方面非常有名。从1995年 Rasmus Lerdorf 创建之后,W3Techs 的调查显示在已知的服务端编程语言中,PHP 占了82%。其中不乏WordPress,Facebook 这种公司。PHP 语言&#x…

关于标准android中视频播放器中的快进和快退的步长时间设置

文件 :frameworks/base/core/java/android/widget/MediaController.java private View.OnClickListener mRewListener new View.OnClickListener() {public void onClick(View v) {int pos mPlayer.getCurrentPosition();pos - 5000; // millisecondsmPlayer.seek…

dump数据方法

//media.vt.dumpdata //Pvmi_mio_comm_ril.cpp

CentOS在VMware中的安装

1、启动VMware 2、新建一台虚拟机,选择典型 3、选择稍后安装操作系统 4、选择引导系统为Linux,系统版本为Centos 5、选择安装位置 6、选择最大磁盘容量 7、点击自定义硬件,进行硬件设置 8、 9、启动程序,安装系统 10、选择中文&am…