6.2.3.3. DVB OSD 设备

注意

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

DVB OSD 设备控制基于 AV7110 的、带有硬件 MPEG2 解码器的 DVB 卡的屏幕显示。可以通过 /dev/dvb/adapter?/osd0 访问它。可以通过在应用程序中包含 linux/dvb/osd.h 来访问数据类型和 ioctl 定义。

OSD 不像许多其他卡上的帧缓冲区。它是一种可以绘图的画布。颜色深度受安装的内存大小限制。必须设置适当的调色板。可以使用 OSD_GET_CAPABILITY ioctl 识别已安装的内存大小。

6.2.3.3.1. OSD 数据类型

6.2.3.3.1.1. OSD_Command

6.2.3.3.1.1.1. 概要

typedef enum {
    /* All functions return -2 on "not open" */
    OSD_Close = 1,
    OSD_Open,
    OSD_Show,
    OSD_Hide,
    OSD_Clear,
    OSD_Fill,
    OSD_SetColor,
    OSD_SetPalette,
    OSD_SetTrans,
    OSD_SetPixel,
    OSD_GetPixel,
    OSD_SetRow,
    OSD_SetBlock,
    OSD_FillRow,
    OSD_FillBlock,
    OSD_Line,
    OSD_Query,
    OSD_Test,
    OSD_Text,
    OSD_SetWindow,
    OSD_MoveWindow,
    OSD_OpenRaw,
} OSD_Command;

6.2.3.3.1.1.2. 命令

注意

所有函数在“未打开”时返回 -2

命令

struct osd_cmd_t 的已使用变量。
用法{变量},如果使用替代方法。

描述

OSD_Close

禁用 OSD 并释放缓冲区。
成功时返回 0。

OSD_Open

x0,y0,x1,y1,
BitPerPixel[2/4/8]{color&0x0F},
mix[0..15]{color&0xF0}
使用此大小和位深度打开 OSD
成功时返回 0,
DRAM 分配错误时返回 -1,
“已打开”时返回 -2。

OSD_Show

启用 OSD 模式。
成功时返回 0。

OSD_Hide

禁用 OSD 模式。
成功时返回 0。

OSD_Clear

将所有像素设置为颜色 0。
成功时返回 0。

OSD_Fill

颜色

将所有像素设置为颜色 <color>。
成功时返回 0。

OSD_SetColor

颜色,
R{x0},G{y0},B{x1},
opacity{y1}
将调色板条目 <num> 设置为 <r,g,b>,应用 <mix> 和 <trans>
R,G,B: 0..255
R=红色,G=绿色,B=蓝色
opacity=0: 像素不透明度 0%(仅显示视频像素)
opacity=1..254: 像素不透明度如标头中指定
opacity=255: 像素不透明度 100%(仅显示 OSD 像素)
成功时返回 0,错误时返回 -1。

OSD_SetPalette

firstcolor{color},
lastcolor{x0},data
设置调色板中的多个条目。
从数组 “data” 设置 “firstcolor” 到 “lastcolor” 的条目。
每个颜色数据有 4 个字节
R、G、B 和一个不透明度值:0->透明,1..254->混合,255->像素

OSD_SetTrans

transparency{color}

设置混合像素的透明度(0..15)。
成功时返回 0。

OSD_SetPixel

x0,y0,color

将像素 <x>,<y> 设置为颜色编号 <color>。
成功时返回 0,错误时返回 -1。

OSD_GetPixel

x0,y0

返回像素 <x>,<y> 的颜色编号,或 -1。
AV7110 当前不支持的命令!

OSD_SetRow

x0,y0,x1,data

用 data[] 的内容填充像素 x0,y 到 x1,y。
成功时返回 0,裁剪所有像素时返回 -1(没有绘制任何像素)。

OSD_SetBlock

x0,y0,x1,y1,
increment{color},
data
用 data[] 的内容填充像素 x0,y0 到 x1,y1。
Inc 包含数据块中一行的宽度,
inc<=0 将块宽度用作行宽。
成功时返回 0,裁剪所有像素时返回 -1。

