|
1 | 1 | //! Inverse discrete cosine transform |
2 | 2 |
|
| 3 | +// TODO: Restore this when f32::cos is a const fn. |
3 | 4 | /* |
4 | | -use lazy_static::lazy_static; |
5 | 5 | use std::f32::consts::{FRAC_1_SQRT_2, PI}; |
6 | 6 |
|
7 | 7 | /// The 1D basis function of the H.263 IDCT. |
8 | 8 | /// |
9 | 9 | /// `freq` is the frequency of the component |
10 | 10 | /// `x` is the point at which the cosine is to be computed |
11 | | -fn basis(freq: f32, x: f32) -> f32 { |
| 11 | +const fn basis(freq: f32, x: f32) -> f32 { |
12 | 12 | f32::cos(PI * ((x as f32 + 0.5) / 8.0) * freq as f32) |
13 | 13 | } |
14 | 14 |
|
15 | | -lazy_static! { |
16 | | - /// Lookup table for `basis`. |
17 | | - /// |
18 | | - /// The outer parameter represents all valid `spatial` inputs, while the |
19 | | - /// inner represents all valid `freq` inputs. |
20 | | - /// Already includes the former CUV_TABLE factors. |
21 | | - static ref BASIS_TABLE : [[f32; 8]; 8] = [ |
22 | | - [basis(0.0, 0.0) * FRAC_1_SQRT_2, basis(0.0, 1.0) * FRAC_1_SQRT_2, basis(0.0, 2.0) * FRAC_1_SQRT_2, basis(0.0, 3.0) * FRAC_1_SQRT_2, basis(0.0, 4.0) * FRAC_1_SQRT_2, basis(0.0, 5.0) * FRAC_1_SQRT_2, basis(0.0, 6.0) * FRAC_1_SQRT_2, basis(0.0, 7.0) * FRAC_1_SQRT_2], |
23 | | - [basis(1.0, 0.0), basis(1.0, 1.0), basis(1.0, 2.0), basis(1.0, 3.0),basis(1.0, 4.0),basis(1.0, 5.0),basis(1.0, 6.0),basis(1.0, 7.0)], |
24 | | - [basis(2.0, 0.0), basis(2.0, 1.0), basis(2.0, 2.0), basis(2.0, 3.0),basis(2.0, 4.0),basis(2.0, 5.0),basis(2.0, 6.0),basis(2.0, 7.0)], |
25 | | - [basis(3.0, 0.0), basis(3.0, 1.0), basis(3.0, 2.0), basis(3.0, 3.0),basis(3.0, 4.0),basis(3.0, 5.0),basis(3.0, 6.0),basis(3.0, 7.0)], |
26 | | - [basis(4.0, 0.0), basis(4.0, 1.0), basis(4.0, 2.0), basis(4.0, 3.0),basis(4.0, 4.0),basis(4.0, 5.0),basis(4.0, 6.0),basis(4.0, 7.0)], |
27 | | - [basis(5.0, 0.0), basis(5.0, 1.0), basis(5.0, 2.0), basis(5.0, 3.0),basis(5.0, 4.0),basis(5.0, 5.0),basis(5.0, 6.0),basis(5.0, 7.0)], |
28 | | - [basis(6.0, 0.0), basis(6.0, 1.0), basis(6.0, 2.0), basis(6.0, 3.0),basis(6.0, 4.0),basis(6.0, 5.0),basis(6.0, 6.0),basis(6.0, 7.0)], |
29 | | - [basis(7.0, 0.0), basis(7.0, 1.0), basis(7.0, 2.0), basis(7.0, 3.0),basis(7.0, 4.0),basis(7.0, 5.0),basis(7.0, 6.0),basis(7.0, 7.0)], |
30 | | - ]; |
31 | | -} |
| 15 | +
|
| 16 | +/// Lookup table for `basis`. |
| 17 | +/// |
| 18 | +/// The outer parameter represents all valid `spatial` inputs, while the |
| 19 | +/// inner represents all valid `freq` inputs. |
| 20 | +/// Already includes the former CUV_TABLE factors. |
| 21 | +static BASIS_TABLE: [[f32; 8]; 8] = [ |
| 22 | + [basis(0.0, 0.0) * FRAC_1_SQRT_2, basis(0.0, 1.0) * FRAC_1_SQRT_2, basis(0.0, 2.0) * FRAC_1_SQRT_2, basis(0.0, 3.0) * FRAC_1_SQRT_2, basis(0.0, 4.0) * FRAC_1_SQRT_2, basis(0.0, 5.0) * FRAC_1_SQRT_2, basis(0.0, 6.0) * FRAC_1_SQRT_2, basis(0.0, 7.0) * FRAC_1_SQRT_2], |
| 23 | + [basis(1.0, 0.0), basis(1.0, 1.0), basis(1.0, 2.0), basis(1.0, 3.0),basis(1.0, 4.0),basis(1.0, 5.0),basis(1.0, 6.0),basis(1.0, 7.0)], |
| 24 | + [basis(2.0, 0.0), basis(2.0, 1.0), basis(2.0, 2.0), basis(2.0, 3.0),basis(2.0, 4.0),basis(2.0, 5.0),basis(2.0, 6.0),basis(2.0, 7.0)], |
| 25 | + [basis(3.0, 0.0), basis(3.0, 1.0), basis(3.0, 2.0), basis(3.0, 3.0),basis(3.0, 4.0),basis(3.0, 5.0),basis(3.0, 6.0),basis(3.0, 7.0)], |
| 26 | + [basis(4.0, 0.0), basis(4.0, 1.0), basis(4.0, 2.0), basis(4.0, 3.0),basis(4.0, 4.0),basis(4.0, 5.0),basis(4.0, 6.0),basis(4.0, 7.0)], |
| 27 | + [basis(5.0, 0.0), basis(5.0, 1.0), basis(5.0, 2.0), basis(5.0, 3.0),basis(5.0, 4.0),basis(5.0, 5.0),basis(5.0, 6.0),basis(5.0, 7.0)], |
| 28 | + [basis(6.0, 0.0), basis(6.0, 1.0), basis(6.0, 2.0), basis(6.0, 3.0),basis(6.0, 4.0),basis(6.0, 5.0),basis(6.0, 6.0),basis(6.0, 7.0)], |
| 29 | + [basis(7.0, 0.0), basis(7.0, 1.0), basis(7.0, 2.0), basis(7.0, 3.0),basis(7.0, 4.0),basis(7.0, 5.0),basis(7.0, 6.0),basis(7.0, 7.0)], |
| 30 | +]; |
| 31 | +
|
32 | 32 | */ |
33 | 33 |
|
34 | 34 | use crate::types::DecodedDctBlock; |
|
0 commit comments