6.2.3.1. DVB 视频设备

注意

不要在新驱动程序中使用!请参阅:通用说明

DVB 视频设备控制 DVB 硬件的 MPEG2 视频解码器。可以通过 /dev/dvb/adapter0/video0 访问它。数据类型和 ioctl 定义可以通过在应用程序中包含 linux/dvb/video.h 来访问。

请注意,DVB 视频设备仅控制 MPEG 视频流的解码,而不控制其在电视或计算机屏幕上的显示。在 PC 上,这通常由关联的 video4linux 设备处理,例如 /dev/video,它允许缩放和定义输出窗口。

大多数 DVB 卡没有自己的 MPEG 解码器,这会导致省略音频和视频设备以及 video4linux 设备。

这些 ioctl 也被 V4L2 用来控制 V4L2 中实现的 MPEG 解码器。将这些 ioctl 用于该目的已过时,并且已经创建了适当的 V4L2 ioctl 或控件来替换该功能。对于新的驱动程序,请使用 V4L2 ioctl

6.2.3.1.1. 视频数据类型

6.2.3.1.1.1. video_format_t

6.2.3.1.1.1.1. 概要

typedef enum {
    VIDEO_FORMAT_4_3,
    VIDEO_FORMAT_16_9,
    VIDEO_FORMAT_221_1
} video_format_t;

6.2.3.1.1.1.2. 常量

VIDEO_FORMAT_4_3

选择 4:3 格式。

VIDEO_FORMAT_16_9

选择 16:9 格式。

VIDEO_FORMAT_221_1

选择 2.21:1 格式。

6.2.3.1.1.1.3. 描述

video_format_t 数据类型在 VIDEO_SET_FORMAT 函数中使用,以告知驱动程序输出硬件(例如电视)具有哪个宽高比。它也用于 video_status 数据结构中,由 VIDEO_GET_STATUS 返回,以及 video_event 数据结构中,由 VIDEO_GET_EVENT 返回,它们报告当前视频流的显示格式。


6.2.3.1.1.2. video_displayformat_t

6.2.3.1.1.2.1. 概要

typedef enum {
    VIDEO_PAN_SCAN,
    VIDEO_LETTER_BOX,
    VIDEO_CENTER_CUT_OUT
} video_displayformat_t;

6.2.3.1.1.2.2. 常量

VIDEO_PAN_SCAN

使用平移和扫描格式。

VIDEO_LETTER_BOX

使用信箱格式。

VIDEO_CENTER_CUT_OUT

使用中心剪切格式。

6.2.3.1.1.2.3. 描述

如果视频流和显示硬件的显示格式不同,则应用程序必须指定如何处理图片的裁剪。可以使用 VIDEO_SET_DISPLAY_FORMAT 调用来完成此操作,该调用接受此枚举作为参数。


6.2.3.1.1.3. video_size_t

6.2.3.1.1.3.1. 概要

typedef struct {
    int w;
    int h;
    video_format_t aspect_ratio;
} video_size_t;

6.2.3.1.1.3.2. 变量

int w

视频宽度(以像素为单位)。

int h

视频高度(以像素为单位)。

video_format_t aspect_ratio

宽高比。

6.2.3.1.1.3.3. 描述

在结构体 video_event 中使用。它存储视频的分辨率和宽高比。


6.2.3.1.1.4. video_stream_source_t

6.2.3.1.1.4.1. 概要

typedef enum {
    VIDEO_SOURCE_DEMUX,
    VIDEO_SOURCE_MEMORY
} video_stream_source_t;

6.2.3.1.1.4.2. 常量

VIDEO_SOURCE_DEMUX

选择解复用器作为主要来源。

VIDEO_SOURCE_MEMORY

如果选择此源,则流通过 write 系统调用来自用户。

6.2.3.1.1.4.3. 描述

视频流源通过 VIDEO_SELECT_SOURCE 调用设置,并且可以采用以下值,具体取决于我们是从内部(解复用器)还是外部(用户写入)源重放。VIDEO_SOURCE_DEMUX 选择解复用器(由前端或 DVR 设备馈送)作为视频流的源。如果选择 VIDEO_SOURCE_MEMORY,则流通过 write() 系统调用来自应用程序。


6.2.3.1.1.5. video_play_state_t

6.2.3.1.1.5.1. 概要

typedef enum {
    VIDEO_STOPPED,
    VIDEO_PLAYING,
    VIDEO_FREEZED
} video_play_state_t;

