VCD 技术规范与标准演进(二):VCD 2.0 PBC 状态机、PSD/LOT 与高分辨率静止画
VCD 2.0 在 VCD 1.1 的连续播放模型上增加了 Playback Control(PBC,播放控制)。它没有把通用程序放进光盘交给影碟机执行,而是把播放项目、按键响应和跳转地址编码成一组紧凑的数据结构。影碟机读取这些结构后,就能显示菜单、响应数字键,并在播放、静止画和下一级菜单之间跳转。
本文以 Video CD 2.0 白皮书为准,介绍 PBC 的数据位置、索引方式和状态转移。文末也会说明本文配套播放器已经实现的兼容范围。
1. Track 1 中的两套信息
VCD 的第一轨是特殊的数据轨。它同时容纳 ISO 9660 文件系统和固定地址的 Video CD Information Area;MPEG 音视频轨从 Track 2 开始。VCD/INFO.VCD 与 VCD/ENTRIES.VCD 位于信息区的固定扇区,供简单播放器直接寻址。PBC 所需的 LOT 和 PSD 也在这个固定区域中。
Track 1
├── ISO 9660 文件系统
│ ├── VCD/INFO.VCD
│ ├── VCD/ENTRIES.VCD
│ ├── MPEGAV/AVSEQxx.DAT
│ ├── SEGMENT/ITEMxxxx.DAT # 可选的 Segment Play Item
│ └── EXT/PSD_X.VCD、LOT_X.VCD # 可选的计算机扩展 PBC
│
└── Video CD Information Area(固定绝对地址)
├── INFO.VCD 00:04:00
├── ENTRIES.VCD 00:04:01
├── LOT.VCD 00:04:02..00:04:33,固定 64 KB
└── PSD.VCD 从 00:04:34 起,最长 256 个扇区
Track 2 及以后
└── MPEG 音视频轨或 CD-DA 音频轨
PSD.VCD 和 LOT.VCD 描述的是家用播放器使用的 PBC。EXT/PSD_X.VCD 与 EXT/LOT_X.VCD 则面向 CD-i 和其他计算机系统;其中的扩展 Selection List 附带指针设备可用的矩形热区。两组数据在功能上对应,物理位置和描述符类型并不相同。
2. INFO.VCD:PBC 的入口信息
INFO.VCD 固定为一个 2048 字节扇区。规范中的字节位置以下标从 0 开始表示:
| 偏移 | 长度 | 字段 | 说明 |
|---|---|---|---|
0x00 | 8 | system_id | "VIDEO_CD" |
0x08 | 1 | major version | VCD 2.0 为 0x02 |
0x09 | 1 | system profile tag | VCD 2.0 为 0x00 |
0x0A | 16 | album identifier | ISO 646 字符串,右侧补空格 |
0x1A | 2 | volume count | 套装光盘总数,大端序 |
0x1C | 2 | volume sequence | 当前卷号,大端序 |
0x1E | 13 | PAL flags | Track 2 到 Track 99 的 98 位制式图;0 为 NTSC、1 为 PAL |
0x2B | 1 | status flags | 限制级别、多碟续播、扩展 PSD 等标志 |
0x2C | 4 | PSD size | PSD 的有效字节数;0 表示没有 PBC |
0x30 | 3 | first segment address | Segment Play Item 区首地址,BCD mm:ss:00 |
0x33 | 1 | offset multiplier | VCD 2.0 固定为 8 |
0x34 | 2 | maximum List ID | LOT 中有效的最大 List ID |
0x36 | 2 | maximum segment number | Segment Play Item 的最大编号 |
0x38 | 1980 | segment contents | 每个 Segment 的画面和音频属性 |
规范把版本写成两个字节 0x02 0x00,不是一个大端 16 位整数后再把后续字段整体右移。这个细节很容易让后面的偏移全部错位。
Offset multiplier
PSD 内部的跳转地址以 offset unit 表示。白皮书规定:
VCD 2.0 的 multiplier 固定为 8,因此一个 16 位偏移值最多能覆盖 512 KB 的扩展 PSD 文件。所有 List 起点都必须按这个单位对齐;未使用区域以零填充。
3. LOT.VCD:从 List ID 查到地址
LOT.VCD 固定为 64 KB,即 32 个 2048 字节扇区。它由 32768 个大端 16 位字组成,但第一个字保留;List ID 1 到 0x7FFF 分别位于后续表项中:
offset 0x0000: reserved, 0x0000
offset 0x0002: List ID 1 的 PSD offset unit
offset 0x0004: List ID 2 的 PSD offset unit
...
未使用的表项填 0xFFFF。新插入光盘时,规范默认从 List ID 1、也就是 PSD 偏移 0 开始;同一套多碟光盘可以通过状态标志选择 List ID 2 作为后续卷的入口。
fn list_id_to_byte_offset(lot: &[u8], list_id: u16, multiplier: usize) -> Option<usize> {
if list_id == 0 || list_id > 0x7fff {
return None;
}
let at = list_id as usize * 2; // 第 0 个 word 保留
let unit = u16::from_be_bytes([*lot.get(at)?, *lot.get(at + 1)?]);
(unit != 0xffff).then_some(unit as usize * multiplier)
}
这层映射让遥控器的替代入口、跨盘入口和菜单跳转都能直接定位,不必线性扫描整个 PSD。
4. PSD.VCD:由描述符组成的播放图
标准 PSD 有三类基础描述符:
| 标签 | 描述符 | 用途 |
|---|---|---|
0x10 | Play List | 顺序播放一组 Play Item |
0x18 | Selection List | 标准选择菜单,响应遥控器数字键、翻页、返回、默认选择和超时 |
0x1A | Extended Selection List | 扩展选择菜单,增加鼠标/指针设备可用的绝对矩形交互热区 |
0x1F | End List | 终止 PSD 状态机解释,或提示多碟换盘 |
4.1 Play List
Play List 的固定头部为 14 字节,之后跟随 NOI 个 16 位 Play Item Number:
0 : 0x10 Play List header
1 : NOI 项目数
2 : List ID 2 bytes
4 : previous offset 2 bytes
6 : next offset 2 bytes
8 : return offset 2 bytes
10 : playing time 2 bytes
12 : play item wait time 1 byte
13 : auto-pause wait time 1 byte
14 : item #1 ... 2 bytes each
playing time 的单位是 5 个扇区,0 表示播放到项目末尾,并非 1/15 秒。等待时间也不是单纯秒数:1 到 60 表示 1 到 60 秒,61 以上改为十秒步进,0xFF 表示无限等待。
Play Item Number 的常用范围如下:
| PIN 范围 | 含义 |
|---|---|
2..99 | 对应 Track 2 到 Track 99 |
100..599 | 从 ENTRIES.VCD 的指定 Entry 播至所在轨道尾部,编号为 PIN - 99 |
1000..2979 | /SEGMENT/ITEMxxxx.DAT,编号为 PIN - 999 |
4.2 Selection List
Selection List 的前 20 字节与 Play List 类似,但把播放项目换成单个菜单项目,并加入默认、超时和数字选择表:
0 : 0x18 Selection List header
1 : reserved 必须为 0
2 : NOS 选择数量,最多 99
3 : BSN 第一个数字选择号
4 : List ID 2 bytes
6 : previous offset 2 bytes
8 : next offset 2 bytes
10 : return offset 2 bytes
12 : default offset 2 bytes
14 : time-out offset 2 bytes
16 : wait time 1 byte,沿用 Play List 的等待编码
17 : loop/jump timing 低 7 位为循环次数;最高位决定立即跳转或等待当前轮次结束
18 : Play Item Number 2 bytes
20 : selection offsets NOS 个 16 位 offset unit
其中第 17 字节 loop/jump timing 具备精细的交互控制语义:
- 最高位 (bit 7, Jump Timing):
0表示立即响应跳转(Immediate Interrupt):用户一旦输入有效按键,立即中断当前背景媒体并切入目标节点(适用于普通菜单界面);1表示等待当前轮次结束(Wait for End of Item):用户做出选择后,菜单背景音视频仍会平稳播放至当前周期末尾,再平滑切入新曲目(常用于高级卡拉 OK 伴奏背景,防止生硬切歌)。
- 低 7 位 (bits 0..6, Loop Count):
0表示无限循环播放菜单背景项目,直到用户做出选择;1..127表示背景项目的重播次数上限。播满指定轮次且无按键交互后,状态机将触发timeout_ofs执行超时分支跳转。
用户按下数字键 时,只有在下式成立时才会查表:
目标地址为:
0xFFFF 表示相应功能关闭。0xFFFE 与 0xFFFD 还用于多默认选择,这一模式会根据当前播放位置选择不同的分支。因此,把 Selection List 简化成“背景图加倒计时”会漏掉 PBC 的一部分语义。
4.3 扩展 Selection List (0x1A) 与 Extended PBC
标准 0x18 菜单仅针对家用红外遥控器设计,用户只能靠数字按键选择。为了支持 CD-i 系统、多媒体电脑鼠标以及带屏幕光标的机顶盒,VCD 2.0 白皮书在 EXT/ 目录下引入了 Extended PBC(PSD_X.VCD 与 LOT_X.VCD),对应 INFO.VCD 中的 pbc_x 标志位。
在加载路径上,现代播放引擎通常采取优先级探测策略:若光盘存在 EXT/PSD_X.VCD 与 EXT/LOT_X.VCD,则优先挂载;若缺失则平滑回退至 VCD/ 下的普通 PBC。
Extended PBC 的核心是类型为 0x1A 的 Extended Selection List。其内部结构在保留前 20 字节标准头部与 NOS 个跳转偏移的基础上,尾部追加了专有的扩展区域数据(Extended Area Data):
0x00 .. 0x13 (20B) : 与标准 Selection List 相同的前 20 字节
0x14 .. 0x14 + NOS*2 : NOS 个 16 位选择项 offset unit
0x14 + NOS*2 .. + 16 : 4 个通用导航按钮矩形区域(Previous, Next, Return, Default)
末尾追加 NOS * 4 字节 : 各数字选择项(Selection 0..NOS-1)的矩形区域
未对齐前净有效载荷总长为:
紧随其后按 offset_multiplier(8 字节)向上补齐对齐字节。
归一化坐标与热区命中
每个按钮区域由 4 个字节构成 [x1, y1, x2, y2],采用 的归一化屏幕坐标系(左上角为 (0, 0),右下角为 (255, 255))。
当指针设备(鼠标或触摸光标)在屏幕视口点击时:
- 播放器将视口像素坐标等比例映射至 空间;
- 依次测试是否落入各数字选择项矩形,若命中则派发对应数字分支跳转;
- 若未命中选项,继续测试是否落入上一页、下一页、返回或默认按钮区域;
- 区域判定按照先后表项次序决定优先级。这套机制使原本纯靠按键的 PBC 状态机获得了完整的鼠标图形点击能力。
5. 高分辨率静止画:两种完整 I 帧
菜单不必局限于 352×288 或 352×240。Segment Play Item 可以保存普通分辨率静止画,也可以保存与其内容相同的高分辨率静止画:PAL 为 704×576,NTSC 为 704×480。
两者都是完整的 MPEG-1 序列:sequence_header + 1 GOP 中的 I picture + sequence_end_code。高分静止画不是把普通分辨率图像叠加一层高频残差;规范要求把同一画面的普通和高分序列交织。播放器能先显示普通分辨率版本,再在支持高分静止画时显示高分版本。
| 类型 | 最大编码大小 | 视频 Stream ID |
|---|---|---|
| 普通静止画 | 46 KB | 0xE1 |
| 高分静止画 | 224 KB | 0xE2 |
高分静止画的编码大小取决于内容,不能从分辨率直接推出固定的 40 到 60 KB 或固定加载时长。对当时的硬件而言,704×576 的 4:2:0 原始帧约为 594 KiB;它解释了高分静止画为何是可选能力,也解释了菜单资源为何更适合放在 Segment 区而不是连续视频轨中。
6. 把 PSD 看成状态机
状态机本身没有“页面脚本”概念。光盘制作工具只需安排 Play Item、跳转 offset 和选择表,消费级播放器便能完成固定菜单结构。这也是 PBC 能在存储和内存都很有限的影碟机上工作的原因。
这套状态机在消费级影碟机上的一个核心表现是按键语义的上下文敏感性。同一组物理遥控器按键在不同节点状态下会执行完全不同的调度逻辑:
| 遥控器物理按键 | 处于 Selection List 菜单态 | 处于 Play List 连续播放态 |
|---|---|---|
| 数字键 (1~99) | 命中当前选单的 selection offset 分支 | 快速直选物理曲目号(如输入 3 直达 Track 4) |
| PREV (上一首) | 翻回上一页菜单 (prev_ofs) | 重新播放当前曲目或跳至上一曲目 |
| NEXT (下一首) | 翻到下一页菜单 (next_ofs) | 略过当前曲目并跳至下一曲目 |
| RETURN (返回) | 返回上级父菜单 (return_ofs) | 中断当前曲目回放,返回唤起该曲目的菜单 |
| DEFAULT (确认) | 执行默认选项 (default_ofs) | 触发暂停或继续回放 |
7. 一条并行的格式演进:SVCD
VCD 2.0 主要扩展交互,SVCD 则主要扩展画质。SVCD 使用 MPEG-2 Program Stream,PAL 视频常见 480×576 隔行、NTSC 视频常见 480×480 隔行,视频峰值约为 2.6 Mbps;它还可提供多组音频和最多四个图形叠加通道。
两者不应混成同一代“升级标准”。PBC 的 PSD/LOT 面向菜单控制,SVCD 的重点是更高的媒体参数和叠加图形。它们共同说明了 CD 视频后期的两个方向:一条把有限的控制结构做得更易用,另一条尽量提高视频质量。本文其余部分关注前者;SVCD 的详细参数应放在独立资料页或附录中,避免打断 PBC 的叙述。
8. 本项目的兼容范围
项目现已完整支持标准与扩展 PBC(支持加载 VCD/ 下的 PSD.VCD / LOT.VCD 以及优先探测 EXT/ 下的 PSD_X.VCD / LOT_X.VCD),实现了 0x10 Play List、0x18 Selection List、0x1A Extended Selection List 与 0x1F End List 描述符的解析,打通了数字键、前后页、返回、默认、超时跳转以及归一化指针热区命中。它把 PBC 菜单项目映射到 Track 或 /SEGMENT/ITEMxxxx.DAT。
目前实现尚未覆盖多默认选择、个别特定未定义 offset 以及非线性等待时间等冷门白皮书语义。明确这些边界有助于区分标准全集与具体实现的工程取舍。