跳转到内容

DVD-Video/交互机内部

来自维基教科书,开放的书籍,为开放的世界

DVD-Video 指定了一个低级 机器语言 指令集,用于定义与用户的交互。当用户选择屏幕上的按钮时,会调用指令序列,并且还可能在其他各种点触发,例如单元格或 PGC 的末尾,或者当光盘插入播放器时。

指令集通常被称为“VM”(虚拟机)语言,但将其称为“虚拟”意味着不可能有真正的硬件直接实现该指令集。但为什么不能呢?这就是我在这里使用“交互机”一词的原因,它更清楚地说明了指令集的用途。

(请注意,我避免在该指令集的指令序列中使用“程序”一词,因为该词在 DVD-Video 中已经有完全不同的含义。)

基本概念

[编辑 | 编辑源代码]

数据模型

[编辑 | 编辑源代码]

唯一可用的数据存储包括 16 个通用参数寄存器 (GPRMs) 和 24 个系统参数寄存器 (SPRMs)。每个寄存器都包含一个 16 位无符号整数值。顾名思义,GPRMs 可以自由用于任何目的,而 SPRMs 具有预定义的含义。

任何 GPRM 也可置于计数器模式,其值每秒递增一次。

指令格式

[编辑 | 编辑源代码]

每个指令为 8 个字节,可以编码最多 3 个独立的操作,每个操作最多来自以下类别之一

  • 设置寄存器
  • 转移控制
  • 执行比较,其结果用于控制指令其余部分的条件执行。

第一个字节的最高三位定义了指令组,如下所示

  • 组 0:杂项(包括指令序列内的控制转移)。这些也可以根据格式 1(如下)进行条件化。
  • 组 1:链接/跳转/调用:视频流部分之间的控制转移。链接指令可以根据格式 1 进行条件化,而跳转和调用使用条件格式 2。
  • 组 2:设置 SPRM。这也包括设置 GPRM 进入计数器模式的指令。这些可以根据格式 2 进行条件化,或者与链接结合使用,但不能同时使用两者。
  • 组 3:设置 GPRM。这些可以根据格式 3 进行条件化,或者与链接结合使用,但不能同时使用两者。

组 4、5 和 6 执行设置 GPRM、比较和链接,全部在一个指令中,但三个操作相互作用如下

  • 组 4:执行设置,执行比较,并有条件地链接。
  • 组 5:执行比较,并有条件地设置和链接。
  • 组 6:执行比较,并有条件地执行设置。始终链接。

组 7 似乎没有使用。

寄存器编号:读取寄存器值的字段为 8 位宽,可以访问 GPRMs 和 SPRMs。位 7 为 0 表示访问 GPRM,1 表示访问 SPRM。实际寄存器编号位于其他位的范围内。

文字操作数:某些指令形式允许指令内包含 16 位文字操作数的值。这始终以大端序存储,即最高有效字节在前。

交互指令可以在以下位置找到

  • 一个单元格可以以一个单一指令结束,该指令在单元格播放完毕时执行。
  • 一个按钮指定一个单一指令,在选中按钮时执行。
  • PGC 的前置部分和后置部分可以分别包含一系列指令,分别在 PGC 开始播放之前和播放完毕之后执行。
  • FPC 包含一系列指令,这些指令在光盘插入播放器时自动开始执行。

按钮上的单指令限制在实践中不是一个大问题;单指令很容易是“将 GPRM i 设置为 j 并链接到 PGC 的后置部分”,以便在 PGC 后置部分执行一系列更长的指令,这些指令根据 GPRM i 的值对不同按钮执行不同的操作。

系统参数寄存器

[编辑 | 编辑源代码]

在下表中,“可写”表示是否存在明确写入该寄存器的指令。不可写寄存器可能会通过控制转移指令或在播放过程中自动更改(这些可能会更改当前标题/PGC/章节),或者由用户通过某些设备提供的界面明确更改(例如首选视频和语言设置),或者可能是只读的(例如播放器音频功能、区域掩码)。

ISO-639 语言代码和 ISO-3166 国家代码表示为整数,高字节包含第一个字符,低字节包含第二个字符。

编号 名称 含义 可写
0 首选菜单语言,ISO-639 代码 N
1 ASTN 音频流号 0-7,或 15 表示无 Y
2 SPSTN 字幕流号,位于位 0-5 中,位 6 也必须设置才能显示。普通流号为 0-31,但特殊值 62 表示“无”,63 表示“强制”(菜单需要)。 Y
3 AGLN 角度号,1-9 Y
4 TTN 整个光盘上的标题号,1-99 N
5 VTS_TTN 标题集中的标题号,1-99 N
6 TT_PGCN PGC 号,1-32767 N
7 PTTN 章节 (PTT) 号,1-99 N
8 HL_BTNN 高亮按钮号 × 1024。因此,有效值为 0(无按钮高亮)、1024(高亮按钮 1)、2048(高亮按钮 2).. 36864(高亮按钮 36) Y
9 NVTMR 导航计时器(以秒为单位),0-65535 Y
10 NV_PGCN 导航计时器到期时要跳转到的 PGC 号,1-32767,必须在当前标题中 Y
11 AMXMD 卡拉 OK 音频通道混音模式
15-13 12 11 10 9-5 4 3 2 1-0
  4 → 0 3 → 0 2 → 0   4 → 1 3 → 1 2 → 1  
Y
12 CC_PLT 家长控制 ISO-3166 国家代码 N
13 PLT 家长控制级别,1-8,或 15 表示无 Y
14 视频首选和当前模式
15-12 11-10 9-8 7-0
  首选显示比例:0 = 4:3,1 = 未指定,3 = 16:9 当前视频模式:0 = 普通,1 = 画面比例调整,2 = 纵横比  
