Android15增强型视觉系统(EVS)

EVS专供汽车平台使用,对Android系统服务依赖较小,可提供早期摄像头使用权限。此API仅适用于提供关键汽车摄像头体验(例如后视、环绕视图显示)的系统和第一方(1P)应用。
相对于EVS的是Android摄像头服务(适用Android Camera API v2)与摄像头硬件进行交互。Camera2与其他Android服务紧密耦合,并且要求必须在Android完全启动后才能使用摄像头(除了具有特权的客户端可提早使用摄像头以外)。Camera2 API可供系统、1P应用以及实现传统摄像头体验(例如视频会议)的第三方(3P)应用使用。
从Android规划来看,将弃用EVS API,通过使用Camera2框架在Android Automotive OS(AAOS)上标准化摄像头开发。
Android15源码中的EVS
1.evs框架接口定义
hardware/interfaces/automotive/evs/
hardware/interfaces/automotive/evs/1.0/ hidl v1.0接口定义
hardware/interfaces/automotive/evs/1.1/ hidl v1.1接口定义
hardware/interfaces/automotive/evs/aidl/ aidl接口定义
hardware/interfaces/automotive/evs/aidl/android/hardware/automotive/evs/
hardware/interfaces/automotive/evs/aidl/impl/ aidl接口实现参考,C++版本default/include/ 实现的头文件default/resources/ 实现的资源文件default/src/ 实现的源码(evs hal层)ConfigManager.cppConfigManagerUtil.cppEvsCamera.cppEvsEnumerator.cpp sampleDriverEvsGlDisplay.cppEvsMockCamera.cppEvsVideoEmulatedCamera.cppGlWrapper.cppservice.cpp default/tests/ 实现的单元测试程序default/Android.bpdefault/evs-default-service.rcdefault/manifest_evs-default-service.xmlAndroid.bp
hardware/interfaces/automotive/evs/aidl/rust_impl/ aidl接口实现参考,Rust版本
hardware/interfaces/automotive/evs/aidl/vts/ aidl接口vts程序
hardware/interfaces/automotive/evs/aidl/Android.bp aidl接口构建脚本
2.evs系统实现
packages/services/Car/cpp/evs/ evs系统实现
packages/services/Car/cpp/evs/apps/ evs app实现
packages/services/Car/cpp/evs/manager/1.0/ evs manager v1.0实现
packages/services/Car/cpp/evs/manager/1.1/ evs manager v1.1实现
packages/services/Car/cpp/evs/manager/aidl/ evs manager aidl实现src/service.cppAndroid.bp evs manager aidl构建脚本evsmanagerd.rc evs manager aidl启动脚本init.evs.rcmanifest_evsmanagerd.xml evs manager兼容矩阵
pacakges/services/Car/cpp/evs/sampleDriver/hidl/ evs hal hidl接口实现
packages/services/Car/cpp/evs/sampleDriver/aidl/ evs hal aidl接口实现src/ConfigManager.cppsrc/ConfigManagerUtil.cppsrc/EvsEnumerator.cppsrc/EvsGlDisplay.cppsrc/GlWrapper.cppsrc/service.cpp
packages/services/Car/cpp/evs/support_library/ evs lib实现ConfigManager.cpp
packages/services/Car/cpp/evs/Android.bp evs系统构建脚本
3.evs系统测试程序
packages/services/Car/tests/CarEvsCameraPreviewApp/ 测试car-lib的单摄像头应用
packages/services/Car/tests/CarEvsMultiCameraPreviewApp/测试car-lib的多摄像头应用
EVS系统实现
EVS系统架构

图1.EVS系统组成结构
EVS系统大致分为4层:
- EVS应用 (/packages/services/Car/evs/app)
- 负责从EVS管理器请求视频帧
- 将用于显示的已完成的帧送回EVS管理器
- EVS管理器(/packages/services/Car/evs/manager)
- 提供EVS应用所需的构建块,已实现从简单的后视摄像头显示到6DOF多摄像头渲染的任何功能。
- 提供HID/AIDL接口,接受多个并发客户端的访问。
- 提供其他应用和服务(特别是汽车服务)查询状态。
- EVS硬件抽象(packages/services/Car/evs/sampleDriver)
- (Camera Impl)负责配置物理相机和从物理相机收集数据并通过Gralloc可识别的共享缓冲区传递这个数据。
- (Display Impl)负责提供可由应用填充(通常通过EGL渲染的方式)的共享缓冲区,并优先呈现已完成的帧(在任何可能会显示在物理显示设备上的其他内容之前)。
- EVS驱动
原始设备制造商(OEM)无需创建新的驱动程序,可以选择通过现有相机或显示硬件驱动程序来支持EVS所需的功能。
EVS系统的一组接口:
- 原始设备制造商负责实现由/hardware/interfaces/automotive/evs中定义的API
1.EVS应用
EVS和汽车服务可供使用后,便立即由init启动(设置目标为在开机2s内启动)。OEM可视需要修改和替换EVS应用。
Android15已提供与EVS管理器和车载HAL通信的EVS应用的原生参考C++实现,提供基本的后视摄像头功能。该应用在系统启动过程的早期启动,根据可用的相机和汽车状态(车轮和转向灯状态)显示合适的视频。
EVS应用参考程序静态结构

