安卓camera总体框架

今天是周五了,时间过得真快,通常这个时候,我都还沉醉了上班的状态中,说到上班,我是认真的,我非常喜欢上班,特别是今天,我会听到一声优美的声音,我的银行卡会多出一些钱,而这些最粗鲁的奖励也是我最讨厌的,我认为,上班就上班嘛,为什么要发工资呢。哈哈~提前祝大家周末愉快。这篇文章跟摄像头有关,是我一个做摄像头工作很久的同学总结的,如果在摄像头方面想有所建树,我可以帮忙引荐认识一下,或者在工作上遇到影像方面的难题,也可以请教一下,就这样。

前言摘要

随着技术的发展,摄像头在手机中是非常重要的模块,也是目前主流手机品牌主打的一个功能模块。例如oppo 手机广告语 「照亮你的美,柔光自拍」,小米手机「有你拍照会更加美」华为手机更是采用高端的莱卡摄像头,mate系列拍照简直是逆天表现,这些产品的买点和打造,没有能够离开摄像头这个重要的功能角色。所以对在校学生,还是即将走向工作岗位或者在工作岗位想从事影像技术开发的爱好者,从现在开始,我将带领你们走入camera开发,通过阅读这些文档,掌握camera开发技术,对于毕业生来讲,是谋职一个热门的专业领域,对工作的工程师,可以拓宽你们camera模块的专业技能,如果你们通过阅读我写的文档,能够有收获,那么我的付出会感到欣慰。

camera软件整体架构图

我们来先看camera软件整体架构

640?wx_fmt=png

App应用端

APP代码位置:packages/apps/Camera2

代码功能:

主要对 android.hardware.Camera(在Framework中) 类的调用,并且实现Camera 应用的业务逻辑和UI 显示。Camera 的应用层在Android 上表现为直接调用SDK API 开发的一个Camera 应用APK包。一个Android 应用中若要使用这个android.hardware.Camera类,需要在Manifest 文件声明Camera的权限,另外还 需要添加一些<uses-feature> 元素来声明应用中的Camera 特性,如自动对焦等。

framework层

framework

代码位置:

frameworks/base/core/java/android/hardware/Camera.java

编译调试:

mmm frameworks/base,代码编译成framework.jar。

代码功能:

AP端必须包含android.hardware.Camera类,才可以调用framework接口函数。

JNI层

Jni

代码路劲:

frameworks/base/core/jni/android_hardware_Camera.cpp。

编译调试:

mmm frameworks/base/core/jni,代码编译成libandroid_runtime.so

代码功能:

这是是Android提供给app层调用的java接口。这个类用来连接或断开一个Camera服务,设置拍摄参数,开始、停止预览,拍照等。android.hardware.Camera这个类是和JNI中定义的类是一个,有些方法通过Jni的方式调用本地代码得到,有些方法自己实现。

camera client

代码位置:

frameworks/av/camera/
qinyuanyi@sz-ubuntu-01:~/work/qcom$ ls
frameworks/av/camera/
include       //头文件
ICameraClient.cpp
CameraBase.cpp
CameraParameters2.cpp
CameraUtils.cpp
ICamera.cpp
Camera.cpp
CameraParameters.cpp
CaptureResult.cpp
ICameraRecordingProxy.cpp

编译调试:

mmm frameworks/av/camera/ ,被编译成库libcamera_client.so。

代码功能:

frameworks/av/camera/目录下,主要功能部分的代码为Camera.cpp、ICameraService.cpp、ICamera.cpp、ICameraClient.cpp、CameraBase.cpp在Camera模块的各个库中,libcamera_client.so 位于核心的位置,作为Camera框架的 Client客户端部分,与另外一部分内容服务端libcameraservice.so通过进程间通讯(即Binder机制)的方式进行通讯。其中Camera.cpp是主要的核心部分,它提供了对上层的主要功能接口。ICameraClient 类继承IInterface,并定义了Camera客户端的接口,BnCameraClient 继承BnInterface,这是为基于Android的基础类Binder机制实现在进程通讯而构建的。

camera service

代码位置:

frameworks/av/services/camera/libcameraservice/ 

qinyuanyi@sz-ubuntu-01:~/work/qcom$ ls frameworks/av/services/camera/libcameraservice/ Android.mk api1 api2 device1 device3                  CameraFlashlight.h  CameraService.h CameraService.cpp                  CameraFlashlight.cpp     common           

 编译调试:

