7.62. ioctl VIDIOC_SUBDEV_G_ROUTING, VIDIOC_SUBDEV_S_ROUTING

7.62.1. 名称

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

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

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

只有同时具有sink和source pad的子设备才能支持路由。

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

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

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

由于例如硬件属性,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

routes 数组的条目数

__u32

reserved[11]

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

type v4l2_subdev_route
struct v4l2_subdev_route

__u32

sink_pad

Sink pad 编号。

__u32

sink_stream

Sink pad 流编号。

__u32

source_pad

Source pad 编号。

__u32

source_stream

Source pad 流编号。

__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 或 source pad 标识符引用了不存在的 pad 或引用了不同类型的 pad(即 sink_pad 标识符引用了 source pad),或者 which 字段具有不支持的值。

E2BIG

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