SunVideo Plus 1.3 用户指南：SunVideo Plus 的 XIL 属性

上一页 | 下一页 | 目录
SunVideo Plus 1.3 用户指南

# 5

# SunVideo Plus 的 XIL 属性

本章叙述 SunVideo Plus 专有的 XIL 属性。所提供的信息假定您熟悉视频压缩、图像以及相关 XIL 功能（说明见《XIL Programmer's Guide》）的概念。

XIL 通过延迟的执行方案操作。延迟执行查找可以组成分子的原子操作的特定序列，以减少执行时间。加速的分子列在本章的“分子”这一节。有关 XIL 编程的全面信息，请参阅《Solaris XIL 1.0, Imaging Library Programmer's Guide》。各个 XIL 实例的源代码包括在开发者工具包中。这些实例对于开发者使用 XIL 和 SunVideo Plus 卡是一个好的起点。

`MMACo1k` 是 SunVideo Plus 卡的 XIL 软件驱动程序。到 `MMACo1k` 的接口通过下列 XIL 调用：

- `xil_device_create`(3)

- `xil_device_set_value`(3)

- `xil_create_from_device`(3)

- `xil_get_device_attribute`(3)

- `xil_set_device_attrribute`(3)

对于 `xil_device_create`(3)，设备参数应该是 `MMACo1k`。对于 `xil_create_from_device`(3)，设备名参数应该是 `MMACo1k`，而 `deviceObj` 参数可以是 NULL，在这种情况下 `/dev/o1k0` 是打开的。要打开另一个设备（例如 `/dev/o1k1`），创建 `MMACo1k` 设备，用 `xil_device_set_value`(3) 设置该设备的 DEVICE_NAME 属性。返回的图像将是 640x480 (NTSC) 或 768x576 (PAL) 三带 YUV 图像。

## 属性概览

为支持二进制兼容，可部分支持某些没有 SunVideo Plus 的特殊应用的 SunVideo 属性。

设置设备属性有两种方法：一种方法是在用 `xil_create_from_device`(3) 函数创建设备图像之前调用 `xil_device_create`(3) 和 `xil_device_set_value`(3) 函数。另一种方法是在调用 `xil_create_from_device`(3) 后调用 `xil_device_set_value`(3)。某些属性要求用第一种方法设置（例如 DEVICE_NAME），在后面的章节中列出了这些属性。有关更多的信息，请参阅“重要属性信息”。

下面的一般设备属性是 `MMACo1k` 设备所具有的，而且 受 SunVideo 支持：

- DEVICE_NAME

- FORMAT

- IMAGE_SKIP

- PORT_V

- MAX_BUFFERS

- PORT

- NUM_BUFFER

- FIRST_SCANLINE

- FULL_BUFFERS

- FLUSH_BUFFERS

- FORMAT_V

下面的设备属性无效，但是 SunVideo Plus 以合理的方式忽略或处理它们，以支持与 SunVideo 的二进制和源兼容。

- MPEG_RATE_CONTROL

- MPEG_FIXED_QUANT

- MPEG_WEIGHTS

- FILE DESCRIPTOR

- FRAME_NUMBER

- TIMESTAMP

下面是 SunVideo Plus 视频属性：

- HUE

- H261_PIP

- CHROMA_GAIN_V

- CHROMA_GAIN_U

- BRIGHTNESS

- CONTRAST

- H261_BIT_RATE

- H261_MAX_QUANT

- H261_IBLOCK_REFRESH

- H261_FUR

以下各节详细说明了这些属性。注意：某些属性为“只设置”的，而其它属性为“只读取”的。这在每个属性的 ACCESS 标题下加以注释。其中的一些属性也是 SunVideo Plus 控制面板的参数。虽然给出了缺省值，但是真正的缺省值是控制面板中上次设定的值，或者前一个 XIL 设置属性调用时的值。这些属性在其 DEFAULT（缺省值）项前有星号 (*) 标记。有关更多信息，请参阅“SunVideo Plus 控制面板和 XIL 属性”。

## 一般属性

### DEVICE_NAME

该属性设置 `o1k` (SunVideo Plus) 设备的路径名。必须在创建设备图像前使用 `xil_device_create`(3) 和 `xil_device_set_value`(3) 函数设置该属性。

访问：set/get
类型：char *
缺省值："/dev/o1k0"

### PORT_V

该属性定义三个端口中的哪一个捕获视频信号。

0 | S_VIDEO 端口
1 | 混合视频端口 #1
2 | 混合视频端口 #2

访问：set/get
类型：int
缺省值：1

### PORT

该属性是设置端口的字符串接口。

S VIDEO | S_VIDEO 端口
COMPOSITE VIDEO 1 | 混合视频端口 #1
COMPOSITE VIDEO 2 | 混合视频端口 #2