mmm frameworks/av/services/camera/libcameraservice/,被编译成库libcameraservice.so。

代码功能:

libcameraservice.so是Camera 框架的中间层,Camera服务器程序,它实现了Camera服务端的功能,并且与libcamera_client.so通过进程间通讯(即 Binder机制)的方式进行通讯。然后通过调用实际的Camera 硬件接口来实现功能,即下层HAL层。

CameraService里面主要实现了两个类: CameraService---->BnCameraService---->ICameraService CameraService::Client---->BnCamera---->ICamera CameraService::Client通过调用CameraHAL层控制具体的硬件操作流程来实现具体的功能。

libcameraservice的启动:

vim frameworks/av/media/mediaserver/main_mediaserver.cp

640?wx_fmt=png

libcameraservice调用CameraHAL层关键代码:

frameworks/av/services/camera/libcameraservice/api1/CameraClient.cpp frameworks/av/services/camera/libcameraservice/device1/CameraHardwareInterface.h CameraClient.cpp是CameraService::Client类的实现,该类提供了给ICamera调用的startPreview等相关功能接口,在CameraClient的各函数中,通过初始化CameraHardwareInterface类并调用它提供的操作接口连接到Hal层。

CameraHardwareInterface.h是libcameraservice与cameraHal的接口。在它的initialize函数中调用了从module的open函数返回了mDevice,mDevice提供了上层的一系列的操作函数集合,通过调用mDevice->ops的相应的相应指针进行调用,比如下边的startPreview函数。

640?wx_fmt=png

hal层

代码位置:

hardware/qcom/camera/QCamera2/ 

x@sz-ubuntu-01:~/work/qcom$ ls  hardware/qcom/camera/QCamera2/ Android.mk    

HAL HAL3 stack util QCamera2Factory.cpp    QCamera2Factory.h QCamera2Hal.cpp QCameraFormat.h 

HAL 和 HAL3:分别是camera hal1和hal3架构,目前主流趋势是hal3.不过hal1架构目前比较稳定。

QCamera2Factory.cpp:qcom和mtk厂商定制的接口

QCamera2Hal.cpp:实现函数映射,通过QCamera2Hal.cpp去访问QCamera2Factory.cpp

编译调试:mmm hardware/qcom/camera/QCamera2/ 

生成平台“camera.xxx平台.so”。

代码功能:厂商的定制hal层都在这个目录,我们算法的接入也是在这个目录。所以hal是framework和kernel底层通信的桥梁。Qcom对hal层数据流的管理采用channel和stream方式,其中包括对内存的申请和分配都在其中进行。

vendor层

代码位置:

vendor/qcom/proprietary/mm-camera
qinyuanyi@sz-ubuntu-01:~/work/qcom$ls
vendor/qcom/proprietary/mm-camera/mm-camera2/ Android.mk
includes
log_debug
media-controller
server-imaging
server-tuning
services  tests

编译调试:mmm vendor/qcom/proprietary/mm-camera,不同目录下面生成平台xxx.so。然后根据每个目录下面的mk文件,查找对应so库。

代码功能:Qcom这里采用mct demon进程控制,hal和mct通信是通过socket通信方式进行传输的,那么从底层拿到数据以后,通过mct方式进行传输,然后抛给hal层。

kernel层

代码位置:kernel/drivers/media/platform/msm/camera_v2/

@sz-ubuntu-01:~/work/qcom$ ls 
kernel/drivers/media/platform/msm/camera_v2/
camera 
common 
fd 
isp 
ispif 
jpeg_10 
jpeg_dma 
Kconfig 
Makefile 
msm_buf_mgr 
msm.c 
msm.h 
msm_sd.h 
msm_vb2 
pproc 
sensor

编译调试:make -j16 使用正常的编译kernel的命令即可,不同平台对于kernel的编译可能稍微有差异。

代码功能:Kernel下面底层的kernel逻辑代码功能模块都在这里。Sensor驱动的probe和AF flash驱动都在这里实现。

小结

