7.10. ioctl VIDIOC_ENCODER_CMD, VIDIOC_TRY_ENCODER_CMD

7.10.1. 名称

VIDIOC_ENCODER_CMD - VIDIOC_TRY_ENCODER_CMD - 执行编码器命令

7.10.2. 概要

VIDIOC_ENCODER_CMD

int ioctl(int fd, VIDIOC_ENCODER_CMD, struct v4l2_encoder_cmd *argp)

VIDIOC_TRY_ENCODER_CMD

int ioctl(int fd, VIDIOC_TRY_ENCODER_CMD, struct v4l2_encoder_cmd *argp)

7.10.3. 参数

fd

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

argp

指向结构体 v4l2_encoder_cmd 的指针。

7.10.4. 描述

这些 ioctl 控制音频/视频(通常是 MPEG)编码器。VIDIOC_ENCODER_CMD 向编码器发送命令,VIDIOC_TRY_ENCODER_CMD 可用于尝试命令而不实际执行它。

要发送命令,应用程序必须初始化结构体 v4l2_encoder_cmd 的所有字段,并使用指向此结构的指针调用 VIDIOC_ENCODER_CMDVIDIOC_TRY_ENCODER_CMD

cmd 字段必须包含命令代码。某些命令使用 flags 字段来获取其他信息。

在 STOP 命令之后,read() 调用将读取驱动程序缓冲的剩余数据。当缓冲区为空时,read() 将返回零,并且下一个 read() 调用将重新启动编码器。

如果编码器尚未启动,则 read()VIDIOC_STREAMON 调用会向编码器发送隐式的 START 命令。适用于 mem2mem 编码器的两个队列。

流文件描述符的 close()VIDIOC_STREAMOFF 调用会向编码器发送隐式的立即 STOP,并且所有缓冲的数据都将被丢弃。适用于 mem2mem 编码器的两个队列。

这些 ioctl 是可选的,并非所有驱动程序都可能支持它们。它们在 Linux 2.6.21 中引入。但是,对于有状态的 mem2mem 编码器,它们是强制性的(如 内存到内存有状态视频编码器接口 中进一步说明的那样)。

类型 v4l2_encoder_cmd
struct v4l2_encoder_cmd

__u32

cmd

编码器命令,请参见 编码器命令

__u32

flags

与命令一起使用的标志,请参见 编码器命令标志。如果此命令未定义标志,则驱动程序和应用程序必须将此字段设置为零。

__u32

data[8]

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

编码器命令

V4L2_ENC_CMD_START

0

启动编码器。当编码器已经在运行或暂停时,此命令不执行任何操作。此命令未定义任何标志。

对于实现 内存到内存有状态视频编码器接口 的设备,一旦使用 V4L2_ENC_CMD_STOP 命令启动了排空序列,则必须先驱动到完成,然后才能调用此命令。任何在排空序列进行时尝试调用该命令的行为都将触发 EBUSY 错误代码。有关更多详细信息,请参见 内存到内存有状态视频编码器接口

V4L2_ENC_CMD_STOP

1

停止编码器。当设置 V4L2_ENC_CMD_STOP_AT_GOP_END 标志时,编码将继续进行到当前图像组的末尾,否则编码将立即停止。当编码器已停止时,此命令不执行任何操作。

对于实现 内存到内存有状态视频编码器接口 的设备,该命令将启动 内存到内存有状态视频编码器接口 中记录的排空序列。在这种情况下,不接受任何标志或其他参数。在序列完成之前再次尝试调用该命令的行为将触发 EBUSY 错误代码。

V4L2_ENC_CMD_PAUSE

2

暂停编码器。当编码器尚未启动时,驱动程序将返回 EPERM 错误代码。当编码器已暂停时,此命令不执行任何操作。此命令未定义任何标志。

V4L2_ENC_CMD_RESUME

3

在 PAUSE 命令之后恢复编码。当编码器尚未启动时,驱动程序将返回 EPERM 错误代码。当编码器已在运行时,此命令不执行任何操作。此命令未定义任何标志。

编码器命令标志

V4L2_ENC_CMD_STOP_AT_GOP_END

0x0001

在当前图像组的末尾停止编码,而不是立即停止。

不适用于 内存到内存有状态视频编码器接口

7.10.5. 返回值

成功时返回 0,错误时返回 -1,并适当设置 errno 变量。通用错误代码在 通用错误代码 章节中进行了描述。

EBUSY

实现 内存到内存有状态视频编码器接口 的设备的排空序列仍在进行中。在完成之前,不允许发出另一个编码器命令。

EINVAL

cmd 字段无效。

EPERM

当编码器未运行时,应用程序发送了 PAUSE 或 RESUME 命令。