Android之摄像头框架简介

Android Camera HAL

每个Soc厂家的HAL实现不一样,以前主要基于V4L2,openMAX等,如TI等,后面随着Android相机功能越来越多,运用越来越复杂,都形成了自己独有的一套架构,比如高通Camx架构,MTK的MtkCam3架构等

camera_hal

Camx架构:

Camx

MtkCam3:

MtkCam3

新版HAL3

从 Android 8.0 开始,相机 HAL 实现必须使用 HIDL API,不支持使用旧版接口。

新相机 HAL 的 HIDL 接口在 hardware/interfaces/camera 中定义

HIDL 的目标是,可以在无需重新构建 HAL 的情况下替换框架。HAL 将由供应商或 SOC 制造商构建,并放置在设备的 /vendor 分区中,这样一来,就可以在框架自己的分区中通过 OTA 替换框架,而无需重新编译 HAL。
从 Android 10 开始,HIDL 已废弃,Android 将在所有位置改用 AIDL

ape_fwk_camera2

  • 应用框架
    应用代码位于应用框架级别,它使用 Camera 2 API 与相机硬件进行互动。在内部,此代码会调用相应的 Binder 接口,以访问与相机互动的原生代码。
  • Native框架
    此框架位于 frameworks/av/ 中,并提供相当于 CameraDeviceCameraCaptureSession 类的原生类。另请参阅 NDK camera2 参考。
  • 相机服务
    位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp 下的相机服务是与 HAL 进行互动的实际代码。
  • HAL
    硬件抽象层定义了由相机服务调用、且您必须实现以确保相机硬件正常运行的标准接口。
  • 内核驱动程序
    相机的驱动程序可与实际相机硬件以及您的 HAL 实现进行互动。

Android USB Camera

Android下面的USB摄像头和其系统自带的摄像头实现是有一定差别的。

UVCCamera库

基于 libuvc 开发 https://github.com/libuvc/libuvc
libuvc 是一个跨平台开发库,基于 libusb,功能包括 UVC 设备识别与控制,视频流传输,视频流格式转换等

https://github.com/saki4510t/UVCCamera
jni/libjpeg, jni/libusb and jin/libuvc

Android 官方推出的 ExternalCamera

随着 Android P (9.0)版本升级,新增了 External USB Cameras 这个功能,默认情况该功能是关闭的,一些 HAL 组件不会编译到 ROM 中,需要打开更新 ROM 才行。另外该功能还依赖于 android.hardware.usb.host 以及 Linux kernel 打开 UVC 驱动支持。

Android P 上提供了对 usb camera 设备的支持(External USB Cameras ) ,提供了完整 HALv3 实现并接入到 CameraProviderManager;可以让任何三方相机应用轻松调用到外接 USB 摄像头功能,使用方法跟内置相机几无差别,都是透过 Android Camera API2 调用。

参考