7.62. ioctl VIDIOC_SUBDEV_G_ROUTING, VIDIOC_SUBDEV_S_ROUTING

7.62.1. 名称

VIDIOC_SUBDEV_G_ROUTING - VIDIOC_SUBDEV_S_ROUTING - 获取或设置媒体实体中媒体垫之间的流路由。

7.62.2. 概要

VIDIOC_SUBDEV_G_ROUTING

int ioctl(int fd, VIDIOC_SUBDEV_G_ROUTING, struct v4l2_subdev_routing *argp)

VIDIOC_SUBDEV_S_ROUTING

int ioctl(int fd, VIDIOC_SUBDEV_S_ROUTING, struct v4l2_subdev_routing *argp)

7.62.3. 参数

fd

open() 返回的文件描述符。

argp

指向 struct v4l2_subdev_routing 的指针。

7.62.4. 描述

这些 ioctl 用于获取和设置媒体实体中的路由。路由配置决定了实体内部的数据流。

驱动程序使用 VIDIOC_SUBDEV_G_ROUTING ioctl 报告其当前的路由表,应用程序可以使用 VIDIOC_SUBDEV_S_ROUTING ioctl 通过添加或删除路由,以及设置或清除 struct v4l2_subdev_routeflags 字段的标志来启用或禁用路由。与 VIDIOC_SUBDEV_G_ROUTING 类似,VIDIOC_SUBDEV_S_ROUTING 也会将路由返回给用户。

当调用 VIDIOC_SUBDEV_S_ROUTING 时,所有流配置都会重置。这意味着用户空间必须在调用 ioctl 后重新配置所有流格式和选择,例如使用 VIDIOC_SUBDEV_S_FMT

只有同时具有接收器和源垫的子设备才能支持路由。

len_routes 字段指示可以容纳用户空间分配的 routes 数组中的路由数量。应用程序为这两个 ioctl 设置此字段,以指示内核可以返回多少个路由,内核永远不会修改此字段。

num_routes 字段指示路由表中的路由数量。对于 VIDIOC_SUBDEV_S_ROUTING,用户空间将其设置为应用程序存储在 routes 数组中的路由数量。对于这两个 ioctl,它都由内核返回,并指示子设备路由表中存储了多少个路由。这可能小于或大于应用程序为 VIDIOC_SUBDEV_S_ROUTING 设置的 num_routes 值,因为驱动程序可能会调整请求的路由表。

内核可以从这两个 ioctl 返回一个大于 len_routesnum_routes 值。这表示路由表中存在的路由多于 routes 数组可以容纳的路由。在这种情况下,内核会使用子设备路由表中的前 len_routes 项填充 routes 数组。这不被认为是错误,并且 ioctl 调用成功。如果应用程序想要检索丢失的路由,可以使用足够大的 routes 数组发出新的 VIDIOC_SUBDEV_G_ROUTING 调用。

由于硬件特性,VIDIOC_SUBDEV_S_ROUTING 可能会返回比用户在 num_routes 字段中提供的更多的路由。

type v4l2_subdev_routing
struct v4l2_subdev_routing

__u32

which

要访问的路由表,来自枚举 v4l2_subdev_format_whence

__u32

len_routes

数组的长度(如数组的内存保留)

struct v4l2_subdev_route

routes[]

struct v4l2_subdev_route 条目的数组

__u32

num_routes

路由数组的条目数

__u32

reserved[11]

为将来的扩展保留。应用程序和驱动程序必须将数组设置为零。

type v4l2_subdev_route
struct v4l2_subdev_route

__u32

sink_pad

接收器垫编号。

__u32

sink_stream

接收器垫流编号。

__u32

source_pad

源垫编号。

__u32

source_stream

源垫流编号。

__u32

flags

路由启用/禁用标志 v4l2_subdev_routing_flags

__u32

reserved[5]

为将来的扩展保留。应用程序和驱动程序必须将数组设置为零。

enum v4l2_subdev_routing_flags

V4L2_SUBDEV_ROUTE_FL_ACTIVE

0x0001

该路由已启用。由应用程序设置。

7.62.5. 返回值

成功时返回 0,错误时返回 -1,并相应地设置 errno 变量。通用错误代码在 通用错误代码 章节中描述。

EINVAL

接收器或源垫标识符引用不存在的垫,或引用不同类型的垫(即,sink_pad 标识符引用源垫),或者 which 字段具有不受支持的值。

E2BIG

应用程序为 VIDIOC_SUBDEV_S_ROUTING 提供的 num_routes 大于驱动程序可以处理的路由数量。