N
15 播放器音频功能
15 14 13 12 11 10 9-8 7 6 5 4 3 2 1-0
  杜比   MPEG DTS SDDS   PCM 卡拉 OK 杜比卡拉 OK   MPEG 卡拉 OK DTS 卡拉 OK SDDS 卡拉 OK  
N
16 首选音频语言,ISO-639 代码 N
17 首选音频语言扩展
代码 含义
0 未指定
1 普通
2 视障人士
3 导演评论
4 备用导演评论
N
18 首选字幕语言,ISO-639 代码 N
19 首选字幕语言扩展
代码 含义
0 未指定
1 普通
2 大号
3 儿童
5 普通字幕
6 大号字幕
7 儿童字幕
9 强制
13 导演评论
14 大号导演评论
15 儿童导演评论
N
20 播放器区域代码掩码
15-8 7 6 5 4 3 2 1 0
  区域 8 区域 7 区域 6 区域 5 区域 4 区域 3 区域 2 区域 1
N
21-23 保留

(SPRM 列表来自 这里

[edit | edit source]

用于改变播放流程的指令被划分为 Link、Jump 和 Call 三类。Link 指令允许在 PGC/标题/域内进行转移,或转移到一组固定的相关 PGC(“next”,“previous” 和 “up”),而 Jump 和 Call 允许跨域、菜单、标题和章节进行更广泛的转移。标题和章节可以通过 Jump 指令进入,而菜单(和 FPC)可以通过 Jump 或 Call 指令进入。Jump-to-menu 和 Call-to-menu 集支持相同的转移集,但 Jump-to-menu 指令仅允许在菜单中使用,而 Call-to-menu 的等价指令仅允许在标题中使用。

Call 指令执行与 Jump 等价指令相同的操作,但它们还会保存一个播放点以供以后恢复。(这可以是当前播放点,也可以是指令中明确指定的另一个点。)只能保存一个恢复点:“恢复堆栈”(如果你能这样称呼它)只有一个元素深。

因此,从 Call 开始的恢复点始终在标题内,而不是在菜单内。模型是,调用菜单意味着暂时暂停标题的播放,这可以在菜单被关闭时恢复(除非菜单选项在其他地方开始播放)。

使用 Jump 或 Call 允许的转移

from\to FPC VMG VTSM VTST
FPC   JumpSS JumpSS JumpTT
VMG JumpSS JumpSS JumpSS JumpTT
VTSM JumpSS JumpSS JumpSS(仅限于相同标题集) JumpVTS_TT, JumpVTS_PTT(仅限于相同标题集)
VTST CallSS CallSS CallSS(仅限于相同标题集) JumpVTS_TT, JumpVTS_PTT(仅限于相同标题集)

请注意,从 VTS(菜单或标题)开始,不允许直接跳入另一个 VTS。你必须通过 VMG 设置间接跳转。

Link 子集中的 RSM 命令(见下文)从上次保存的恢复点恢复播放。遥控器上的返回按钮也执行相同的操作。

条件格式

[edit | edit source]

每个指令都可以设置为条件指令,其中对两个操作数进行比较,指令其余部分的执行取决于比较结果是真还是假。

条件字段的布局在不同的指令组之间可能有所不同。在以下指令格式中,点表示根据指令的无条件形式编码的位。3 位 cmp 字段表示要应用于两个操作数的比较运算符

代码 含义
0 始终为真(指令的无条件形式)
1 BC(“&”,当且仅当操作数的逻辑与不为零时为真)
2 =
3
4
5 >
6
7 <

这些特定格式可用于第 0、1、2、3 组中的指令。第 4、5 和 6 组中的指令使用相同的 cmp 代码,但它们有自己用于比较操作数的安排。但请注意,cmp 字段(以及比较操作数 2 的立即标志)在所有指令中都位于相同的位置。

格式 1

[edit | edit source]

此形式允许对两个寄存器进行比较,或对寄存器和一个 16 位字面值进行比较。

0 1:7 1:6-4 1:3-0 2 3 4 5 6 7
........ 0 cmp ....   creg1   creg2 ........ ........
........ 1 cmp ....   creg1 cimmed2 ........ ........

格式 2

[edit | edit source]

此形式只允许对两个寄存器进行比较。

0 1:7 1:6-4 1:3-0 2 3 4 5 6 7
........   cmp .... ........ ........ ........ ........ creg1 creg2

格式 3

[edit | edit source]

此形式允许对两个寄存器进行比较,或对寄存器和一个 16 位字面值进行比较。

0 1:7 1:6-4 1:3-0 2 3 4 5 6 7
........ 0 cmp .... creg1 ........ ........ ........   creg2
........ 1 cmp .... creg1 ........ ........ ........ cimmed2

集合运算

[edit | edit source]

将新值分配给 GPRM 的指令具有 op 字段和源操作数字段(指定寄存器或字面值)。目的地的新值是根据其现有值、源操作数和 op 计算得出的。此外,交换操作也会改变源操作数(其他操作不会)。op 的有效值(以及对源操作数的相应限制)如下所示

op 操作 允许的 source
字面量 GPRM SPRM
0 无操作;reg 不变 Y Y Y
1 直接赋值;reg := source
2 交换 regsource 的值 N Y N
3 source 加到 reg Y Y N
4 reg 中减去 source
5 reg 乘以 source
6 reg 除以 source
7 reg 设置为对 source 进行整数除法的余数
8 reg 设置为 [1 .. source] 中的随机整数
9 sourcereg 进行按位与运算 Y Y Y
10 sourcereg 进行按位或运算
11 sourcereg 进行按位异或运算

指令集详细信息

[edit | edit source]

参见下一页

华夏公益教科书