Camera 框架分析
Camera
子系统是Android
系统中比较复杂的子系统之一。在系统集成方面,Camera
子系统除了实现camera
功能外其作为多媒体实现的基础模块,与声音控制系统(Audio
),视频编解码系统(Video Codec
),显示系统(Display
),存储系统(Storage
)以及输入输出系统(I/O
)都有密切的联系。在Camera
模块内部,Camera
系统也不仅仅是实现视频数据获取及存储。为了达到良好的视频(照片)质量。Camera
系统中往往包含大量的图像处理算法程序库,根据不同的需要这些算法库可以放在不同的处理层。
一、Camera子系统层次结构
Camera
作为一个子系统,提供了取景器、视频录制和拍摄照片等功能,并且提供各种控制类借口,如Java
层的接口和本地接口。其中Java
框架中的camera
类实行了Java
层相机接口,为拍照和扫描等功能业务使用。本地接口可以给本地程序调用,如存储、编解码、视频通话、显示等。基本层次结构如下图:
二、Camera 子系统系统结构
Camera
子系统从下往上包括了驱动层、框架层和APP
层。系统结构如图所示:
- 应用层:
LenovoCamera
、其他美颜相机等,对相机做一些基本初始化,之后调用setPreviewwindow
,然后调用到framework
层的方法。 - 框架层:由
camera Java
层接口、Java
本地调用接口(JNI
)、camera
本地框架(clien
t端)、camera
本地服务及camera HAL
组成。
Camera Java
层向应用层接口提供的类为android.hardware.Camera
,对应的源代码文件为:camera.java
,此类有些方法通过JNI
调用本地框架中的代码实现。Java
本地调用接口(JNI
),代码路径:frameworks/base/core/jni/android_hardware_Camera.cpp
,这一部分被编译成为libandroid_runtime.so
,它不做任何处理相当于一个中间站,转去到下一层camera
本地框架(client
端)中实现camera
本地框架(client
端),代码路径:frameworks/av/camera/Camera.cpp
,这一部分内容被编译成库libcamera_client.so
,同样这一部分可以理解为一个中转站,通过binder
机制调用与camera
本地服务进行通讯。camera
本地服务,代码路径:frameworks/av/services/camera/libcamearservice/CameraService.cpp
,这一部分被编译成libcameraservice.so
, 本部分配合底层相关的硬件驱动框架和编解码库实现一个具体的camera
。camera HAL
,硬件抽象层,代码路径:frameworks/av/services/camera/libcamearservice/device1/CameraHardwareInterface.h
,基于此接口完成的HAL来实现camera
数据传输及功能控制。
- 驱动层,基于
Linux
的video for Linux
视频驱动框架即(V4L2
),通过V4L2
接口实现数据采集、格式转换、大小缩放、数据传输的功能。