OSD_FillRow

x0,y0,x1,color

用颜色 <color> 填充像素 x0,y 到 x1,y。
成功时返回 0,裁剪所有像素时返回 -1。

OSD_FillBlock

x0,y0,x1,y1,color

用颜色 <color> 填充像素 x0,y0 到 x1,y1。
成功时返回 0,裁剪所有像素时返回 -1。

OSD_Line

x0,y0,x1,y1,color

用颜色 <color> 从 x0,y0 到 x1,y1 绘制一条线。
成功时返回 0。

OSD_Query

x0,y0,x1,y1,
xasp{color}; yasp=11
用图片尺寸和像素宽高比填充参数。
成功时返回 0。
AV7110 当前不支持的命令!

OSD_Test

绘制测试图片。
仅用于调试目的。
成功时返回 0。

OSD_Text

x0,y0,size,color,text

在位置 x0,y0 用颜色 <color> 绘制文本。

OSD_SetWindow

x0

将窗口编号 0<x0<8 设置为当前窗口。

OSD_MoveWindow

x0,y0

将当前窗口移动到 (x0, y0)。

OSD_OpenRaw

x0,y0,x1,y1,

打开其他类型的 OSD 窗口。

6.2.3.3.1.1.3. 描述

OSD_Command 数据类型与 OSD_SEND_CMD ioctl 一起使用,以告诉驱动程序要执行哪个 OSD_Command。


6.2.3.3.1.2. osd_cmd_t

6.2.3.3.1.2.1. 概要

typedef struct osd_cmd_s {
    OSD_Command cmd;
    int x0;
    int y0;
    int x1;
    int y1;
    int color;
    void __user *data;
} osd_cmd_t;

6.2.3.3.1.2.2. 变量

OSD_Command cmd

要执行的 OSD_Command

int x0

第一个水平位置。

int y0

第一个垂直位置。

int x1

第二个水平位置。

int y1

第二个垂直位置。

int color

调色板中颜色的编号。

void __user *data

命令特定数据。

6.2.3.3.1.2.3. 描述

osd_cmd_t 数据类型与 OSD_SEND_CMD ioctl 一起使用。它包含 OSD_Command 的数据和 OSD_Command 本身。该结构必须传递给驱动程序,并且其组件可能会被修改。


6.2.3.3.1.3. osd_raw_window_t

6.2.3.3.1.3.1. 概要

typedef enum {
    OSD_BITMAP1,
    OSD_BITMAP2,
    OSD_BITMAP4,
    OSD_BITMAP8,
    OSD_BITMAP1HR,
    OSD_BITMAP2HR,
    OSD_BITMAP4HR,
    OSD_BITMAP8HR,
    OSD_YCRCB422,
    OSD_YCRCB444,
    OSD_YCRCB444HR,
    OSD_VIDEOTSIZE,
    OSD_VIDEOHSIZE,
    OSD_VIDEOQSIZE,
    OSD_VIDEODSIZE,
    OSD_VIDEOTHSIZE,
    OSD_VIDEOTQSIZE,
    OSD_VIDEOTDSIZE,
    OSD_VIDEONSIZE,
    OSD_CURSOR
} osd_raw_window_t;

6.2.3.3.1.3.2. 常量

OSD_BITMAP1

1 位位图

OSD_BITMAP2

2 位位图

OSD_BITMAP4

4 位位图

OSD_BITMAP8

8 位位图

OSD_BITMAP1HR

1 位位图半分辨率

OSD_BITMAP2HR

2 位位图半分辨率

OSD_BITMAP4HR

4 位位图半分辨率

OSD_BITMAP8HR

8 位位图半分辨率

OSD_YCRCB422

4:2:2 YCRCB 图形显示

OSD_YCRCB444

4:4:4 YCRCB 图形显示

OSD_YCRCB444HR

