7.28. ioctl VIDIOC_G_ENC_INDEX

7.28.1. 名称

VIDIOC_G_ENC_INDEX - 获取有关压缩视频流的元数据

7.28.2. 概要

VIDIOC_G_ENC_INDEX

int ioctl(int fd, VIDIOC_G_ENC_INDEX, struct v4l2_enc_idx *argp)

7.28.3. 参数

fd

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

argp

指向 struct v4l2_enc_idx 的指针。

7.28.4. 描述

VIDIOC_G_ENC_INDEX ioctl 提供有关压缩视频流的元数据,该视频流与当前从驱动程序读取的同一或另一个应用程序相同,这对于在不解码的情况下随机访问流非常有用。

要读取数据,应用程序必须使用指向 struct v4l2_enc_idx 的指针调用 VIDIOC_G_ENC_INDEX。成功后,驱动程序将填充 entry 数组,将写入的元素数量存储在 entries 字段中,并初始化 entries_cap 字段。

entry 数组的每个元素都包含有关一个图片的元数据。VIDIOC_G_ENC_INDEX 调用最多从驱动程序缓冲区读取 V4L2_ENC_IDX_ENTRIES 个条目,该缓冲区最多可以容纳 entries_cap 个条目。此数字可以小于或大于 V4L2_ENC_IDX_ENTRIES,但不能为零。当应用程序未能及时读取元数据时,最旧的条目将丢失。当缓冲区为空或未进行捕获/编码时,entries 将为零。

目前,此 ioctl 仅为 MPEG-2 程序流和视频基本流定义。

type v4l2_enc_idx
struct v4l2_enc_idx

__u32

entries

驱动程序存储在 entry 数组中的条目数。

__u32

entries_cap

驱动程序可以缓冲的条目数。必须大于零。

__u32

reserved[4]

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

struct v4l2_enc_idx_entry

entry[V4L2_ENC_IDX_ENTRIES]

有关压缩视频流的元数据。数组的每个元素对应于一个图片,按其 offset 升序排序。

type v4l2_enc_idx_entry
struct v4l2_enc_idx_entry

__u64

offset

从压缩视频流的开头到此图片开头的偏移量(以字节为单位),即 ISO 13818-1 中定义的PES 数据包头ISO 13818-2 中定义的图片头。当编码器停止时,驱动程序会将偏移量重置为零。

__u64

pts

此图片的 33 位显示时间戳,如 ISO 13818-1 中定义。

__u32

length

此图片的长度(以字节为单位)。

__u32

flags

包含此图片的编码类型的标志,请参阅 索引条目标志

__u32

reserved[2]

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

索引条目标志

V4L2_ENC_IDX_FRAME_I

0x00

这是一个帧内编码图片。

V4L2_ENC_IDX_FRAME_P

0x01

这是一个预测编码图片。

V4L2_ENC_IDX_FRAME_B

0x02

这是一个双向预测编码图片。

V4L2_ENC_IDX_FRAME_MASK

0x0F

使用此掩码AND标志字段以获取图片编码类型。

7.28.5. 返回值

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