访问：set/get
类型：char *
* 缺省值："COMPOSITE VIDEO 1"

### FORMAT_V

如果制式未知，则该属性返回 0；如果从 PAL 捕获，则返回 1；如果从 NTSC 捕获，则返回 2。有关更多的信息，请参阅“视频端口、制式和自动制式检测”。

访问：get
类型：int

### FORMAT

该属性返回捕获到的视频制式（NTSC、PAL 或 UNKNOWN）。有关更多的信息，请参阅“视频端口、制式和自动制式检测”。

访问：get
类型：char *

### IMAGE_SKIP

该属性设置并返回捕获间跳过的图像数。可以使用 IMAGE_SKIP 属性确定图像移动的速度。例如，支持安全照相机的应用程序可以使用该属性以 30 秒的时间间隔提供图像。

另一个实例是：当要限制帧速率以匹配特定网络带宽时，使用 IMAGE_SKIP。要以大约 10 fps 的速率捕获 NTSC 帧，就需要将 IMAGE_SKIP 属性设置为 2。这将使 SunVideo Plus 卡每三帧捕获一帧。

访问：set/get
类型：int
缺省值：0

### MAX_BUFFERS

该属性设置并返回压缩帧的最大数目，该数目是 XIL SunVideo Plus 驱动程序等待应用程序经由压缩调用来检索的过程中可以容纳的最多帧数。它必须在 1 到 10 之间，参见下图。该值会调整以提供与可用内存相适应的缓冲区数。

##### 图 5-1 最大缓冲区数

访问：set/get
类型：integer
缺省值：2

### NUM_BUFFERS

该属性返回一个整数，指定可用于容纳压缩帧的实际缓冲区数。NUM_BUFFERS 的值小于或等于 MAX_BUFFERS 属性的值。

NUM_BUFFERS 属性在执行第一次捕获（或者捕获/压缩）操作后返回有效值。

访问：set
类型：integer

### FULL_BUFFERS

该属性返回一个整数，指定当前包含有效数据的缓冲区数。FULL_BUFFERS 属性在执行第一次捕获（或者捕获/压缩）操作后返回有效值。

访问：get
类型：integer

### FLUSH_BUFFERS

如果设置了 FLUSH_BUFFERS 属性，则在捕获下一个图像前，所有保存的缓冲区将被清除。该操作完成后，FULL_BUFFERS 的值设置为 0。将忽略设置属性调用的输入值。

访问：set
类型：void

## 视频属性

以下属性影响各种视频特性。注意：这些属性可以通过 XIL 编程或 SunVideo Plus 控制面板（说明见“使用 SunVideo Plus 控制面板”）控制。尽管此处给出了缺省值，但真正的缺省值是控制面板或 XIL 程序控制上次设置的值。

### HUE

该属性影响输入视频信号的色调。

访问：set/get
类型：int（范围在 -128 到 +127 之间）
* 缺省值：0

### CHROMA_GAIN_U

该属性影响输入视频信号 U 组件的颜色增益。

访问：set/get
类型：int（范围在 -128 到 +127 之间）
* 缺省值：0

### CHROMA_GAIN_V

该属性影响输入视频信号 V 组件的颜色增益。

访问：set/get
类型：int（范围在 0 到 511 之间）
* 缺省值：180

### CONTRAST

该属性影响输入视频信号 luma 部分的对比度。

访问：set/get
类型：int（范围在 0 到 511 之间）
* 缺省值：216

### LUMA_BRIGHTNESS

该属性影响输入视频信号 luma 部分的整体亮度级别。

访问：set/get
类型：int（范围在 -128 到 +127 之间）
* 缺省值：0

## H.261 属性

这些属性是与 H.261 压缩或解压缩配合使用时 SunVideo Plus 所特有的。如果不执行基于硬件的压缩或解压缩，这些属性不起作用。

### H261_BIT_RATE

该属性设置所需的最大压缩比特率。该比特率以每秒 1000 比特为单位。例如，缺省值 256 将产生最大比特率 256000 比特/秒（32000 字节/秒）。

访问：set/get
类型：int（单位 KB/秒）
缺省值：256

### H261_MAX_QUANT

该属性设置所需的最大量化值。随着量化因子的降低，压缩图像的质量将改进。由于较低的量化通常导致每幅图像比特数增加，因此指定比特率的帧速率将减少。反之亦然。

访问：set/get
类型：int（范围：1 到 31）
缺省值：10

### H261_IBLOCK_REFRESH

该属性设置在压缩方式用内部编码块来更新指定的 H261 宏模块之前所需的时间（单位为毫秒）。H261 要求每个宏模块每 132 帧编码为一个内部编码块。如果按 10 fps 进行压缩，就意味着指定块在 13 秒内可能未进行内部编码。在有损耗的网络上，丢失帧在视觉上将导致解压缩后图像的块扭曲。需要等 13 秒才刷新这些坏块，这可能难以接受。该属性的用途是在损耗的网络中传输 H261 流时加速宏模块的刷新速度。