6.2.3.1.1.5.2. 常量

VIDEO_STOPPED

视频已停止。

VIDEO_PLAYING

视频当前正在播放。

VIDEO_FREEZED

视频已冻结。

6.2.3.1.1.5.3. 描述

这些值可以由 VIDEO_GET_STATUS 调用返回,表示视频播放的状态。


6.2.3.1.1.6. struct video_command

6.2.3.1.1.6.1. 概要

struct video_command {
    __u32 cmd;
    __u32 flags;
    union {
        struct {
            __u64 pts;
        } stop;

        struct {
            __s32 speed;
            __u32 format;
        } play;

        struct {
            __u32 data[16];
        } raw;
    };
};

6.2.3.1.1.6.2. 变量

__u32 cmd

解码器命令

__u32 flags

解码器命令的标志。

struct stop

__u64 pts

MPEG PTS

stuct play

__s32 speed

0 或 1000 指定正常速度,

1:指定向前单步执行,

-1:指定向后单步执行,

>1:以正常速度的 speed / 1000 的速度播放

<-1:以正常速度的 (-speed / 1000) 的速度反向播放。

__u32 format

播放输入格式

__u32 data[16]

保留

6.2.3.1.1.6.3. 描述

在使用之前,应用程序必须将结构体归零。这可确保将来可以安全地扩展它。


6.2.3.1.1.7. 预定义的解码器命令和标志

6.2.3.1.1.7.1. 概要

#define VIDEO_CMD_PLAY                      (0)
#define VIDEO_CMD_STOP                      (1)
#define VIDEO_CMD_FREEZE                    (2)
#define VIDEO_CMD_CONTINUE                  (3)

#define VIDEO_CMD_FREEZE_TO_BLACK      (1 << 0)

#define VIDEO_CMD_STOP_TO_BLACK        (1 << 0)
#define VIDEO_CMD_STOP_IMMEDIATELY     (1 << 1)

#define VIDEO_PLAY_FMT_NONE                 (0)
#define VIDEO_PLAY_FMT_GOP                  (1)

#define VIDEO_VSYNC_FIELD_UNKNOWN           (0)
#define VIDEO_VSYNC_FIELD_ODD               (1)
#define VIDEO_VSYNC_FIELD_EVEN              (2)
#define VIDEO_VSYNC_FIELD_PROGRESSIVE       (3)

6.2.3.1.1.7.2. 常量

解码器命令

VIDEO_CMD_PLAY

开始播放。

VIDEO_CMD_STOP

停止播放。

VIDEO_CMD_FREEZE

冻结播放。

VIDEO_CMD_CONTINUE

冻结后继续播放。

VIDEO_CMD_FREEZE 的标志

VIDEO_CMD_FREEZE_TO_BLACK

冻结时显示黑色图片。

VIDEO_CMD_STOP 的标志

VIDEO_CMD_STOP_TO_BLACK

停止时显示黑色图片。

VIDEO_CMD_STOP_IMMEDIATELY

立即停止,而不清空缓冲区。

播放输入格式

VIDEO_PLAY_FMT_NONE

解码器没有特殊的格式要求

VIDEO_PLAY_FMT_GOP

解码器需要完整的 GOP

场序

VIDEO_VSYNC_FIELD_UNKNOWN

如果硬件不知道 Vsync 是用于奇数场、偶数场还是渐进式(即非隔行扫描)场,则可以使用 FIELD_UNKNOWN。

VIDEO_VSYNC_FIELD_ODD

Vsync 用于奇数场。

VIDEO_VSYNC_FIELD_EVEN

Vsync 用于偶数场。

VIDEO_VSYNC_FIELD_PROGRESSIVE

渐进式(即非隔行扫描)


6.2.3.1.1.8. video_event

6.2.3.1.1.8.1. 概要

struct video_event {
    __s32 type;
#define VIDEO_EVENT_SIZE_CHANGED        1
#define VIDEO_EVENT_FRAME_RATE_CHANGED  2
#define VIDEO_EVENT_DECODER_STOPPED     3
#define VIDEO_EVENT_VSYNC               4
    long timestamp;
    union {
        video_size_t size;
        unsigned int frame_rate;
        unsigned char vsync_field;
    } u;
};

6.2.3.1.1.8.2. 变量

__s32 type

事件类型。

