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 音频通道混音模式
|
Y | ||||||||||||||||||||||||||||
12 | CC_PLT | 家长控制 ISO-3166 国家代码 | N | ||||||||||||||||||||||||||||
13 | PLT | 家长控制级别,1-8,或 15 表示无 | Y | ||||||||||||||||||||||||||||
14 | 视频首选和当前模式
|
N | |||||||||||||||||||||||||||||
15 | 播放器音频功能
|
N | |||||||||||||||||||||||||||||
16 | 首选音频语言,ISO-639 代码 | N | |||||||||||||||||||||||||||||
17 | 首选音频语言扩展
|
N | |||||||||||||||||||||||||||||
18 | 首选字幕语言,ISO-639 代码 | N | |||||||||||||||||||||||||||||
19 | 首选字幕语言扩展
|
N | |||||||||||||||||||||||||||||
20 | 播放器区域代码掩码
|
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 | 交换 reg 和 source 的值 | 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 | 对 source 和 reg 进行按位与运算 | Y | Y | Y |
10 | 对 source 和 reg 进行按位或运算 | |||
11 | 对 source 和 reg 进行按位异或运算 |
指令集详细信息
[edit | edit source]参见下一页。