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_CMD
或 VIDIOC_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¶
__u32 |
|
编码器命令,请参见 编码器命令。 |
__u32 |
|
与命令一起使用的标志,请参见 编码器命令标志。如果此命令未定义标志,则驱动程序和应用程序必须将此字段设置为零。 |
__u32 |
|
保留以供将来扩展。驱动程序和应用程序必须将数组设置为零。 |
|
0 |
启动编码器。当编码器已经在运行或暂停时,此命令不执行任何操作。此命令未定义任何标志。 对于实现 内存到内存有状态视频编码器接口 的设备,一旦使用 |
|
1 |
停止编码器。当设置 对于实现 内存到内存有状态视频编码器接口 的设备,该命令将启动 内存到内存有状态视频编码器接口 中记录的排空序列。在这种情况下,不接受任何标志或其他参数。在序列完成之前再次尝试调用该命令的行为将触发 |
|
2 |
暂停编码器。当编码器尚未启动时,驱动程序将返回 |
|
3 |
在 PAUSE 命令之后恢复编码。当编码器尚未启动时,驱动程序将返回 |
|
0x0001 |
在当前图像组的末尾停止编码,而不是立即停止。 不适用于 内存到内存有状态视频编码器接口。 |
7.10.5. 返回值¶
成功时返回 0,错误时返回 -1,并适当设置 errno
变量。通用错误代码在 通用错误代码 章节中进行了描述。
- EBUSY
实现 内存到内存有状态视频编码器接口 的设备的排空序列仍在进行中。在完成之前,不允许发出另一个编码器命令。
- EINVAL
cmd
字段无效。- EPERM
当编码器未运行时,应用程序发送了 PAUSE 或 RESUME 命令。