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

相关推荐
沅霖5 小时前
android kotlin语言中的协程
android·开发语言·kotlin
齊家治國平天下5 小时前
Android 14 系统启动流程深度解析:rc文件的语法、解析及常见语法详解
android·init·rc·init.rc
shaominjin1235 小时前
Android Studio 代码注释模板设置指南
android
红宝村村长5 小时前
Golang交叉编译到Android上运行
android·开发语言·golang
游戏开发爱好者86 小时前
iOS 开发推送功能全流程详解 从 APNs 配置到上架发布的完整实践(含跨平台上传方案)
android·macos·ios·小程序·uni-app·cocoa·iphone
恋猫de小郭6 小时前
iOS 26 开始强制 UIScene ,你的 Flutter 插件准备好迁移支持了吗?
android·前端·flutter
杨筱毅6 小时前
【底层机制】【Android】【面试】Zygote 为什么使用 Socket 而不是 Binder?
android·1024程序员节·底层机制
快乐1016 小时前
Media3 ExoPlayer扩展FFmpeg音视频解码
android
zgyhc20507 小时前
【Android Audio】安卓音频中Surround mode切换流程
android·音视频