// vorbis_info.mbt
//
// Vorbis Identification header(每个 Vorbis 流的第一个 packet)解析。
//
// 固定 30 字节,包含解码必需的基础参数:声道数、采样率、以及两个 block size。
// block size 是 2 的幂(64~8192),决定后续 floor/residue 解码时的频域窗口长度。
///|
/// Vorbis 流的基础信息。
pub struct VorbisInfo {
channels : Int
sample_rate : Int
blocksize0 : Int
blocksize1 : Int
}
///|
/// 解析 Identification header packet,返回流基础信息。
///
/// 失败返回错误描述(magic 不符 / 版本不支持 / block size 非法 / 缺 framing 标志 / 数据截断)。
pub fn VorbisInfo::parse(packet : Bytes) -> Result[VorbisInfo, String] {
if packet.length() < 30 {
return Err("truncated Vorbis identification header")
}
// magic: \x01 "vorbis"
if packet.unsafe_get(0) != b'\x01' ||
packet.unsafe_get(1) != b'v' ||
packet.unsafe_get(2) != b'o' ||
packet.unsafe_get(3) != b'r' ||
packet.unsafe_get(4) != b'b' ||
packet.unsafe_get(5) != b'i' ||
packet.unsafe_get(6) != b's' {
return Err("not a Vorbis identification header")
}
let br = BitReader::new(packet)
br.skip(7 * 8) // 跳过 7 字节 magic
let version = br.read_bits(32)
if version != 0 {
return Err("unsupported Vorbis version")
}
let channels = br.read_bits(8)
let sample_rate = br.read_bits(32)
// bitrate 字段(3 × 32 位)暂时跳过,后续如有需要再读取
br.skip(32 * 3)
let bsize0 = br.read_bits(4)
let bsize1 = br.read_bits(4)
if bsize0 < 6 || bsize0 > 13 || bsize1 < 6 || bsize1 > 13 || bsize0 > bsize1 {
return Err("invalid blocksize")
}
let framing = br.read_bit()
if framing != 1 {
return Err("missing framing flag")
}
Ok({
channels,
sample_rate,
blocksize0: 1 << bsize0,
blocksize1: 1 << bsize1,
})
}