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.cpp
    ConfigManagerUtil.cpp
    EvsCamera.cpp
    EvsEnumerator.cpp          sampleDriver
    EvsGlDisplay.cpp
    EvsMockCamera.cpp
    EvsVideoEmulatedCamera.cpp
    GlWrapper.cpp
    service.cpp                           
  default/tests/                                      实现的单元测试程序
  default/Android.bp
  default/evs-default-service.rc
  default/manifest_evs-default-service.xml
  Android.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.cpp
  Android.bp                                            evs manager aidl构建脚本
  evsmanagerd.rc                                        evs manager aidl启动脚本
  init.evs.rc
  manifest_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.cpp
  src/ConfigManagerUtil.cpp
  src/EvsEnumerator.cpp
  src/EvsGlDisplay.cpp
  src/GlWrapper.cpp
  src/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应用实现涉及三个线程:

  1. EVS应用主线程,负责初始化处理
  2. EVS事件监听线程,负责事件的提交
  3. EVS更新处理线程,负责业务事件的处理
1.EVS应用的初始化
  1. 加载配置参数。evs app运行参数有两种配置方式:
    1. evs app执行时通过命令行参数设置
    2. 修改evs app配置文件。优先加载设备文件系统中的"/vendor/etc/automotive/evs/config_override.json",默认加载路径"/system/etc/automotive/evs/config.json"
  2. 通过EvsService打开显示设备
  3. 订阅VHal消息。订阅了两个消息:VehicleProperty::GEAR_SELECTION和VehicleProperty::TURN_SIGNAL_STATE
  4. 创建EvsStateControl对象,
    1. 初始化两个配置内容:mGearValue和mTurnSignalValue(通过属性系统传递的配置参数,配置源为*.proto 后续再介绍)
    2. 确定EVS摄像头有哪几颗(mCameraList[State::XX]保存的是EVS app camera配置,mCameraDescList[State::XX]保存的是EVS系统Camera实例)
      1. 应用配置文件中有一个摄像头白名单,用于对EVS系统包含的摄像头进行过滤,白名单过滤EVS系统包含的摄像头是EVS app实际可用的摄像头
      2. EVS app对EVS系统中的摄像头角色的定义:"reverse"倒车摄像头、"right"右侧摄像头、"left"左侧摄像头、"park"驻车摄像头。
  5. 启动升级线程和事件监听线程(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(),处理流程:

  1. 获取一个处理命令(命令处理是异步的,通过mCommandQueue队列缓存xx请求)
  2. 基于当前车机状态选择evs状态(4个状态:VehicleGear::GEAR_REVERSE > VehicleTurnSignal::RIGHT,VehicleTurnSignal::LEFT,VehicleGear::GEAR_PARK),根据evs状态配置处理管道。处理管道处理完的结果通过mCurrentRenderer体现。
  3. 根据车机状态,构建一帧图像数据处理的物理链路
  4. ,将图像数据显示出来
    1. 从显示器模块获取一块显示缓存 :displayHandler->getTargetBuffer(&tgtBuffer))
    2. 将图像渲染绘制到目标缓存:mCurrentRenderer->drawFrame(tgtBuffer)
    3. 归还显示缓存到显示模块:displayHandle->returnTargetBufferForDisplay(tgtBuffer)

EVS应用通过车机事件触发图像的"采集->处理->显示"处理流水的构建,一个车机事件触发一次evs处理流水线的配置,流水线配置完成后自动进入激活状态。

EVS应用中车机事件的处理

图4.EVS App车机事件处理过程

EVS应用层对车机事件的处理如上图所示,分为三个步:

  1. 首先,从VHal获取一个订阅客户端用于后续的注册和事件回调。
  2. 然后,通过这个订阅客户端向VHal订阅两个车机属性更新
  3. 当被订阅的这两个车机属性有变化时,VHal会根据之前的订阅情况将事件及时(回调)通知给订阅客户端
  4. EvsVehicleListener完成内容订阅后就等待事件的到来。当收到事件后将这个事件送到命令缓存队列
  5. EvsStateControl会不断从命令缓存队列提取命令,并进行响应。

2.EVS管理器

EVS管理器提供EVS系统的公共接口,用于收集和呈现外部相机视图。在硬件驱动程序针对每个资源(相机或显示设备)仅允许支持一个活动窗口的情况下,EVS管理器可为对相机进行共享访问提供遍历。一个主要EVS应用是EVS管理器的第一个客户端,并且是唯一有权写入显示数据的客户端(其他客户端可以被授予对相机图像的只读权限)。

EVS管理器实现与底层HAL驱动程序相同的API,并通过支持多个并发客户端提供扩展服务(多个客户端可以通过EVS管理器打开一个摄像头并接收视频流)。

EVS管理器本身是EVS Hardware HAL层允许的一个客户端,并充当EVS Hardware HAL的代理。

IEvsEnumerator

IEvsCamera

IEvsDisplay

3.EVS Hal

相关推荐
xiangpanf13 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx16 小时前
安卓线程相关
android
消失的旧时光-194316 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon17 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon17 小时前
VSYNC 信号完整流程2
android
dalancon17 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户693717500138419 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android19 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才20 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶20 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle