本文介绍android camera hal开发概述部分,文章整理并翻译自:https://source.android.google.cn/devices/camera
。
android 的camera硬件抽象层 (hal) 可将 camera2 中较高层级的camera框架 api 连接到底层的camera驱动程序和硬件。camera子系统包括camera管道组件的实现,而camera hal 可提供用于实现您的这些组件版本的接口。
如果您要在搭载 android 8.0 及更高版本的设备上实现camera hal,则必须使用 hidl 接口。
更多资源:
资源 | 描述 |
---|---|
在线课程 | |
知识星球 | 星球名称:深入浅出android camera 星球id: 17296815 |
极客笔记圈 |
camera 架构
下列图表和列表说明了 camera hal 组件。
camera应用框架
camera应用代码位于应用框架级别,它使用 camera2 api 与camera硬件进行互动。在内部,此代码会调用相应的 binder 接口,以访问与camera互动的原生代码。
camera aidl
与 cameraservice
关联的 binder 接口可在 frameworks/av/camera/aidl/android/hardware
中找到。生成的代码会调用较低级别的原生代码以获取对实体camera的访问权限,并返回用于在框架级别创建 cameradevice
并最终创建 cameracapturesession
对象的数据。
camera native 框架
此框架位于 frameworks/av/
中,并提供相当于 cameradevice
和 cameracapturesession
类的原生类。另请参阅 。
camera binder ipc 接口
ipc binder 接口用于实现跨越进程边界的通信。调用相机服务的若干个相机 binder 类位于 frameworks/av/camera/camera/aidl/android/hardware
目录中。
icameraservice
是相机服务的接口;icameradeviceuser
是已打开的特定相机设备的接口;icameraservicelistener
和icameradevicecallbacks
分别是对应用框架的cameraservice
和cameradevice
回调。
cameraservice
位于 frameworks/av/services/camera/libcameraservice/cameraservice.cpp
下的相机服务是与 hal 进行互动的实际代码。
camera hal
硬件抽象层定义了由相机服务调用、且您必须实现以确保相机硬件正常运行的标准接口。
实现camera hal
hal 位于相机驱动程序和更高级别的 android 框架之间,它定义您必须实现的接口,以便应用可以正确地操作相机硬件。相机 hal 的 hidl 接口在 hardware/interfaces/camera 中定义。
典型的绑定式 hal 必须实现以下 hidl 接口:
icameraprovider
:用于枚举单个设备并管理其状态。icameradevice
:相机设备接口。icameradevicesession
:活跃的相机设备会话接口。
参考 hidl 实现适用于 cameraprovider.cpp
、cameradevice.cpp
和 cameradevicesession.cpp
。该实现封装了仍在使用旧版 api 的旧 hal。从 android 8.0 开始,相机 hal 实现必须使用 hidl api;不支持使用旧版接口。
旧版camera hal 组件
此部分介绍了旧版 hal 组件的架构以及如何实现 hal。搭载 android 8.0 或更高版本的设备上的相机 hal 实现必须改用 hidl api(如上所述)。
camera 架构(旧版)
下列图表和列表说明了旧版相机 hal 组件。
camera 应用框架
应用代码位于应用框架级别,它使用 android.hardware.camera
api 与相机硬件进行互动。在内部,此代码会调用相应的 jni 粘合类,以访问与相机互动的原生代码。
camera jni
与 android.hardware.camera
相关联的 jni 代码位于 frameworks/base/core/jni/android_hardware_camera.cpp
中。此代码会调用较低级别的原生代码以获取对实体相机的访问权限,并返回用于在框架级别创建 android.hardware.camera
对象的数据。
camera native框架
在 frameworks/av/camera/camera.cpp
中定义的原生框架可提供相当于 android.hardware.camera
类的原生类。此类会调用 ipc binder 代理,以获取对相机服务的访问权限。
camera binder ipc 代理
ipc binder 代理用于促进跨越进程边界的通信。调用相机服务的 3 个相机 binder 类位于 frameworks/av/camera
目录中。icameraservice
是相机服务的接口,icamera
是已打开的特定相机设备的接口,icameraclient
是返回到应用框架的设备接口。
cameraservice
位于 frameworks/av/services/camera/libcameraservice/cameraservice.cpp
下的相机服务是与 hal 进行互动的实际代码。
camera hal
硬件抽象层定义了由相机服务调用、且您必须实现以确保相机硬件正常运行的标准接口。
内核驱动程序
相机的驱动程序可与实际相机硬件以及您的 hal 实现进行互动。相机和驱动程序必须支持 yv12 和 nv21 图像格式,以便在显示和视频录制时支持预览相机图像。
实现 camera hal(旧版)
hal 位于相机驱动程序和更高级别的 android 框架之间,它定义您必须实现的接口,以便应用可以正确地操作相机硬件。hal 接口在 hardware/libhardware/include/hardware/camera.h
和 hardware/libhardware/include/hardware/camera_common.h
头文件中定义。
camera_common.h
定义 camera_module
,这是一个标准结构,可用于获取有关相机的一般信息,例如相机 id 和所有相机通用的属性(例如,相机是前置还是后置)。
camera.h
包含与 android.hardware.camera
对应的代码。此头文件会声明一个 camera_device
结构,该结构又反过来包含一个带函数指针(可实现 hal 接口)的 camera_device_ops
结构。如需查看有关开发者可以设置的相机参数的文档,请参阅 frameworks/av/include/camera/cameraparameters.h
。通过 hal 中的 int (*set_parameters)(struct camera_device *, const char *parms)
来设置这些参数以及指向的函数。
如需查看 hal 实现的示例,请参阅 hardware/ti/omap4xxx/camera
中的 galaxy nexus hal 实现。
配置共享库
设置 android 构建系统,以将 hal 实现正确打包到共享库中,并通过创建 android.mk
文件将其复制到相应位置:
- 创建一个
device/
目录以包含您的库的源文件。/ /camera -
创建一个
android.mk
文件以构建共享库。确保 makefile 包含以下行:local_module := camera.
local_module_relative_path := hw 您的库必须命名为
camera.
(自动附加.so
),以便 android 可以正确加载库。如需查看示例,请参阅hardware/ti/omap4xxx/android.mk
中的 galaxy nexus 相机的 makefile。 -
使用设备的 makefile 复制
frameworks/native/data/etc
目录中的必要功能 xml 文件,以指定设备具有相机功能。例如,如需指定设备具有相机闪光灯并可自动对焦,请在设备的
makefile 中添加以下行:/ / /device.mk product_copy_files := \ ... product_copy_files = \ frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
如需查看设备 makefile 的示例,请参阅
device/samsung/tuna/device.mk
。 -
在
device/
和/ /media_profiles.xml device/
xml 文件中声明相机的媒体编解码器、格式和分辨率功能。/ /media_codecs.xml -
在设备的
device/
makefile 中添加以下行,以将/ /device.mk media_profiles.xml
和media_codecs.xml
文件复制到相应位置:# media config xml file product_copy_files = \
/ / /media_profiles.xml:system/etc/media_profiles.xml # media codec config xml file product_copy_files = \ / / /media_codecs.xml:system/etc/media_codecs.xml - 如需将相机应用包含在设备的系统映像中,请在设备的
device/
makefile 的/ /device.mk product_packages
变量中指定相机应用:product_packages := \ gallery2 \ ...