安卓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…

分享几个有意思的视频

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

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…

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

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

I2C和SPI注定要打一架

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

第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分享信息卡片、发现栏小程序主入口、发…

那些有趣的电子漫画合集

素材来源&#xff1a;芯片之家同事调电路连续通宵两个晚上&#xff0c;结果。。。坐着我的芯片靠椅&#xff0c;剪个帅帅的光头。更多电子漫画合集&#xff1a;转自&#xff1a;长按识别图中二维码关注—————END—————扫码或长按关注回复「加群」进入技术群聊

vim nerdtree 标签_7款vim插件

作者&#xff1a;QvQ链接&#xff1a;https://zhuanlan.zhihu.com/p/145793963来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09…

单片机怎么学?

—————END—————扫码或长按关注回复「 加群 」进入技术群聊

tableau linux无网络安装_四十二、Linux网络管理,软件安装,进程管理总结

「Author&#xff1a; Runsen」1、⽹络管理1.1 网络状态查看在Linux中经常使用ifconfig&#xff0c;route和netstat查看网络状态&#xff0c;它们就是. net-tools工具&#xff0c;下面我来使用下。我就说下ifconfig和route在我们的linux中有很多网卡接口&#xff0c;比如eth0第…

C语言,环形队列

什么是环形队列&#xff1f;环形缓冲区是一个非常典型的数据结构&#xff0c;这种数据结构符合生产者&#xff0c;消费者模型&#xff0c;可以理解它是一个水坑&#xff0c;生产者不断的往里面灌水&#xff0c;消费者就不断的从里面取出水。那就可能会有人问&#xff0c;既然需…

音频几个重要的参数

音频的采样率是什么&#xff1f;如果把音频当成一条曲线&#xff0c;那么采样率就是一秒钟从这个曲线里面提取样本的次数。8,000 Hz - 电话所用采样率, 对于人的说话已经足够11,025 Hz - AM调幅广播所用采样率22,050 Hz和24,000 Hz - FM调频广播所用采样率32,000 Hz - miniDV 数…

ps绿化工具_绿化消防车价位

绿化消防车价位绿化消防车价位 4吨东风消防洒水车&#xff0c;又称为多功能消防车&#xff0c;它是在东风原装二类底盘基础上加消防泵、消防炮、洒水炮及洒水车的前冲后洒、侧喷及水罐体组成&#xff0c;既能参加救火灭火功能&#xff0c;水炮的有效射程≥45米&#xff0c;每秒…

今天星期六

突然之间就到周六了&#xff0c;我记得上周的时候&#xff0c;我一个朋友说&#xff0c;这周我们要开个课程&#xff0c;课程的名字就叫做&#xff0c;「如何让你拥有快乐的今天」&#xff0c;然而&#xff0c;上周已经过去&#xff0c;嗖的一声&#xff0c;已经到了这周了&…

C语言验证大小端的几个方法

大小端的问题在很多面试笔试中都会遇到&#xff0c;最直接的考察是&#xff0c;笔试的时候&#xff0c;让你写一个代码&#xff0c;如何确定当前系统是大端还是小端的。什么是大端和小端呢&#xff1f;大端&#xff1a; 高位字节排放在内存的低地址端&#xff0c;低位字节排放在…