platform: RK3399
OS: Android 7.1
kernel:4.4
参考:
1. KrisFei https://blog.csdn.net/kris_fei/article/details/52451409
2. Kiazhu https://blog.csdn.net/kiazhu/article/details/84652749
3. https://source.android.google.cn/devices/camera?hl=en
4.https://www.cnblogs.com/blogs-of-lxl/p/10981303.html
概述
Android Camera Hal 是android framework和kernel联系的重要通道。该部分一般由厂商实现并封装自己的算法或者业务逻辑,进一步抽象出内核设备驱动的各项功能,并通过google实现的统一接口供android framework进行调用。
下面是旧版的Camera框架图(适用于android 8.0以下,android 8.0以上请使用新的camera hal组件及框架)
![dd6f9411d811ca87a49796af5c132368.png](https://i-blog.csdnimg.cn/blog_migrate/a6e77b0865ce8cf65cd9e9024adebed2.jpeg)
应用框架
应用代码位于应用框架级别,它利用 android.hardware.Camera
API 与相机硬件进行交互。在内部,此代码会调用相应的 JNI 粘合类,以访问与相机互动的原生代码。
JNI
与 android.hardware.Camera
关联的 JNI 代码位于 frameworks/base/core/jni/android_hardware_Camera.cpp
中。此代码会调用较低级别的原生代码以获取对实体相机的访问权限,并返回用于在框架级别创建 android.hardware.Camera
对象的数据。
原生框架
在 frameworks/av/camera/Camera.cpp
中定义的原生框架可提供相当于 android.hardware.Camera
类的原生类。此类会调用 IPC binder 代理,以获取对相机服务的访问权限。
Binder IPC 代理
IPC binder 代理用于促进跨越进程边界的通信。调用相机服务的 3 个相机 binder 类位于 frameworks/av/camera
目录中。 ICameraService
是相机服务的接口;ICamera
是已打开的特定相机设备的接口;ICameraClient
是返回到应用框架的设备接口。
相机服务
位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp
下的相机服务是与 HAL 进行互动的实际代码。
HAL
硬件抽象层定义了由相机服务调用、且您必须实现以确保相机硬件正常运行的标准接口。
内核驱动程序
相机的驱动程序可与实际相机硬件以及您的 HAL 实现进行互动。相机和驱动程序必须支持 YV12 和 NV21 图片格式,以便在显示和视频录制时支持预览相机图片。
Android Camera HAL简介
HAL1简介
功能调用简图
![40f51352e05fd00da9051a49e8d76100.png](https://i-blog.csdnimg.cn/blog_migrate/2780aa3a91a6ddecc84175925f6fea1b.jpeg)
Camera hal1中的camera_module_t 接口
camera_module_t HAL_MODULE_INFO_SYM = {
common: {
tag: HARDWARE_MODULE_TAG,
version_major: ((CONFIG_CAMERAHAL_VERSION&0xffff00)>>16),
version_minor: CONFIG_CAMERAHAL_VERSION&0xff,
id: CAMERA_HARDWARE_MODULE_ID,
name: CAMERA_MODULE_NAME,
author: "RockChip",
methods: &camera_module_methods,
dso: NULL, /* remove compilation warnings */
reserved: {
0}, /* remove compilation warnings */
},
get_number_of_cameras: camera_get_number_of_cameras,
get_camera_info: camera_get_camera_info,
set_callbacks:NULL,
get_vendor_tag_ops:NULL,
}
HAL3简介
Camera API2/HAL3架构下使用了全新的CameraMetadata结构取代了之前的SetParameter/Paramters等操作,实现了Java到native到HAL3的参数传递。引入了管道的概念将安卓设备和摄像头之间联系起来,系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata,这一切建立在一个叫作 CameraCaptureSession 的会话中。
功能调用简图
![087445e7f26d17c305a52878c38c7654.png](https://i-blog.csdnimg.cn/blog_migrate/4a1b6e56397c9fa514d67d387e08e510.jpeg)
以最常见的android.control Section为例,下图描述了Camera Metadata对不同section以及相应section下不同tag的布局图
![385a9b16e9bdb2c77bbea0e9e885aaa0.png](https://i-blog.csdnimg.cn/blog_migrate/76dbd2f6d49025726b53f09386938f62.jpeg)