访问：set/get
类型：int
缺省值：1500（毫秒）

### H261_FUR

设置该标志将向 H.261 压缩方式发出快速更新请求。快速更新基本是针对内帧/主要帧的请求。

访问：set/get
类型：XIL_boolean
缺省值：FALSE

### H261_PIP

该标志通知 H.261 解码器将本地视图的图像嵌在解压缩图像的左上角。如果没有执行硬件压缩，则嵌入的图像为灰色。

访问：set/get
类型：XIL_boolean
缺省值：FALSE

### HW_DECOMPRESS_CIS

该属性选择要执行硬件加速解压缩的 CIS。缺省值 NULL 意味着将解压缩分子遇到的第一个 CIS 作为硬件加速解压缩的目标。一旦选定某个 CIS，则硬件解压缩分子所遇到的其它所有 CIS 将被拒绝，并且通过适当的 XIL 软件解码器进行解压缩。最好使用值 -1 来禁止基于硬件的解压缩。

因为 XIL 没有将 CIS 的损坏通知解压缩器的机制，所以还必须设置该属性以在新 CIS 上执行硬件加速解压缩。

访问：set/get
类型：XilCis
缺省值：NULL

## 重要属性信息

注意 - XIL 1.3 属性目前不支持 get 属性。

### 视频端口、制式和自动制式检测

XIL 驱动程序的缺省行为是在创建设备图像期间在选定视频端口上自动检测视频制式。完成该自动检测序列大约需 1.5 秒。如果知道视频制式，可以将 SunVideo Plus 控制面板上的视频制式从 AUTO 设置为已知制式（NTSC 或 PAL）。这样将不执行自动制式检测。

目前，SunVideo Plus 不支持在不同视频端口上使用两种不同的视频制式（例如 NTSC 或 PAL）并在它们之间进行动态切换。在 XIL 应用程序中创建设备图像后，SunVideo Plus 驱动程序就可能自动检测选定视频端口上的视频制式。因此，如果确实在不同输入端口上插入了不同的视频制式，则最好在创建设备图像前用 xil_device_set_value(3) 设置所需的视频端口。如果没有将视频插入缺省视频端口（端口1）中，也应该执行上述操作。

### HW 解压缩和 CIS 选择

HW_DECOMPRESS_CIS 属性可用于有选择地设置使用硬件加速解压缩的 CIS。在执行任何 XIL 解压缩分子前，将解压缩多个 CIS 的应用程序应该将该属性设置为 -1。这将防止不想执行硬件解码的 CIS 上的解压缩分子附加到硬件上。在确实要在其上执行硬件解压缩的 CIS 上执行解压缩分子前，设置 HW_DECOMPRESS_CIS 属性。

### HW 解压缩和创建 XIL 设备

执行基于硬件的解压缩时，SunVideo Plus 象 XIL 计算设备一样对 XIL 分子起加速作用。对于仅使用解压缩的应用程序，没有必要象“创建范例 MMACo1k 设备图像”中所述的那样创建 `xil` 设备和设备图像。在应用程序要设置影响解压缩的设备特有属性时除外。在 XIL 中不能在类似 SunVideo Plus 等的计算设备上设置某些类型的属性，只能直接打开设备并设置属性。因此，要使用这些属性，必须创建 xil 设备和图像。有关更多的信息，请参阅 “XIL 源示例”。

如果设备和设备图像不是由应用程序直接创建的，则基于硬件的 SunVideo Plus XIL 解压缩分子将隐式完成该工作。但是，目前分子并不搜索可用的硬件设备用作加速器。目前它们试图使用系统中的第一个设备
(`/dev/o1k0`)。因此，如果系统中安装了多块 SunVideo Plus 卡，则目前将每块卡用作硬件加速解压缩设备的唯一方式就是在应用程序中直接创建设备和设备图像，并且为创建的每个设备使用不同的设备名。有关更多的信息，请参阅“XIL 源示例”。

### 使用 HW 压缩和 HW 解压缩

前一节解释了 SunVideo Plus 的硬件解压缩分子在没有创建设备和设备图像时将隐式地创建设备和设备图像。因此，如果应用程序执行了解压缩分子，然后创建了 MMACo1k 设备和设备图像，它将接收由解压缩分子以前隐式创建的设备和图像。但是，就删除设备图像而言，XIL 中还有问题。因此，如果硬件压缩和解压缩均要在应用程序中进行，就要求应用程序在第一个硬件解压缩分子出现前直接创建设备和设备图像。

### SunVideo Plus 控制面板和 XIL 属性

