use super::idct_tables::IDCT_COEFFS;
fn idct_1d(n: usize, src: &[f32], src_stride: usize, dst: &mut [f32], dst_stride: usize) {
let coeffs = IDCT_COEFFS[n - 2];
let mut s = [0f32; 12];
for k in 0..n {
let v = src[k * src_stride];
if v != 0.0 {
for (x, sx) in s[..n].iter_mut().enumerate() {
*sx += coeffs[k * n + x] * v;
}
}
}
for (x, &sx) in s[..n].iter().enumerate() {
dst[x * dst_stride] = sx;
}
}
pub fn idct_2d(src: &[f32], dst: &mut [f32], num_rows: usize, num_cols: usize) {
debug_assert!((2..=12).contains(&num_rows) && (2..=12).contains(&num_cols));
let mut temp = [0f32; 12 * 12];
for c in 0..num_cols {
idct_1d(num_rows, &src[c..], num_cols, &mut temp[c..], num_cols);
}
for r in 0..num_rows {
idct_1d(
num_cols,
&temp[r * num_cols..],
1,
&mut dst[r * num_cols..],
1,
);
}
}