Android Camera系统
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系统分为主控制器和摄像头设备,功能上主要有preview预览,takePicture拍照和recording录像。
1) IPU - Image Process Unit 图像处理单元,用于控制摄像机和显示屏。
2)图像采集 - 由camera采集的图像数据信息通过IPU的CSI接口控制。
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设备节点。
Android Camera系统相关推荐
- Android Camera 系统架构源码分析
Android Camera 系统架构源码分析(1)---->Camera的初始化 Android Camera 系统架构源码分析(2)---->Camera的startPreview和s ...
- Android Camera:从零开发一款相机APP Day01:前景
一.Android Camera开发前景: 1)camera相关应用的领域2)相关岗位介绍:3)市场招聘介绍:4)发展前景介绍: 二.学习这门课的重要性: 1)适合的人群:2)熟悉和了解Android ...
- Android源码之Camera系统架构
2019独角兽企业重金招聘Python工程师标准>>> https://blog.csdn.net/ljsbuct/article/details/7094670 https://w ...
- android camera 降低帧率_Android性能问题分析之bugreport
Android手机性能问题一直是用户关注的重点,分析性能问题则成为工程师日常工作的一部分.根据问题的类型通常有适合的工具可供使用,比如systrace ,traceview,simpleperf等可视 ...
- Android Camera设置setPreviewCallback实现onPreviewFrame接口实时截取每一帧视频流数据
1 概述 通过Android Camera拍摄预览中设置setPreviewCallback实现onPreviewFrame接口,实时截取每一帧视频流数据 2 知识点 ① Android Camera ...
- qcom Android Camera【转】
本文转载自:http://blog.csdn.net/Wilsonboliu/article/details/54949196 1.总体架构 Android Camera 框架从整体上看是一个 cli ...
- 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)...
第四章.Android编译系统与定制Android平台系统 4.1Android编译系统 Android的源码由几十万个文件构成,这些文件之间有的相互依赖,有的又相互独立,它们按功能或类型又被放到不同 ...
- 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )
文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...
- android camera(三):camera V4L2 FIMC
关键词: android camera CMM 模组 camera参数 CAMIF V4L2 平台信息: 内核: linux 系统: android 平台:S5PV310(samsung ...
最新文章
- lua字符串转数组_深入Lua:字符串管理
- Java实体类对象修改日志记录
- 探秘Tomcat——一个简易的Servlet容器
- 4个强大的Linux服务器监控工具[转]
- 一次性清退125名硕博研究生!又一高校发公告
- 服务器间传文件$d,基于OpenSSH+WinSCP完成Windows服务器之间的文件传输
- mysql中变量值得输出,几个比较重要的MySQL变量
- day11--Matplotlib--柱形图与盒图
- 使用readelf和objdump剖析目标文件
- 【Python】日志关键字分析工具
- java png图片读取_png图片的读取
- python句柄无效_作为Windows服务运行的Python:OSError:[WinError 6]句柄无效
- MT61K512M32KPA-16:C显卡GDDR6XD9ZPP显存
- 微信消息推送神器【一封传话】介绍,让消息推送更简单
- Scratch3.0----函数(2)
- 全国高校恋爱关系图谱:北大受宠爱,浙大最孤独
- C语言绕过杀毒软件,易语言插件规避杀毒软件方法
- 1-9九个数字组成一个九位数 如果从左边起取出1个数字,需要能被1整除,取出两个数字组成的数能被2整除,取出三个数字组成的数能被3整除,依次类推
- H.266/VVC帧间预测技术学习:帧间和帧内联合预测(Combined inter and intra prediction, CIIP)
- Mysql我国省市区字典数据
热门文章
- (类簇)NSString,NSArray,NSNumber等类的继承问题
- matlab四舍五入
- VB.NET使文本框只能输入数字
- 600多个微信小程序源码_C2CQQ小程序源码
- 数学建模基本算法模型Chapter1--线性规划
- 貌似潘安,情如宋玉,才胜子建 是什么意思?
- MySQL 快速造数 mysql_random_data_load
- php的header_php获取网页header信息的4种方法
- 统计本年度发布的房屋出租信息
- 计算机一级复习知识点小自考,《数字图像处理》自考复习知识点.doc