图2.EVS原生应用UML静态结构
EVS作为Android Automotive的一部分,会涉及一些关联逻辑,上图蓝色虚线框是EVS App和VHal关联部分。
IEvsEnumerator、IEvsCamera和IEvsDisplay是EVS API中定义的三个抽象,在EVS系统结构中的位置如下,

图3.
EVS应用的处理流程
EVS应用实现涉及三个线程:
- EVS应用主线程,负责初始化处理
- EVS事件监听线程,负责事件的提交
- EVS更新处理线程,负责业务事件的处理
1.EVS应用的初始化
- 加载配置参数。evs app运行参数有两种配置方式:
- evs app执行时通过命令行参数设置
- 修改evs app配置文件。优先加载设备文件系统中的"/vendor/etc/automotive/evs/config_override.json",默认加载路径"/system/etc/automotive/evs/config.json"
- 通过EvsService打开显示设备
- 订阅VHal消息。订阅了两个消息:VehicleProperty::GEAR_SELECTION和VehicleProperty::TURN_SIGNAL_STATE
- 创建EvsStateControl对象,
- 初始化两个配置内容:mGearValue和mTurnSignalValue(通过属性系统传递的配置参数,配置源为*.proto 后续再介绍)
- 确定EVS摄像头有哪几颗(mCameraList[State::XX]保存的是EVS app camera配置,mCameraDescList[State::XX]保存的是EVS系统Camera实例)
- 应用配置文件中有一个摄像头白名单,用于对EVS系统包含的摄像头进行过滤,白名单过滤EVS系统包含的摄像头是EVS app实际可用的摄像头
- EVS app对EVS系统中的摄像头角色的定义:"reverse"倒车摄像头、"right"右侧摄像头、"left"左侧摄像头、"park"驻车摄像头。
- 启动升级线程和事件监听线程(EvsStateControl的两个子线程)
2.EVS应用的事件提交
EvsVehicleListener线程负责监听VHal发送的事件通知,将接收到的车机事件转换成EVS应用内部控制命令并向后提交。
当前EVS事件其实只有一个事件(即CHECK_VEHICLE_STATE,检查车机状态),EVS应用内部控制命令如下,
//EVS应用内部事件类型(packages/services/Car/cpp/evs/apps/default/inc/EvsStateControl.h)
enum class Op {EXIT,CHECK_VEHICLE_STATE,TOUCH_EVENT,
};
struct Command {Op operation;uint32_t arg1;uint32_t arg2;
};//EVS应用事件的提交(packages/services/Car/cpp/evs/apps/default/inc/EvsVehicleListener.h)
void run(EvsStateControl* pStateController)
{while (true) {waitForEvents(5000);EvsStateControl::Command cmd = {.operation = EvsStateControl::Op::CHECK_VEHICLE_STATE,.arg1 = 0,.arg2 = 0,};pStateController->postCommand(cmd);}
}
3.EVS应用的事件处理
EVS应用实现,操作命令有3个:CHECK_VEHICLE_STATE,TOUCH_EVENT(当前无触发),EXIT(当前无触发)。
EVS应用中事件处理线程即updateLoop(),处理流程:
- 获取一个处理命令(命令处理是异步的,通过mCommandQueue队列缓存xx请求)
- 基于当前车机状态选择evs状态(4个状态:VehicleGear::GEAR_REVERSE > VehicleTurnSignal::RIGHT,VehicleTurnSignal::LEFT,VehicleGear::GEAR_PARK),根据evs状态配置处理管道。处理管道处理完的结果通过mCurrentRenderer体现。
- 根据车机状态,构建一帧图像数据处理的物理链路
- ,将图像数据显示出来
- 从显示器模块获取一块显示缓存 :displayHandler->getTargetBuffer(&tgtBuffer))
- 将图像渲染绘制到目标缓存:mCurrentRenderer->drawFrame(tgtBuffer)
- 归还显示缓存到显示模块:displayHandle->returnTargetBufferForDisplay(tgtBuffer)
EVS应用通过车机事件触发图像的"采集->处理->显示"处理流水的构建,一个车机事件触发一次evs处理流水线的配置,流水线配置完成后自动进入激活状态。
EVS应用中车机事件的处理

图4.EVS App车机事件处理过程
EVS应用层对车机事件的处理如上图所示,分为三个步:
- 首先,从VHal获取一个订阅客户端用于后续的注册和事件回调。
- 然后,通过这个订阅客户端向VHal订阅两个车机属性更新
- 当被订阅的这两个车机属性有变化时,VHal会根据之前的订阅情况将事件及时(回调)通知给订阅客户端
- EvsVehicleListener完成内容订阅后就等待事件的到来。当收到事件后将这个事件送到命令缓存队列
- EvsStateControl会不断从命令缓存队列提取命令,并进行响应。
2.EVS管理器
EVS管理器提供EVS系统的公共接口,用于收集和呈现外部相机视图。在硬件驱动程序针对每个资源(相机或显示设备)仅允许支持一个活动窗口的情况下,EVS管理器可为对相机进行共享访问提供遍历。一个主要EVS应用是EVS管理器的第一个客户端,并且是唯一有权写入显示数据的客户端(其他客户端可以被授予对相机图像的只读权限)。
EVS管理器实现与底层HAL驱动程序相同的API,并通过支持多个并发客户端提供扩展服务(多个客户端可以通过EVS管理器打开一个摄像头并接收视频流)。
EVS管理器本身是EVS Hardware HAL层允许的一个客户端,并充当EVS Hardware HAL的代理。
