pub const SFB_OFFSET_2048: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124, 136,
148, 160, 172, 188, 204, 220, 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652,
704, 768, 832, 896, 960, 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664,
1728, 1792, 1856, 1920, 1984, 2048,
];
pub const SFB_OFFSET_1920: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124, 136,
148, 160, 172, 188, 204, 220, 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652,
704, 768, 832, 896, 960, 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664,
1728, 1792, 1856, 1920,
];
pub const SFB_OFFSET_1536: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124, 136,
148, 160, 172, 188, 204, 220, 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652,
704, 768, 832, 896, 960, 1024, 1088, 1152, 1216, 1280, 1344, 1408, 1472, 1536,
];
pub const SFB_OFFSET_1024: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 160,
176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704,
736, 768, 800, 832, 864, 896, 928, 1024,
];
pub const SFB_OFFSET_960: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 160,
176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704,
736, 768, 800, 832, 864, 896, 928, 960,
];
pub const SFB_OFFSET_768: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 160,
176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704,
736, 768,
];
pub const SFB_OFFSET_512: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84, 92, 100, 112, 124,
136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396, 428, 460, 512,
];
pub const SFB_OFFSET_480: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84, 92, 100, 112, 124,
136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396, 428, 460, 480,
];
pub const SFB_OFFSET_384: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84, 92, 100, 112, 124,
136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 384,
];
pub const SFB_OFFSET_256: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128, 148, 172, 196, 224, 256,
];
pub const SFB_OFFSET_240: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128, 148, 172, 196, 224, 240,
];
pub const SFB_OFFSET_192: &[u16] = &[
0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128, 148, 172, 192,
];
pub const SFB_OFFSET_128: &[u16] = &[0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128];
pub const SFB_OFFSET_120: &[u16] = &[0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 120];
pub const SFB_OFFSET_96: &[u16] = &[0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96];
pub fn sfb_offset_48(transform_length: u32) -> Option<&'static [u16]> {
Some(match transform_length {
2048 => SFB_OFFSET_2048,
1920 => SFB_OFFSET_1920,
1536 => SFB_OFFSET_1536,
1024 => SFB_OFFSET_1024,
960 => SFB_OFFSET_960,
768 => SFB_OFFSET_768,
512 => SFB_OFFSET_512,
480 => SFB_OFFSET_480,
384 => SFB_OFFSET_384,
256 => SFB_OFFSET_256,
240 => SFB_OFFSET_240,
192 => SFB_OFFSET_192,
128 => SFB_OFFSET_128,
120 => SFB_OFFSET_120,
96 => SFB_OFFSET_96,
_ => return None,
})
}
#[cfg(test)]
mod tests {
use super::*;
use crate::tables::num_sfb_48;
fn assert_consistent(len: u32, offs: &[u16]) {
let expected_n = num_sfb_48(len).unwrap() as usize + 1;
assert_eq!(offs.len(), expected_n, "length mismatch for {len}");
assert_eq!(*offs.first().unwrap(), 0);
assert_eq!(*offs.last().unwrap() as u32, len);
for w in offs.windows(2) {
assert!(w[0] < w[1], "non-monotone at {len}: {:?}", w);
}
}
#[test]
fn sfb_offset_tables_consistent() {
for &tl in &[
2048u32, 1920, 1536, 1024, 960, 768, 512, 480, 384, 256, 240, 192, 128, 120, 96,
] {
let o = sfb_offset_48(tl).unwrap();
assert_consistent(tl, o);
}
}
#[test]
fn sfb_offset_48_lookup() {
let t = sfb_offset_48(1920).unwrap();
assert_eq!(t[0], 0);
assert_eq!(t[t.len() - 1], 1920);
assert!(sfb_offset_48(999).is_none());
}
}