4:4:4 YCRCB 图形半分辨率

OSD_VIDEOTSIZE

真实大小的普通 MPEG 视频显示

OSD_VIDEOHSIZE

MPEG 视频显示半分辨率

OSD_VIDEOQSIZE

MPEG 视频显示四分之一分辨率

OSD_VIDEODSIZE

MPEG 视频显示双倍分辨率

OSD_VIDEOTHSIZE

真实大小的 MPEG 视频显示半分辨率

OSD_VIDEOTQSIZE

真实大小的 MPEG 视频显示四分之一分辨率

OSD_VIDEOTDSIZE

真实大小的 MPEG 视频显示双倍分辨率

OSD_VIDEONSIZE

全尺寸 MPEG 视频显示

OSD_CURSOR

光标

6.2.3.3.1.3.3. 描述

osd_raw_window_t 数据类型与 OSD_Command OSD_OpenRaw 一起使用,以告诉驱动程序要打开哪种类型的 OSD。


6.2.3.3.1.4. osd_cap_t

6.2.3.3.1.4.1. 概要

typedef struct osd_cap_s {
    int  cmd;
#define OSD_CAP_MEMSIZE         1
    long val;
} osd_cap_t;

6.2.3.3.1.4.2. 变量

int  cmd

要查询的功能。

long val

用于存储数据。

6.2.3.3.1.4.3. 支持的功能

OSD_CAP_MEMSIZE

卡上安装的内存大小。

6.2.3.3.1.4.4. 描述

此数据结构与 OSD_GET_CAPABILITY 调用一起使用。


6.2.3.3.2. OSD 函数调用

6.2.3.3.2.1. OSD_SEND_CMD

6.2.3.3.2.1.1. 概要

OSD_SEND_CMD
int ioctl(int fd, int request = OSD_SEND_CMD, enum osd_cmd_t *cmd)

6.2.3.3.2.1.2. 参数

int fd

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

int request

指向此命令的 osd_cmd_t 结构体所在位置的指针。

6.2.3.3.2.1.3. 描述

注意

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

此 ioctl 将 OSD_Command 发送到卡。

6.2.3.3.2.1.4. 返回值

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

EINVAL

命令超出范围。


6.2.3.3.2.2. OSD_GET_CAPABILITY

6.2.3.3.2.2.1. 概要

OSD_GET_CAPABILITY
int ioctl(int fd, int request = OSD_GET_CAPABILITY,
struct osd_cap_t *cap)

6.2.3.3.2.2.2. 参数

int fd

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

int request

对于此命令,等于 OSD_GET_CAPABILITY

unsigned int *cap

指向此命令的 osd_cap_t 结构体所在位置的指针。

6.2.3.3.2.2.3. 描述

注意

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

此 ioctl 用于获取正在使用的基于 AV7110 的 DVB 解码卡的 OSD 功能。

注意

结构体 osd_cap_t 必须由用户设置并传递给驱动程序。

6.2.3.3.2.2.4. 返回值

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

EINVAL

不支持的功能。


6.2.3.3.2.3. open()

6.2.3.3.2.3.1. 概要

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

6.2.3.3.2.3.2. 参数

const char *deviceName

特定 OSD 设备的名称。

int flags

以下标志的按位或

O_RDONLY

只读访问

O_RDWR

读/写访问

O_NONBLOCK

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

6.2.3.3.2.3.3. 描述

此系统调用打开一个命名的 OSD 设备(例如,/dev/dvb/adapter?/osd0),以便后续使用。

6.2.3.3.2.3.4. 返回值

ENODEV

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

EINTERNAL

内部错误。

EBUSY

设备或资源忙。

EINVAL

参数无效。


6.2.3.3.2.4. close()

6.2.3.3.2.4.1. 概要

int close(int fd)

6.2.3.3.2.4.2. 参数

int fd

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

6.2.3.3.2.4.3. 描述

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

6.2.3.3.2.4.4. 返回值

EBADF

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