QAVF Camera共享框架架构
camera-sharing框架提供了一个虚拟设备(vdev),通过该vdev guest应用程序可以访问host端的Camera。该框架使用其他QNX产品的组件与Camera进行交互来显示Camera预览。
假设您已经熟悉以下文档中所介绍的概念:
- QNX Hypervisor 用户指南
- QAVF 架构
- Camera 开发者指南
virtio-video-camera
vdev基于VirtIO-Video规范的3.0版草案,这是对现有VirtIO 1.1规范的提议修正。
Camera共享
host管理所有guests与Camera硬件之间的交互:
- hypervisor host包含与Camera硬件配合使用的Sensor Framework组件。其中包括Camera library,为使用连接到host的Camera提供接口。有关此库如何使用其他组件管理Camera并显示其视频的详细信息,请参阅下文。
- 要想让guest与host共享Camera,托管guest的虚拟机(即qvm进程)必须包含Camera vdev(virtio-video-camera)。
- 为了与vdev进行交互,每个guest都独立运行符合VirtIO-Video消息标准的Camera驱动程序。该驱动程序作为动态库运行,并由虚拟机加载。
- 为了彼此通信(命令和控制),Camera驱动程序和vdev使用virtqueues,这是VirtIO设备上进行数据传输的标准机制。请注意,Camera数据帧的是通过共享内存方式实现的。
- 在Android guests中,应用程序可能使用EVS(Extended View System)框架来访问和使用Camera。VirtIO-Video摄像头驱动程序将发送给EVS的命令转发给vdev进行处理。
下图说明了guests与host系统上的Camera硬件之间的交互。此交互由virtio-video-camera vdev
、Camera library
和host上的Sensor Service以及Screen进行管理。
camera-sharing框架需要其他QNX产品的额外服务来进行操作。host上需要Camera library和Sensor service,以便vdev后端可以与硬件进行交互。这两个组件必须包含在host image中,这意味着您的开发系统上必须安装Sensor Framework;有关更多信息,请参阅发布说明。host上还需要屏幕图形子系统(Screen Graphics Subsystem),以便Sensor Service可以在显示器上渲染Camera数据。默认情况下,Screen包含在hypervisor host image中。
有关QNX Hypervisor中设备共享的更多信息,请参阅QNX Hypervisor用户指南中“Understanding QNX Virtual Environments”章节中关于“Devices”的部分。
Camera虚拟化
当guest应用程序调用Camera API时,这些调用将转发到host上的Camera library进行处理。我们称之为Camera虚拟化,由以下组件支持:
- virtio-video-camera vdev
virtio-video-camera vdev是一种para-virtualized设备,它使来自guest的Camera请求能够在host上执行。该vdev在Hypervisor虚拟机中运行,但不会模拟硬件摄像头。相反,它将guest驱动程序接收到的Camera API调用转发到host上的Camera libray上,并返回调用结果给guest。
-
Camera library
Camera library(libcamapi.so)为应用程序提供了访问连接到host硬件的Camera的接口。该接口支持启动和关闭Camera、缩放、对焦等功能。Camera库使用Sensor Service来执行这些操作。
-
Sensor service
Sensor service直接与Camera硬件进行交互。您必须在Sensor配置文件中配置想要guest应用程序使用的camera。该服务还与Screen交互以显示Camera预览。