上面是对camera模块框架的初步分析和认识,大家对整个框架先有个初步的了解,随着学习的深入,我们会逐步的深入到某一层进行剖析,结合实际的开发,让大家知道实际开发中需要做的工作。并对学习的知识点进行深入的理解和思考,那么会随着水平的提高,重构出性能更加完美的架构和系统,期待这个指引能够激发你们的学习热情,并且成为未来影像技术的专家。

参考:

参考的文章是我很久之前写的,如果当时我是在MTK平台上分析的,希望对大家有所帮助

https://linus.blog.csdn.net/article/details/49943289

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab可以连接阻抗分析仪么,阻抗分析仪的工作原理与测试方法

阻抗分析仪和LCR表是非常通用的测量器件的电子仪器。根据阻抗范围和频率范围的不同&#xff0c;有一系列不同原理的仪器来满足测试要求&#xff0c;图1是不同阻抗范围和不同频率范围的阻抗测量方法。图1 阻抗测量方法图2是自动平衡电桥法的原理框图。通过精确测量加载到被测件D…

项目管理中的沟通管理(转)

集成项目管理中的沟通管理 摘要&#xff1a;本文从沟通关系、方式及容易出现的问题阐述如何进行项目的沟通管理&#xff0c;并通过示例展现一个普通的集成类项目中的沟通方法。 关键词&#xff1a;沟通管理 系统集成 项目管理就是指把各种系统、方法和人员结合在一起&#xff0…

分享几个有意思的视频

最近微信加我的好友有点多&#xff0c;然后问问题的也不少&#xff0c;有的问题我不知道&#xff0c;有的问题我觉得百度一下应该很多答案&#xff0c;有的问题我觉得我可以知道&#xff0c;但是需要自己去寻找答案&#xff0c;也需要花费我一些时间&#xff0c;我有时候非常不…

python判断对象是否实例化_Python判断对象是否相等及eq函数的讲解

摘要 什么是python对象的标识 python对象相等的判断 自定义python对象相等的条件 python对象的标识 python对象标识就是python对象自身的要素&#xff0c;python对象主要有3要素&#xff1a; id:相当于对象在内存中的地址&#xff0c;相当于c的指针&#xff0c;可以用id(对象)来…

php+redis+设置前缀,spring使用Redis自定义前缀后缀名(去掉SimpleKey []+自定义)

标签&#xff1a;spring中自动加上 SimpleKey [] 解决方案一、自定义后缀名1、定义类实现KeyGenerator接口MyKeyGeneratorpackage com.wbg.springRedis.service.impl;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.stereotype.Compon…

gravity 时序图绘制,改

gmt gmtset FONT_TITLE 24,37gmt gmtset MAP_GRID_PEN_PRIMARY 0.5p,bluegmt gmtset FORMAT_DATE_IN yyyy-mm-dd FORMAT_DATE_MAP yyyy-mm set R-R2008-01-01\T/2017-05-31\T/-100/80set J-JX9i/6irem x轴格网间隔密度为3个月&#xff1f;gmt psbasemap %R% %J% -Bxa12O -Bya2…

php wdatepicker,WdatePicker时间控件的使用

1&#xff0c;引入js文件2&#xff0c;js代码function createTime(){WdatePicker({dateFmt:yyyy-MM-dd,minDate:2010-10-01,maxDate:2012-10-01});}3&#xff0c;html代码4&#xff0c;介绍这是最基本的使用方法&#xff0c;如需要增加或减少内容&#xff0c;可通过改变WdatePi…

python列表如何修改_如何在python中更改列表的字典中的值

for x in range(0, 5): ohlc_list[x] [open , high , low, close] 这并没有按照您的想法做.它为相同的4个列表创建5个引用,并将这些引用保留在不同的键下. 这可以用以下循环显示&#xff1a; for value in ohlc_list.values(): print([id(inner_list) for inner_list in value…

北京的林书豪,像一把小李飞刀

从《我要打篮球》节目开始&#xff0c;就一直在关注书豪的比赛&#xff0c;我喜欢书豪&#xff0c;书豪选择来CBA打球&#xff0c;也满足了很多球迷的愿望&#xff0c;近距离感受球星的那种状态&#xff0c;今天晚上&#xff0c;北京跟青岛的比赛&#xff0c;我是一分钟没有拉下…

20170706xlVBA城中村改造汇总

