跳轉到內容

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]

參見下一頁

華夏公益教科書