VIDEO_EVENT_SIZE_CHANGED

大小已更改。

VIDEO_EVENT_FRAME_RATE_CHANGED

帧率已更改。

VIDEO_EVENT_DECODER_STOPPED

解码器已停止。

VIDEO_EVENT_VSYNC

发生 Vsync。

long timestamp

发生时的 MPEG PTS。

union u

video_size_t size

视频的分辨率和宽高比。

unsigned int frame_rate

以每 1000 秒的帧数为单位

unsigned char vsync_field

未知/奇数/偶数/渐进式

6.2.3.1.1.8.3. 描述

这是由 VIDEO_GET_EVENT 调用返回的视频事件的结构。有关更多详细信息,请参阅此处。


6.2.3.1.1.9. video_status

6.2.3.1.1.9.1. 概要

VIDEO_GET_STATUS 调用返回以下结构,该结构提供有关播放操作的各种状态的信息。

struct video_status {
    int                    video_blank;
    video_play_state_t     play_state;
    video_stream_source_t  stream_source;
    video_format_t         video_format;
    video_displayformat_t  display_format;
};

6.2.3.1.1.9.2. 变量

int video_blank

冻结时显示空白视频?

TRUE ( != 0 )

冻结时显示空白屏幕。

FALSE ( == 0 )

显示最后解码的帧。

video_play_state_t play_state

当前播放状态。

video_stream_source_t stream_source

当前来源 (解复用/内存)。

video_format_t video_format

当前流的宽高比。

video_displayformat_t display_format

应用的裁剪模式。

6.2.3.1.1.9.3. 描述

如果设置 video_blankTRUE,当频道更改或播放停止时,视频将被消隐。否则,将显示最后一帧画面。play_state 指示视频当前是冻结、停止还是正在播放。stream_source 对应于视频流的选定来源。它可以来自解复用器或内存。video_format 指示当前播放的视频流的宽高比(4:3 或 16:9 之一)。最后,display_format 对应于应用的裁剪模式,以防源视频格式与输出设备的格式不同。


6.2.3.1.1.10. video_still_picture

6.2.3.1.1.10.1. 概要

struct video_still_picture {
char *iFrame;
int32_t size;
};

6.2.3.1.1.10.2. 变量

char *iFrame

指向内存中单个 I 帧的指针。

int32_t size

I 帧的大小。

6.2.3.1.1.10.3. 描述

通过 VIDEO_STILLPICTURE 调用显示的 I 帧在此结构中传递。


6.2.3.1.1.11. 视频功能

6.2.3.1.1.11.1. 概要

#define VIDEO_CAP_MPEG1   1
#define VIDEO_CAP_MPEG2   2
#define VIDEO_CAP_SYS     4
#define VIDEO_CAP_PROG    8

6.2.3.1.1.11.2. 常量

功能位的定义

VIDEO_CAP_MPEG1

硬件可以解码 MPEG1。

VIDEO_CAP_MPEG2

硬件可以解码 MPEG2。

VIDEO_CAP_SYS

视频设备接受系统流。

您仍然必须打开视频和音频设备,但只需将流发送到视频设备。

VIDEO_CAP_PROG

视频设备接受节目流。

您仍然必须打开视频和音频设备,但只需将流发送到视频设备。

6.2.3.1.1.11.3. 描述

调用 VIDEO_GET_CAPABILITIES 将返回一个无符号整数,其中根据硬件的功能设置以下位。


6.2.3.1.2. 视频函数调用

6.2.3.1.2.1. VIDEO_STOP

6.2.3.1.2.1.1. 概要

VIDEO_STOP
int ioctl(fd, VIDEO_STOP, int mode)

6.2.3.1.2.1.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_STOP

int mode

指示应如何处理屏幕。

TRUE ( != 0 )

停止时清空屏幕。

FALSE ( == 0 )

显示最后解码的帧。

6.2.3.1.2.1.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 仅适用于数字电视设备。要控制 V4L2 解码器,请改用 V4L2 ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD

此 ioctl 调用要求视频设备停止播放当前流。根据输入参数,屏幕可以被消隐或显示最后解码的帧。

6.2.3.1.2.1.4. 返回值

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


6.2.3.1.2.2. VIDEO_PLAY

6.2.3.1.2.2.1. 概要

VIDEO_PLAY
int ioctl(fd, VIDEO_PLAY)

6.2.3.1.2.2.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_PLAY

