use super::mode::{AmrMode, AmrVariant};
const NARROWBAND: [(u8, &[u8], &[u8]); 8] = [
(
0,
include_bytes!("testdata/amrnb_mode0.amr"),
include_bytes!("testdata/amrnb_enc_mode0.amr"),
),
(
1,
include_bytes!("testdata/amrnb_mode1.amr"),
include_bytes!("testdata/amrnb_enc_mode1.amr"),
),
(
2,
include_bytes!("testdata/amrnb_mode2.amr"),
include_bytes!("testdata/amrnb_enc_mode2.amr"),
),
(
3,
include_bytes!("testdata/amrnb_mode3.amr"),
include_bytes!("testdata/amrnb_enc_mode3.amr"),
),
(
4,
include_bytes!("testdata/amrnb_mode4.amr"),
include_bytes!("testdata/amrnb_enc_mode4.amr"),
),
(
5,
include_bytes!("testdata/amrnb_mode5.amr"),
include_bytes!("testdata/amrnb_enc_mode5.amr"),
),
(
6,
include_bytes!("testdata/amrnb_mode6.amr"),
include_bytes!("testdata/amrnb_enc_mode6.amr"),
),
(
7,
include_bytes!("testdata/amrnb_mode7.amr"),
include_bytes!("testdata/amrnb_enc_mode7.amr"),
),
];
const WIDEBAND: [(u8, &[u8], &[u8]); 9] = [
(
0,
include_bytes!("testdata/amrwb_mode0.amr"),
include_bytes!("testdata/amrwb_enc_mode0.amr"),
),
(
1,
include_bytes!("testdata/amrwb_mode1.amr"),
include_bytes!("testdata/amrwb_enc_mode1.amr"),
),
(
2,
include_bytes!("testdata/amrwb_mode2.amr"),
include_bytes!("testdata/amrwb_enc_mode2.amr"),
),
(
3,
include_bytes!("testdata/amrwb_mode3.amr"),
include_bytes!("testdata/amrwb_enc_mode3.amr"),
),
(
4,
include_bytes!("testdata/amrwb_mode4.amr"),
include_bytes!("testdata/amrwb_enc_mode4.amr"),
),
(
5,
include_bytes!("testdata/amrwb_mode5.amr"),
include_bytes!("testdata/amrwb_enc_mode5.amr"),
),
(
6,
include_bytes!("testdata/amrwb_mode6.amr"),
include_bytes!("testdata/amrwb_enc_mode6.amr"),
),
(
7,
include_bytes!("testdata/amrwb_mode7.amr"),
include_bytes!("testdata/amrwb_enc_mode7.amr"),
),
(
8,
include_bytes!("testdata/amrwb_mode8.amr"),
include_bytes!("testdata/amrwb_enc_mode8.amr"),
),
];
fn first_difference(apache: &[u8], reference: &[u8]) -> Option<usize> {
assert!(
apache.len() <= reference.len(),
"the reference run is the longer of the two by construction"
);
apache.iter().zip(reference).position(|(a, b)| a != b)
}
#[test]
fn opencore_amr_narrowband_agrees_with_ts26073_at_every_rate() {
for (index, apache, reference) in NARROWBAND {
let diff = first_difference(apache, reference);
assert!(
diff.is_none(),
"AMR-NB mode {index}: opencore-amr leaves TS 26.073 at byte {}",
diff.unwrap()
);
}
}
#[test]
fn vo_amrwbenc_agrees_with_ts26173_at_seven_of_nine_rates() {
let mut divergent = Vec::new();
for (index, apache, reference) in WIDEBAND {
if let Some(at) = first_difference(apache, reference) {
divergent.push((index, at));
}
}
let indices: Vec<u8> = divergent.iter().map(|&(i, _)| i).collect();
assert_eq!(
indices,
vec![2, 3],
"vo-amrwbenc's disagreement with TS 26.173 moved; \
divergences (mode, byte) = {divergent:?}"
);
for (index, _) in divergent {
let mode = AmrMode::new(AmrVariant::WideBand, index).expect("mode");
assert!(
(12_000..=15_000).contains(&mode.bitrate()),
"the divergent rates were 12.65 and 14.25 kbit/s"
);
}
}
#[test]
fn the_two_runs_are_comparable_at_all() {
for (index, apache, reference) in NARROWBAND {
assert!(
reference.len() > apache.len(),
"AMR-NB mode {index}: the reference run should be the longer one"
);
assert_eq!(&apache[..6], b"#!AMR\n", "mode {index} apache magic");
assert_eq!(&reference[..6], b"#!AMR\n", "mode {index} reference magic");
}
for (index, apache, reference) in WIDEBAND {
assert!(
reference.len() > apache.len(),
"AMR-WB mode {index}: the reference run should be the longer one"
);
assert_eq!(&apache[..9], b"#!AMR-WB\n", "mode {index} apache magic");
assert_eq!(
&reference[..9],
b"#!AMR-WB\n",
"mode {index} reference magic"
);
}
}