前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android FWK-HAL相机框架简介

Android FWK-HAL相机框架简介

作者头像
Abalone
发布2022-07-14 14:35:54
1.3K0
发布2022-07-14 14:35:54
举报
文章被收录于专栏:影像技术栈影像技术栈

HAL组件

HAL
HAL

HAL3主要接口如下: ICameraService 是相机服务的接口 ICameraDeviceUser 是已打开的特定相机设备的接口 ICameraDeviceSession活跃的相机设备会话接口 ICameraProvider用于枚举单个设备并管理其状态 HAL1接口如下: ICameraService 是相机服务的接口 ICamera 是已打开的特定相机设备的接口 ICameraClient 是返回到应用框架的设备接口

本文介绍Android Camera HAL开发概述部分,文章整理并翻译自:https://source.android.google.cn/devices/camera

Android 的Camera硬件抽象层 (HAL) 可将 Camera2 中较高层级的Camera框架 API 连接到底层的Camera驱动程序和硬件。Camera子系统包括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 类的原生类。另请参阅 NDK camera2 参考

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.cppCameraDevice.cpp 和 CameraDeviceSession.cpp。该实现封装了仍在使用旧版 API 的旧 HAL。从 Android 8.0 开始,相机 HAL 实现必须使用 HIDL API;不支持使用旧版接口。

旧版Camera HAL 组件

此部分介绍了旧版 HAL 组件的架构以及如何实现 HAL。搭载 Android 8.0 或更高版本的设备上的相机 HAL 实现必须改用 HIDL API(如上所述)。

Camera 架构(旧版)

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 实现。

下列图表和列表说明了旧版相机 HAL 组件。

stickPicture.png
stickPicture.png

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 是返回到应用框架的设备接口。

内核驱动程序

相机的驱动程序可与实际相机硬件以及您的 HAL 实现进行互动。相机和驱动程序必须支持 YV12 和 NV21 图像格式,以便在显示和视频录制时支持预览相机图像。

配置共享库

设置 Android 构建系统,以将 HAL 实现正确打包到共享库中,并通过创建 Android.mk 文件将其复制到相应位置:

  1. 创建一个 device///camera 目录以包含您的库的源文件。
  2. 创建一个 Android.mk 文件以构建共享库。确保 makefile 包含以下行:
代码语言:javascript
复制
LOCAL_MODULE := camera.
LOCAL_MODULE_RELATIVE_PATH := hw

您的库必须命名为 camera.(自动附加 .so),以便 Android 可以正确加载库。如需查看示例,请参阅 hardware/ti/omap4xxx/Android.mk 中的 Galaxy Nexus 相机的 makefile。 3. 使用设备的 makefile 复制 frameworks/native/data/etc目录中的必要功能 XML 文件,以指定设备具有相机功能。例如,如需指定设备具有相机闪光灯并可自动对焦,请在设备的 ///device.mk 中添加以下行:

代码语言:javascript
复制
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。

  1. 在 device///media_profiles.xml 和 device///media_codecs.xml XML 文件中声明相机的媒体编解码器、格式和分辨率功能。
  2. 在设备的 device///device.mk中添加以下行,以将 media_profiles.xml 和 media_codecs.xml文件复制到相应位置:
代码语言:javascript
复制
# 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
  1. 如需将相机应用包含在设备的系统映像中,请在设备的 device///device.mk的 PRODUCT_PACKAGES 变量中指定相机应用:
代码语言:javascript
复制
PRODUCT_PACKAGES := \
Gallery2 \
...

点击显/隐内容

内容测试

点击显/隐内容

内容测试

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HAL组件
  • Camera应用框架
  • Camera AIDL
  • Camera Native 框架
  • Camera binder IPC 接口
  • CameraService
  • Camera HAL
    • 实现Camera HAL
      • 旧版Camera HAL 组件
        • Camera 架构(旧版)
        • Camera 应用框架
        • Camera JNI
        • Camera Native框架
        • Camera binder IPC 代理
        • 内核驱动程序
        • 配置共享库
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档