6.2.3.1.2.2.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 仅适用于数字电视设备。要控制 V4L2 解码器,请改用 V4L2 ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD

此 ioctl 调用要求视频设备开始播放来自选定来源的视频流。

6.2.3.1.2.2.4. 返回值

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


6.2.3.1.2.3. VIDEO_FREEZE

6.2.3.1.2.3.1. 概要

VIDEO_FREEZE
int ioctl(fd, VIDEO_FREEZE)

6.2.3.1.2.3.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_FREEZE

6.2.3.1.2.3.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 仅适用于数字电视设备。要控制 V4L2 解码器,请改用 V4L2 ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD

如果选择了 VIDEO_SOURCE_DEMUX,此 ioctl 调用将暂停正在播放的实时视频流。解码和播放被冻结。然后可以使用 VIDEO_CONTINUE 命令重新启动视频流的解码和播放过程。如果在 ioctl 调用 VIDEO_SELECT_SOURCE 中选择了 VIDEO_SOURCE_MEMORY,则数字电视子系统将不再解码任何数据,直到执行 ioctl 调用 VIDEO_CONTINUEVIDEO_PLAY

6.2.3.1.2.3.4. 返回值

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


6.2.3.1.2.4. VIDEO_CONTINUE

6.2.3.1.2.4.1. 概要

VIDEO_CONTINUE
int ioctl(fd, VIDEO_CONTINUE)

6.2.3.1.2.4.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_CONTINUE

6.2.3.1.2.4.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 仅适用于数字电视设备。要控制 V4L2 解码器,请改用 V4L2 ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD

此 ioctl 调用重新启动在调用 VIDEO_FREEZE 之前播放的视频流的解码和播放过程。

6.2.3.1.2.4.4. 返回值

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


6.2.3.1.2.5. VIDEO_SELECT_SOURCE

6.2.3.1.2.5.1. 概要

VIDEO_SELECT_SOURCE
int ioctl(fd, VIDEO_SELECT_SOURCE, video_stream_source_t source)

6.2.3.1.2.5.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_SELECT_SOURCE

video_stream_source_t source

指示视频流应使用哪个源。

6.2.3.1.2.5.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 仅适用于数字电视设备。此 ioctl 也受 V4L2 ivtv 驱动程序支持,但该驱动程序已被 ivtv 特有的 IVTV_IOC_PASSTHROUGH_MODE ioctl 替代。

此 ioctl 调用通知视频设备应将哪个源用于输入数据。可能的源是解复用器或内存。如果选择内存,则使用结构 video_stream_source_t 通过写入命令将数据馈送到视频设备。如果选择解复用器,则数据将直接从板载解复用器设备传输到解码器。

馈送到解码器的数据也由 PID 过滤器控制。输出选择:dmx_output DMX_OUT_DECODER

6.2.3.1.2.5.4. 返回值

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


6.2.3.1.2.6. VIDEO_SET_BLANK

6.2.3.1.2.6.1. 概要

VIDEO_SET_BLANK
int ioctl(fd, VIDEO_SET_BLANK, int mode)

6.2.3.1.2.6.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_SET_BLANK

int mode

指示是否应清空屏幕。

TRUE ( != 0 )

停止时清空屏幕。

FALSE ( == 0 )

显示最后解码的帧。

6.2.3.1.2.6.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 调用请求视频设备清除画面。

6.2.3.1.2.6.4. 返回值

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


6.2.3.1.2.7. VIDEO_GET_STATUS

6.2.3.1.2.7.1. 概要

VIDEO_GET_STATUS
int ioctl(fd, int request = VIDEO_GET_STATUS,
struct video_status *status)

6.2.3.1.2.7.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_GET_STATUS

struct video_status *status

返回视频设备的当前状态。

6.2.3.1.2.7.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 调用请求视频设备返回设备的当前状态。

6.2.3.1.2.7.4. 返回值

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


6.2.3.1.2.8. VIDEO_GET_EVENT

6.2.3.1.2.8.1. 概要

VIDEO_GET_EVENT
int ioctl(fd, int request = VIDEO_GET_EVENT,
struct video_event *ev)

6.2.3.1.2.8.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_GET_EVENT

struct video_event *ev

指向存储事件的位置(如果有)。

6.2.3.1.2.8.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 仅适用于 DVB 设备。要从 V4L2 解码器获取事件,请改用 V4L2 ioctl VIDIOC_DQEVENT ioctl。

