首先,对Camera架构有个大概的认识。 java
Android的Camera架构基本由Camera APP, Application Framework(Camera.java), Camera JNI, MediaFramework(CameraService) , Camera HAL, Camera driver等部分构成。 android
其中CameraService以上部分都基本和硬件没有关系,Camera HAL如下则和硬件关系比较密切。 架构
总体来看,CameraService的架构属于Client/Server架构。Camera APP属于Client端, Camera Service属于Server端。 Camera App和Camera Service经过IPC调用(Binder传输数据), SurfaceFinger和CameraService也是经过IPC调用来实现的。CameraService是运行在MediaServer进程的。SurfaceFlinger也是一个单独进程。 post
2 Camera.java要点
spa
Camera.java提供了操做Camera的几大功能: 翻译
1.open 和 release功能。 对象
2.操纵Camera的参数的功能。 进程
3.Preview功能: 内存
a.将Preview的显示到屏幕上或者是SurfaceTexture上。 ci
b.获取Camera preview Frame的callstack
4.Capture
1.onShutter, JPEG, RAW, " PostView"
5. Lock 和Unlock功能
6. Focus,Zoom及FaceDetection功能
几个辅助小类:
Camera Parameter
camera parameter的设置,包含white balance, color effect, exposure, scene mode, anti-banding, focus mode, preview size, picture size。
Camera.CameraInfo
每一个摄像头的前置后置信息,Camera 照片的orientation
Camera.Size
Camera 照片的高和宽
Camera.Face
face-id, 左眼,有眼,嘴的坐标及超出的区域
Camera.Area
高和宽,Auto Focus, Auto Exposure, Auto White Balance的区域(3A)
Camera JNI的要点
1.建立一个持久的Context用于传递Callback从native到Java。
2.持有Java Camera, Face及Area的引用。
3.若是APP请求传递Preview Frame的Copy, 完成 native到Java的 Buffer copy。
4. 从Java Memory Heap分配JPEG照片的内存。
CameraService的要点
1.管理 Camera硬件资源
2.运行在MediaServer进程中
3.是一个SharedLibrary libCameraService.so
主要功能:
a android.permissions.Camera的检查
b 确保只有一个Client 连接到一个Camera硬件对象
c 确保进程链接到一个Camera硬件对象
d 返回Callback给APP层
e 经过Binder访问
f 可用的摄像头个数
g Camera摄像头信息细节
本文基本属于对exposing the android camera stack一文的部分翻译,因为本文是后续文章的基础。所以载于此。在这里感谢原文做者的PPT,总结架构确实挺好。
英文原版见:https://thenewcircle.com/s/post/1268/Exposing_the_Android_Camera_Stack.pdf