Public Sub GatherDataPicker()Application.ScreenUpdating FalseApplication.DisplayAlerts FalseApplication.Calculation xlCalculationManualApplication.StatusBar ">>>>>>>>程序正在运行>>>>>>>>"On Erro…

php 循环队列,队列和循环队列-php数组

//实现基本队列class Queues{private $head;private $tail;private $cnt; //数组大小private $array [];public function __construct($n 5){$this->cnt $n;$this->head 0;$this->tail 0;}//数组实现队列public function basisEnQueue($val){//队列已满if ($this…

I2C和SPI注定要打一架

最近微信群里好几天聊到I2C&#xff0c;既然说到了I2C&#xff0c;那就有必要说SPI&#xff0c;那就一起说了算了&#xff0c;大家有更好见解的&#xff0c;留言回复下&#xff0c;让更多的人知道你的观点。整理与网络&#xff0c;侵删I2C和SPI应该要打一架&#xff1f;现今&am…

python opencv创建图像_OpenCV-Python 展示图像(1)

可以用 cv.imshow(winName, imgMat) 函数在窗口中显示图像。窗口大小会随着图像大小自动调整。 第一个参数是字符串类型&#xff0c;表示窗口名称&#xff0c;可以用不同的窗口名称来创建多个窗口。 第二个参数是要显示的图像数据。 cv.imshow(tmp_window, img) cv.waitKey(0) …

第1章 ssh命令和SSH服务详解

基础服务类系列文章&#xff1a;http://www.cnblogs.com/f-ck-need-u/p/7048359.html 本文对SSH连接验证机制进行了非常详细的分析&#xff0c;还详细介绍了ssh客户端工具的各种功能&#xff0c;相信能让各位对ssh有个全方位较透彻的了解&#xff0c;而不是仅仅只会用它来连接远…

漫画:什么是区块链?

两年前&#xff0c;小灰以前写过一期关于区块链的漫画&#xff0c;可能很多新来的小伙伴还没有看过。最近趁着区块链重新成为热门话题&#xff0c;小灰把这篇漫画稍作修改&#xff0c;再次推送给大家。什么是区块链&#xff1f;区块链&#xff0c;英文 Blockchain&#xff0c;本…

php外卖系统源码单店,网上订餐系统 v3.1 单店版

系统以简单实用为主&#xff0c;系统的每一个功能都是实用的&#xff0c;像以很多网站为了好看把页面填的满满的&#xff0c;用户进来不知从何处操作起&#xff0c;我们的系统&#xff0c;一切了为了用户&#xff0c;为了网站经营者。我们所做的不仅仅是一个店铺展示系统&#…

python爬酷狗音乐_良心推荐!一个Python高手必读的库,真香!

菜鸟进阶高手&#xff0c;需要内外的修炼&#xff0c;外练招式&#xff0c;内修心法。招式有很多比如基本的函数&#xff0c;类&#xff0c;文件&#xff0c;模块&#xff0c;到并发&#xff0c;数据库的使用&#xff0c;再到一些框架的使用无论是爬虫的西瓜皮框架&#xff0c;…

web容器(02):tomcat配置监控

1、tomcat的目录结构 tomcat一般给Java应用的&#xff0c;apache一般给php应用的 bin文件夹(启动文件)&#xff1a; 配置监听之类的内容是在catalina.sh中加 conf文件夹(配置文件)&#xff1a; 2、server.xml配置文件说明 <Server port"8005" shutdown"SHUTD…

一般一个前端项目完成需要多久_制作分销小程序最快要多久

小猪V5分销小程序小编了解到&#xff0c;微商城及微分销搭建成为当下热门话题&#xff0c;下面从多个方面来谈谈快速制作电商小程序最快要多久。微信为小程序开放了超过60多个入口&#xff0c;比如有微信群聊入口、微信聊天主界面下拉、App分享信息卡片、发现栏小程序主入口、发…

apache php的日志在哪里,PHP在哪里存储错误日志? (php5,apache,fastcgi,cpanel)...

我在共享主机上&#xff0c;并由fastcgi运行Cpanel&#xff0c;Apache&#xff0c;PHP。 PHP在哪里存储错误日志&#xff1f;还有什么其他方法可以在共享主机环境中找到错误日志&#xff0c;而不必遍历整个站点结构来查找error_log文件&#xff1f;我可以访问php.ini (我使用的…