如果可用,此 ioctl 调用将返回一个 video_event 类型的事件。最新事件中的一定数量将被排队,并按发生顺序返回。如果未及时获取,则较旧的事件可能会被丢弃。如果事件不可用,则行为取决于设备是处于阻塞模式还是非阻塞模式。在后一种情况下,调用会立即失败,并将 errno 设置为 EWOULDBLOCK。在前一种情况下,调用会阻塞,直到有事件可用。标准 Linux poll() 和/或 select() 系统调用可与设备文件描述符一起使用以监视新事件。对于 select(),文件描述符应包含在 exceptfds 参数中;对于 poll(),应将 POLLPRI 指定为唤醒条件。此 ioctl 调用仅需读取权限。

6.2.3.1.2.8.4. 返回值

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

EWOULDBLOCK

没有待处理的事件,并且设备处于非阻塞模式。

EOVERFLOW

事件队列溢出 - 一个或多个事件丢失。


6.2.3.1.2.9. VIDEO_SET_DISPLAY_FORMAT

6.2.3.1.2.9.1. 概要

VIDEO_SET_DISPLAY_FORMAT
int ioctl(fd, int request = VIDEO_SET_DISPLAY_FORMAT,
video_display_format_t format)

6.2.3.1.2.9.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_SET_DISPLAY_FORMAT

video_displayformat_t format

选择要使用的视频格式。

6.2.3.1.2.9.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 调用请求视频设备选择 MPEG 芯片在视频上应用的视频格式。

6.2.3.1.2.9.4. 返回值

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


6.2.3.1.2.10. VIDEO_STILLPICTURE

6.2.3.1.2.10.1. 概要

VIDEO_STILLPICTURE
int ioctl(fd, int request = VIDEO_STILLPICTURE,
struct video_still_picture *sp)

6.2.3.1.2.10.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_STILLPICTURE

struct video_still_picture *sp

指向存储包含 I 帧和大小的结构的存储位置的指针。

6.2.3.1.2.10.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 调用请求视频设备显示静止画面(I 帧)。输入数据应为包含 I 帧的基本视频流的一部分。通常,此部分是从 TS 或 PES 录制中提取的。设备必须支持分辨率和编解码器(请参阅 视频功能)。如果指针为 NULL,则当前显示的静止画面将被清除。

例如,AV7110 支持具有常用 PAL-SD 分辨率的 MPEG1 和 MPEG2。

6.2.3.1.2.10.4. 返回值

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


6.2.3.1.2.11. VIDEO_FAST_FORWARD

6.2.3.1.2.11.1. 概要

VIDEO_FAST_FORWARD
int ioctl(fd, int request = VIDEO_FAST_FORWARD, int nFrames)

6.2.3.1.2.11.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_FAST_FORWARD

int nFrames

要跳过的帧数。

6.2.3.1.2.11.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 调用请求视频设备跳过 N 个 I 帧的解码。仅当选择 VIDEO_SOURCE_MEMORY 时,才能使用此调用。

6.2.3.1.2.11.4. 返回值

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

EPERM

未选择模式 VIDEO_SOURCE_MEMORY


6.2.3.1.2.12. VIDEO_SLOWMOTION

6.2.3.1.2.12.1. 概要

VIDEO_SLOWMOTION
int ioctl(fd, int request = VIDEO_SLOWMOTION, int nFrames)

6.2.3.1.2.12.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_SLOWMOTION

int nFrames

重复每一帧的次数。

6.2.3.1.2.12.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 调用请求视频设备重复解码帧 N 次。仅当选择 VIDEO_SOURCE_MEMORY 时,才能使用此调用。

6.2.3.1.2.12.4. 返回值

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

EPERM

未选择模式 VIDEO_SOURCE_MEMORY


6.2.3.1.2.13. VIDEO_GET_CAPABILITIES

6.2.3.1.2.13.1. 概要

VIDEO_GET_CAPABILITIES
int ioctl(fd, int request = VIDEO_GET_CAPABILITIES, unsigned int *cap)

6.2.3.1.2.13.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_GET_CAPABILITIES

unsigned int *cap

指向要存储功能信息的位置的指针。

6.2.3.1.2.13.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 调用询问视频设备其解码功能。成功后,它将返回一个整数,该整数已根据 视频功能中的定义设置了位。

6.2.3.1.2.13.4. 返回值

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


