6.2.3.1. DVB 视频设备

注意

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

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

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

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

V4L2 也使用这些 ioctl 来控制 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

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

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_blank TRUE,则如果更改频道或停止播放,视频将被空白。否则,将显示最后一张图片。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

指向内存中单个 iframe 的指针。

int32_t size

iframe 的大小。

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 仅适用于数字电视设备。V4L2 ivtv 驱动程序也支持此 ioctl,但该 ioctl 已被 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 不是有效的打开文件描述符。