SDV 媒体要求

本文档中的关键字“必须”“不得”“应”和“强烈建议”将按 RFC 2119 中的描述进行解释。

客户机系统(虚拟机映像)

本部分中的要求适用于 guest 系统。

内存

系统必须为每个虚拟机提供至少 2 GB 的内存。

应用二进制接口

设备实现:

  • 必须与一个或多个已定义的 Android NDK ABI 兼容。
  • 必须为同一设备上的所有虚拟机映像使用相同的 Android NDK ABI
  • 必须与以下列表中每个必需的库保持源代码兼容(例如,标头兼容)和二进制兼容(适用于 ABI)。
  • 必须使以下所有提供原生 API 的库可供 SDV 应用使用:
    • libc(C 库)
    • libdl(动态链接器)
    • libdrm.so(直接渲染管理器用户空间库)
    • libgbm.so(通用缓冲区管理)
    • libEGL.so(原生 OpenGL Surface 管理)
    • libGLESv1_CM.so (OpenGL ES 1.x)
    • libGLESv2.so (OpenGL ES 2.0)
    • libGLESv3.so (OpenGL ES 3.x)
    • liblog(Android 日志记录)
    • libtinyalsav2.so(录音和播放)
    • libvulkan.so (Vulkan)
  • 不得添加或移除上述原生库的公共函数。
  • 必须通过 libGLESv3.so 库导出所有 OpenGL ES 3.1 和 Android Extension Pack 函数符号(如 NDK 中所定义)。请注意,虽然所有符号都必须存在,但 OpenGL ES 中更详细地介绍了关于何时需要完整实现每个对应函数方面的要求。
  • 必须通过 libvulkan.so 库导出核心 Vulkan 1.1 函数的函数符号以及 VK_KHR_surfaceVK_KHR_swapchainVK_KHR_maintenance1VK_KHR_get_physical_device_properties2 扩展。请注意,所有符号都必须存在,但 Vulkan 中更详细地介绍了关于何时需要完整实现每个对应函数方面的要求。
  • 应使用上游 Android 开源项目中的源代码和头文件进行构建。

图形

  • 系统必须使用 virtio-gpu 进行硬件加速图形处理。guest 端驱动程序应使用 gfxstream 进行渲染。

输入

客户机系统必须包含对使用 virtio-input 从主机系统转发的输入事件的支持。

OpenGL ES

设备实现:

  • 必须通过原生 API 正确识别支持的 OpenGL ES 版本(1.1、2.0、3.0、3.1、3.2)。
  • 对于支持的每个 OpenGL ES 版本,必须支持所有对应的原生 API。
  • 必须同时支持 OpenGL ES 1.1 和 2.0。
  • 强烈建议支持 OpenGL ES 3.1。
  • 应支持 OpenGL ES 3.2。
  • 必须通过 OpenGL ES 受管理 API 和原生 API 报告已实现的所有其他 OpenGL ES 扩展;反过来说就是,不得报告不支持的扩展字符串。
  • 必须支持以下扩展:
    • EGL_EXT_image_dma_buf_import
    • EGL_EXT_image_dma_buf_import_modifiers
    • EGL_KHR_fence_sync
    • EGL_KHR_image_base
    • EGL_KHR_wait_sync
    • GL_OES_EGL_image

强烈建议设备实现使用具有 Vulkan 后端的 ANGLE 库来实现 OpenGL ES。

Vulkan

设备实现:

  • 强烈建议支持 Vulkan 1.3。
  • 不得支持 Vulkan 变体版本(即 Vulkan 核心版本的变体部分必须为零)。
  • 必须支持以下扩展:
    • VK_ANDROID_external_memory_android_hardware_buffer
    • VK_EXT_external_memory_dma_buf
    • VK_EXT_queue_family_foreign
    • VK_KHR_external_memory_fd
    • VK_KHR_external_semaphore_fd

多媒体兼容性

  • 设备实现必须允许播放具有以下特征的原始音频内容:

    • 来源格式:线性 PCM、16 位、8 位、浮点型
    • 声道:单声道、立体声,有效的多声道配置支持多达 8 声道
    • 采样率(以 Hz 为单位)
      • 8000、11025、16000、22050、24000、32000、44100、48000(声道配置如上所列)
      • 96000(单声道和立体声)
  • 设备实现必须允许捕获原始音频内容。设备实现必须至少支持以下特征:

    • 格式:线性 PCM、16 位
    • 采样率:8000、11025、16000、44100、48000 Hz
    • 声道:单声道
  • 设备实现应允许捕获具有以下特征的原始音频内容:

    • 格式:线性 PCM、16 位和 24 位
    • 采样率:8000、11025、16000、22050、24000、32000、44100、48000 Hz
    • 声道:声道数与设备上的麦克风数相同
  • 设备实现必须通过 libtinyalsav2.so API 提供对音频播放和捕获的支持,使用 virtio-sound 设备进行硬件访问,并且必须支持 ALSA API

  • 视频编码器和解码器必须至少支持平面或半平面 YUV420 8:8:8 颜色格式之一。

  • 视频解码器和编码器必须支持 H.264 AVC 编解码器。

  • 设备实现必须支持 H.264 Main Profile Level 3.1 和 Baseline Profile。可以选择是否支持任意切片顺序 (ASO)、灵活宏块顺序 (FMO) 和冗余切片 (RS)。

  • 视频编码器:

    • 必须支持下表中的标清 (SD) 视频编码配置文件。
    • 应支持下表中所列的高清视频编码配置文件。

      标清(低画质) 标清(高画质) 高清 720p 高清 1080p
      视频分辨率 320 x 240 像素 720 x 480 像素 1280 x 720 像素 1920 x 1080 像素
      视频帧速率 20 fps 30 fps 30 fps 30 fps
      视频比特率 384 Kbps 2 Mbps 4 Mbps 10 Mbps
  • 视频解码器:

    • 必须支持下表中的高清 720p 视频解码配置文件。
    • 必须支持下表中的高清 1080p 视频解码配置。

      标清(低画质) 标清(高画质) 高清 720p 高清 1080p
      视频分辨率 320 x 240 像素 720 x 480 像素 1280 x 720 像素 1920 x 1080 像素
      视频帧速率 30 fps 30 fps 60 fps 30 fps
      视频比特率 800 Kbps 2 Mbps 8 Mbps 20 Mbps
  • 设备实现必须使用 Video4Linux API 提供对媒体编解码器的支持。

  • 设备实现必须使用 Video4Linux API 提供对硬件视频解码器的访问权限。

  • 所有硬件加速视频和图片编码器都必须支持从硬件摄像头编码帧。设备实现必须通过 virtio-media 提供视频编码和解码的硬件访问权限。

  • 设备实现必须使用 Video4Linux API 提供对视频摄像头的访问权限。

宿主系统(Hypervisor 和硬件)

本部分中的要求适用于主机系统和 Hypervisor 环境。

虚拟化

  • 除了核心配置文件所需的 virtio 设备之外,宿主系统还必须提供以下内容:
    • virtio-gpu:适用于虚拟 GPU 和显示屏
    • virtio-input:用于转发输入事件(例如触摸、键盘)
    • virtio-sound:适用于虚拟音频设备
    • virtio-videovirtio-media:适用于虚拟视频编解码器设备

输入

  • 设备必须支持输入设备,并使用 virtio-input 将事件转发到 guest 系统。设备应支持指针、按钮和旋转控制器输入。