6.2.3.1.2.14. VIDEO_CLEAR_BUFFER

6.2.3.1.2.14.1. 概要

VIDEO_CLEAR_BUFFER
int ioctl(fd, int request = VIDEO_CLEAR_BUFFER)

6.2.3.1.2.14.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_CLEAR_BUFFER

6.2.3.1.2.14.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 调用清除驱动程序和解码器硬件中的所有视频缓冲区。

6.2.3.1.2.14.4. 返回值

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


6.2.3.1.2.15. VIDEO_SET_STREAMTYPE

6.2.3.1.2.15.1. 概要

VIDEO_SET_STREAMTYPE
int ioctl(fd, int request = VIDEO_SET_STREAMTYPE, int type)

6.2.3.1.2.15.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_SET_STREAMTYPE

int type

流类型。

6.2.3.1.2.15.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 告诉驱动程序要期望写入的流的类型。智能解码器也可能不支持或忽略此调用(如 AV7110),并自行确定流类型。

当前使用的流类型

编解码器

流类型

MPEG2

0

MPEG4 h.264

1

VC1

3

MPEG4 Part2

4

VC1 SM

5

MPEG1

6

HEVC h.265

7
DREAMBOX: 22

AVS

16

AVS2

40

并非每个解码器都支持所有流类型。

6.2.3.1.2.15.4. 返回值

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


6.2.3.1.2.16. VIDEO_SET_FORMAT

6.2.3.1.2.16.1. 概要

VIDEO_SET_FORMAT
int ioctl(fd, int request = VIDEO_SET_FORMAT, video_format_t format)

6.2.3.1.2.16.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_SET_FORMAT

video_format_t format

电视的视频格式,如 video_format_t 部分所定义。

6.2.3.1.2.16.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 设置连接的输出设备(电视)的屏幕格式(宽高比),以便可以相应地调整解码器的输出。

6.2.3.1.2.16.4. 返回值

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


6.2.3.1.2.17. VIDEO_GET_SIZE

6.2.3.1.2.17.1. 概要

VIDEO_GET_SIZE
int ioctl(int fd, int request = VIDEO_GET_SIZE, video_size_t *size)

6.2.3.1.2.17.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_GET_SIZE

video_size_t *size

返回大小和宽高比。

6.2.3.1.2.17.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

此 ioctl 返回大小和宽高比。

6.2.3.1.2.17.4. 返回值

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


6.2.3.1.2.18. VIDEO_GET_PTS

6.2.3.1.2.18.1. 概要

VIDEO_GET_PTS
int ioctl(int fd, int request = VIDEO_GET_PTS, __u64 *pts)

6.2.3.1.2.18.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_GET_PTS

__u64 *pts

返回 ITU T-REC-H.222.0 / ISO/IEC 13818-1 中定义的 33 位时间戳。

如果可能,PTS 应属于当前播放的帧,但也可能是一个与之接近的值,例如最后一个解码帧的 PTS 或 PES 解析器提取的最后一个 PTS。

6.2.3.1.2.18.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

对于 V4L2 解码器,此 ioctl 已被 V4L2_CID_MPEG_VIDEO_DEC_PTS 控制取代。

此 ioctl 调用请求视频设备返回当前 PTS 时间戳。

6.2.3.1.2.18.4. 返回值

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


6.2.3.1.2.19. VIDEO_GET_FRAME_COUNT

6.2.3.1.2.19.1. 概要

VIDEO_GET_FRAME_COUNT
int ioctl(int fd, VIDEO_GET_FRAME_COUNT, __u64 *pts)

6.2.3.1.2.19.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_GET_FRAME_COUNT

__u64 *pts

返回自解码器启动以来显示的帧数。

6.2.3.1.2.19.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

对于 V4L2 解码器,此 ioctl 已被 V4L2_CID_MPEG_VIDEO_DEC_FRAME 控制取代。

此 ioctl 调用请求视频设备返回自解码器启动以来显示的帧数。

6.2.3.1.2.19.4. 返回值

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


6.2.3.1.2.20. VIDEO_COMMAND

6.2.3.1.2.20.1. 概要

VIDEO_COMMAND
int ioctl(int fd, int request = VIDEO_COMMAND,
struct video_command *cmd)

6.2.3.1.2.20.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_COMMAND

struct video_command *cmd

命令解码器。

6.2.3.1.2.20.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