SunVideo Plus 控制面板中所有与视频相关的参数都有 XIL 属性，这些属性使应用程序开发员可以通过编程来更改这些参数。XIL 中的这些属性没有缺省值，因为缺省值是由控制面板设置的当前值。因此，除非应用程序明确设置了指定视频属性，否则就使用控制面板中的值。

这是 SunVideo Plus 的功能之一。它使 XIL 应用程序不必设置视频参数（例如亮度、对比度等）。因此，最终用户可以一次性为视频源调整所有这些视频参数，而不必在每次运行 XIL 应用程序时都对参数进行相同更改。

注意：这些 XIL 属性和控制面板中参数有相同的源。因此，通过 XIL 设置属性调用更改任一参数时也将更改控制面板中的相应值。例如，如果 XIL 应用程序将亮度设置为指定值然后退出，则运行的下一个 XIL 应用程序将使用新的亮度设定，除非它也设置新值。

## 分子

下面列出了 MMACo1k 设备当前支持的颜色和灰度级分子。

- 颜色分子

  - capture > scale8nearest

  - capture > [scale8nearest >] colorconvert

  - capture > [rescale8>][scale8nearest>] ordereddither8_8

  - capture > scale8nearest > rescale8 > orderedditther8_8

- 压缩分子

  - capture > [scale8nearest] compress_CellB

  - capture > [scale8nearest] compress_Jpeg

  - capture > [scale8nearest] compress_Mpeg1

  - capture > [scale8nearest] compress_H261

  - capture > [scale8nearest] compress_UYVY

- 灰度级分子

  - capture > scale8nearest

  - capture > [scale8nearest >[[addconst8 >] addconst8 >] addconst8

  - capture > [scale8nearest][threshold8 >] threshold8

  - capture > [scal8nearest][threshold8 >] threshold8 > addconst8

- 解压缩分子

  - decompress_H261

  - decompress_H261 > [rescale8 >] ordereddither8_8

  - decompress_H261 > colorconvert

  - decompress_H261 > [rescale8 >] ordereddither8_8 > display_ioSUNWgx

## 错误

下表列出 `MMACo1k` 设备驱动程序的错误信息。

#### 表 5-1 `MMACo1k` 错误信息

错误信息 | 说明
`MMACo1k`-1 | `MMACo1k`：无效端口说明
`MMACo1k`-4 | `MMACo1k`：无法打开 `MMACo1k` 设备。失败的原因会在缺省错误处理程序中打印。可能的原因包括： - 另一个程序正在使用该设备。 - 未安装该设备。 - 程序引用的设备号是错误的。
`MMACo1k`-5 | `MMACo1k`：无法设置视频特性。程序不能设置端口特性。
要获取其它 XIL 错误信息的列表，参阅《XIL Programmer's Guide》的附录 B。

## 创建范例 `MMACo1k` 设备图像

创建附加到 SunVideo Plus 卡的设备图像，并将视频端口设置为 COMPOSITE VIDEO 2。为此，键入：

    # XilImage image
    # XilDevice image

其中，image = `xil_create_from_device`(state, "`MMACo1k`", device);
device = `xil_device_create`(state, "`MMACo1k`")
`xil_device_set_value`(device, "`DEVICE_NAME`", (void *) "`/dev/o1k0`");
`xil_device_set_value`(device, "PORT", (void *) "COMPOSITE VIDEO 2")

## XIL 源实例

有关使用 XIL 编程接口进行编程的最佳信息来源是开发员工具包中所提供的 XIL 实例。下表列出了这些实例。

#### 表 5-2 XIL 源实例

XIL 源实例 | 说明
`xil_display` | 视频捕获和显示实例。该实例可以很方便地修改为视频录制器或播放器。
`xil_compress` | 视频压缩实例。该实例显示如何压缩并保存成各种磁盘压缩格式。此外还举例说明如何设定设备特有属性（例如 H.261 的比特率设定）。
`xil_decompress` | 如何执行视频解压缩的实例。一般而言，该实例不需要基于硬件的实体提供解压缩，因为 XIL 软件解码器会隐式地完成此工作。但是该实例显示了如何使用 SunVideo Plus 基于硬件的 H261 解压缩。
`xil_broadcast` | 该实例显示如何捕获和压缩视频，还提供了一种利用 UDP 通过网络广播该视频的方法。
`xil_receive` | 该实例显示如何从 `xil_broadcast` 接收视频以及如何对其进行解压缩和显示。
`xilh_broadcast` | 与 `xil_broadcast` 相同，但添加了 H261。
`xilh_receive` | 与 `xil_receive` 相同，但添加了 H261。
`o1k_conf` | 使用 XIL 和 `libotiaudio` 的 GUI 点对点式会议应用程序。

上一页 | 下一页 | 目录