EVS架构的应用实现在Framework(C )层,而Camera的应用实现则是在应用层。

由于整体层次偏低,使得EVS架构具有更快的响应速度。在某些要求快速启动的场景下(如快速倒车等),EVS架构具有天然的优势。当然,EVS的缺点也很明显,由于层次较低,导致无法充分利用Android系统的便利性,导致基于EVS架构的应用在实现复杂的UI界面上会比较头疼,同时EVS架构也无法支撑更为复杂的摄像头应用,如闪光灯、参数调节等特性EVS架构是不支持的。这就是两种摄像头应用架构的不同。

EVS

Android 的汽车 HIDL 硬件抽象层 (HAL) 可用于在 Android 启动过程的初期拍摄并显示图像,且可在系统的整个生命周期内持续运行。HAL 包含外景系统 (EVS) 堆栈,且通常用于在搭载基于 Android 的车载信息娱乐 (IVI) 系统的汽车上为后视摄像头和环绕视图显示提供支持。EVS 还支持在用户应用中实现高级功能。

Android 还包含一个 EVS 专用的拍摄和显示驱动程序接口(位于 /hardware/interfaces/automotive/evs/1.0)。虽然可以基于现有 Android 相机和显示服务构建后视相机应用,但这样的应用可能会在 Android 启动过程中运行过于迟缓。使用专用 HAL 可实现简化的接口,并清楚地说明原始设备制造商 (OEM) 需要实现什么才能支持 EVS 堆栈。

adas模块由fcw和ldw功能组成(EVS架构与Camera架构的整体区别)(1)

EVS系统组件

EVS 应用

可作为参考实现的 C EVS 示例应用 (/packages/services/Car/evs/app)。该应用负责从 EVS 管理器请求视频帧,并将用于显示的已完成的帧发送回 EVS 管理器。EVS 和汽车服务可供使用后,它便立即由 init 启动(设置目标为在开机两 (2) 秒内启动)。原始设备制造商 (OEM) 可视需要修改或替换 EVS 应用。

EVS 管理器

EVS 管理器 (/packages/services/Car/evs/manager) 可提供 EVS 应用所需的构建块,以实现从简单的后视摄像头显示到 6DOF 多摄像头渲染的任何功能。它的接口通过 HIDL 呈现,并且能够接受多个并发客户端。其他应用和服务(特别是汽车服务)可以查询 EVS 管理器状态,以了解 EVS 系统何时处于活动状态。

EVS HIDL 接口

在 EVS 系统中,相机和显示元素均由 android.hardware.automotive.evs 软件包定义。用于执行接口的示例实现(生成合成测试图像并验证图像进行往返的过程)在 /hardware/interfaces/automotive/evs/1.0/default 中提供。

原始设备制造商 (OEM) 负责实现由 /hardware/interfaces/automotive/evs 中的 .hal 文件表示的 API。这种实现负责从物理相机配置和收集数据,并通过 Gralloc 可识别的共享内存缓冲区传送这些数据。实现的显示端负责提供可由应用填充(通常通过 EGL 渲染的方式)的共享内存缓冲区,并优先呈现已完成的帧(在任何可能会显示在物理显示设备上的其他内容之前)。EVS 接口的供应商实现可以存储在 /vendor/… /device/… 或 hardware/…(例如 /hardware/[vendor]/[platform]/evs)下。

内核驱动程序

支持 EVS 堆栈的设备需要使用内核驱动程序。原始设备制造商 (OEM) 无需创建新驱动程序,他们可以选择通过现有相机和/或显示硬件驱动程序来支持 EVS 所需的功能。重复使用驱动程序可能会有好处,对于图像呈现可能需要与其他活动线程协调的显示驱动程序来说尤其如此。Android 8.0 包含一个基于 v4l2 的示例驱动程序(在 packages/services/Car/evs/sampleDriver 中),该驱动程序依靠内核实现 v4l2 支持,并依靠 SurfaceFlinger 呈现输出图像。

Camera HAL

adas模块由fcw和ldw功能组成(EVS架构与Camera架构的整体区别)(2)

camera hal

针对这个架构图,我们简单理解一下:

1)Java Applicaiton:应用层上是各个独立的App,无论是Activity也好还是Service也好,向下需要接入CameraManager,通过CameraManager接入CameraService。

2)Framework(Java):这一层就是CameraManager整体实现的地方,源码路径位于framworks/base/core/java/android/hardware/camera2目录下。源码中比较重要的重要的类列举如下:

CameraManager.java:CameraMnager类作为应用APP连接到Camera服务的入口,用于检测、配置以及连接到CameraDevice,在CameraManager启动时,其会使用camera字段作为context注册到Binder内,应用想要连接到CameraManager时,通过getSystemService传入该字段即可。

CameraDevice.java:CameraDevice类是连接到安卓系统的摄像头设备在Java层的实列代表,为应用提供针对具体摄像头设备的管理,每个独立的CameraDevice将以CameraId做为区分。

CameraCaptureSession.java:CameraCaptureSession类是针对某个具体的CameraDevice捕获内容的管理对象,同一个CameraDevice可以有多个CameraCaptureSession.创建CaptrueSession时需要传入相应的Surface界面,调用方将获得与该Surface对应的一个StramId.

CameraCaptureRequest.java:CameraCaptureRequest类用于在创建完CamerCaptureSession后针对图像输出特定格式的管理。在创建CaptureRequest时需要传入模板类型以表明应用类型。目前支持的模板包括TEMPLATE_PREVIEW,TEMPLATE_STILL_CAPTURE,TEMPLATE_RECORD以及TEMPLATE_VIDEO_SNAPSHOT,TEMPLATE_ZERO_SHUTTER_LAG,TEMPLATE_MANUAL.

3 )AIDL:CameraManager需要连接到Framework Native层的CameraService,连接的桥梁就是通过AIDL所定义的Binder通信接口。Camera2所定义的AIDL接口位于frameworks/av/camera/aidl/android/hardware文件夹内。

4 )Framework(C ):Camera2架构的核心就是位于Native层的CameraService,其代码目录位于frameworks/av/camera文件夹下。在这一层,主要分为两部分,一部分是camera server,作为cameraservice启动的入口,还包含了rc启动引导文件.另一部分则是libcameraservice,经系统编译后会生成libcameraservice.so库,由camera server进行加载启动。

5)HAL:CameraService并不能直接与驱动进行交互,需要通过HAL层的Camera Hal完成对摄像头的具体管理行为。与CameraManager连接CameraService类似,CameraService将通过Binder通信调用Camera Hal的接口,这部分的接口定义hidl文件位于hardware/interfaces/camera/内。

,