对于 V4L2 解码器,此 ioctl 已被 ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD ioctl 取代。

此 ioctl 命令解码器。struct video_commandv4l2_decoder_cmd 结构体的子集,因此请参阅 ioctl VIDIOC_DECODER_CMD, VIDIOC_TRY_DECODER_CMD 文档以获取更多信息。

6.2.3.1.2.20.4. 返回值

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


6.2.3.1.2.21. VIDEO_TRY_COMMAND

6.2.3.1.2.21.1. 概要

VIDEO_TRY_COMMAND
int ioctl(int fd, int request = VIDEO_TRY_COMMAND,
struct video_command *cmd)

6.2.3.1.2.21.2. 参数

int fd

先前调用 open() 返回的文件描述符。

int request

对于此命令,等于 VIDEO_TRY_COMMAND

struct video_command *cmd

尝试解码器命令。

6.2.3.1.2.21.3. 描述

注意

不要在新驱动程序中使用!请参阅:通用说明

对于 V4L2 解码器,此 ioctl 已被 VIDIOC_TRY_DECODER_CMD ioctl 取代。

此 ioctl 尝试解码器命令。struct video_commandv4l2_decoder_cmd 结构体的子集,因此请参阅 VIDIOC_TRY_DECODER_CMD 文档以获取更多信息。

6.2.3.1.2.21.4. 返回值

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


6.2.3.1.2.22. open()

6.2.3.1.2.22.1. 概要

#include <fcntl.h>
int open(const char *deviceName, int flags)

6.2.3.1.2.22.2. 参数

const char *deviceName

特定视频设备的名称。

int flags

以下标志的按位或

O_RDONLY

只读访问

O_RDWR

读/写访问

O_NONBLOCK

以非阻塞模式打开
(阻塞模式为默认)

6.2.3.1.2.22.3. 描述

此系统调用打开一个命名的视频设备(例如 /dev/dvb/adapter?/video?)以供后续使用。

open() 调用成功后,该设备将准备好使用。阻塞或非阻塞模式的重要性在存在差异的函数的文档中进行了描述。它不会影响 open() 调用本身的语义。可以使用 fcntl 系统调用的 F_SETFL 命令将以阻塞模式打开的设备稍后置于非阻塞模式(反之亦然)。这是一个标准系统调用,记录在 Linux fcntl 手册页中。只有一个用户可以以 O_RDWR 模式打开视频设备。所有其他尝试以这种模式打开设备的尝试都将失败,并返回错误代码。如果视频设备以 O_RDONLY 模式打开,则唯一可以使用的 ioctl 调用是 VIDEO_GET_STATUS。所有其他调用都将返回错误代码。

6.2.3.1.2.22.4. 返回值

ENODEV

设备驱动程序未加载/不可用。

EINTERNAL

内部错误。

EBUSY

设备或资源忙。

EINVAL

无效的参数。


6.2.3.1.2.23. close()

6.2.3.1.2.23.1. 概要

int close(int fd)

6.2.3.1.2.23.2. 参数

int fd

先前调用 open() 返回的文件描述符。

6.2.3.1.2.23.3. 描述

此系统调用关闭先前打开的视频设备。

6.2.3.1.2.23.4. 返回值

EBADF

fd 不是有效打开的文件描述符。


6.2.3.1.2.24. write()

6.2.3.1.2.24.1. 概要

size_t write(int fd, const void *buf, size_t count)

6.2.3.1.2.24.2. 参数

int fd

先前调用 open() 返回的文件描述符。

void *buf

指向包含 PES 数据的缓冲区的指针。

size_t count

buf 的大小。

6.2.3.1.2.24.3. 描述

只有在 ioctl 调用 VIDEO_SELECT_SOURCE 中选择了 VIDEO_SOURCE_MEMORY 时,才能使用此系统调用。 除非功能允许其他格式,否则提供的数据应为 PES 格式。 TS 是存储 DVB 数据最常见的格式,通常也受支持。 如果未指定 O_NONBLOCK,则该函数将阻塞,直到有可用的缓冲区空间。 要传输的数据量由 count 暗示。

注意

参见: DVB 数据格式

6.2.3.1.2.24.4. 返回值

EPERM

未选择模式 VIDEO_SOURCE_MEMORY

ENOMEM

尝试写入的数据量超过了内部缓冲区所能容纳的大小。

EBADF

fd 不是有效打开的文件描述符。