h263: implement coefficient prediction for AIC
[nihav.git] / src / codecs / h263 / data.rs
CommitLineData
cf64af13
KS
1use io::codebook::CodebookDescReader;
2
3#[allow(dead_code)]
4pub const H263_SCALES: &[u8] = &[
5 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15 ];
6
7pub const H263_ZIGZAG: &[usize] = &[
8 0, 1, 8, 16, 9, 2, 3, 10,
9 17, 24, 32, 25, 18, 11, 4, 5,
10 12, 19, 26, 33, 40, 48, 41, 34,
11 27, 20, 13, 6, 7, 14, 21, 28,
12 35, 42, 49, 56, 57, 50, 43, 36,
13 29, 22, 15, 23, 30, 37, 44, 51,
14 58, 59, 52, 45, 38, 31, 39, 46,
15 53, 60, 61, 54, 47, 55, 62, 63
16];
17
ef3209c7
KS
18pub const H263_SCAN_H: &[usize] = &[
19 0, 1, 2, 3, 8, 9, 16, 17,
20 10, 11, 4, 5, 6, 7, 15, 14,
21 13, 12, 19, 18, 24, 25, 32, 33,
22 26, 27, 20, 21, 22, 23, 28, 29,
23 30, 31, 34, 35, 40, 41, 48, 49,
24 42, 43, 36, 37, 38, 39, 44, 45,
25 46, 47, 50, 51, 56, 57, 58, 59,
26 52, 53, 54, 55, 60, 61, 62, 63
27];
28
29pub const H263_SCAN_V: &[usize] = &[
30 0, 8, 16, 24, 1, 9, 2, 10,
31 17, 25, 32, 40, 48, 56, 57, 49,
32 41, 33, 26, 18, 3, 11, 4, 12,
33 19, 27, 34, 42, 50, 58, 35, 43,
34 51, 59, 20, 28, 5, 13, 6, 14,
35 21, 29, 36, 44, 52, 60, 37, 45,
36 53, 61, 22, 30, 7, 15, 23, 31,
37 38, 46, 54, 62, 39, 47, 55, 63
38];
39
cf64af13
KS
40pub const H263_SIZES: &[(usize, usize)] = &[
41 (0, 0), (128, 96), (176, 144), (352, 288), (704, 576), (1408, 1152)
42];
43
44pub const H263_INTRA_MCBPC: &[(u8, u8)] = &[
45 (1, 1), (1, 3), (2, 3), (3, 3), (1, 4), (1, 6), (2, 6), (3, 6), (1, 9)
46];
47
48pub const H263_INTER_MCBPC: &[(u8, u8)] = &[
49 (1, 1), (3, 4), (2, 4), (5, 6), (3, 5), (4, 8), (3, 8), (3, 7),
50 (3, 3), (7, 7), (6, 7), (5, 9), (4, 6), (4, 9), (3, 9), (2, 9),
51 (2, 3), (5, 7), (4, 7), (5, 8), (1, 9), (0, 0), (0, 0), (0, 0),
52 (2, 11), (12, 13), (14, 13), (15, 13)
53];
54
55pub const H263_CBPY: &[(u8, u8)] = &[
56 ( 3, 4), ( 5, 5), ( 4, 5), ( 9, 4), ( 3, 5), ( 7, 4), ( 2, 6), (11, 4),
57 ( 2, 5), ( 3, 6), ( 5, 4), (10, 4), ( 4, 4), ( 8, 4), ( 6, 4), ( 3, 2)
58];
59
60pub const H263_MV: &[(u8, u8)] = &[
61 ( 1, 1), ( 1, 2), ( 1, 3), ( 1, 4), ( 3, 6), ( 5, 7), ( 4, 7), ( 3, 7),
62 (11, 9), (10, 9), ( 9, 9), (17, 10), (16, 10), (15, 10), (14, 10), (13, 10),
63 (12, 10), (11, 10), (10, 10), ( 9, 10), ( 8, 10), ( 7, 10), ( 6, 10), ( 5, 10),
64 ( 4, 10), ( 7, 11), ( 6, 11), ( 5, 11), ( 4, 11), ( 3, 11), ( 2, 11), ( 3, 12),
65 ( 2, 12)
66];
67
68pub const H263_DQUANT_TAB: &[i8] = &[-1, -2, 1, 2];
69
70pub struct H263ShortCodeReader { tab: &'static [(u8, u8)] }
71
72impl H263ShortCodeReader {
73 pub fn new(tab: &'static [(u8, u8)]) -> Self { H263ShortCodeReader { tab: tab } }
74}
75
76impl CodebookDescReader<u8> for H263ShortCodeReader {
77 fn bits(&mut self, idx: usize) -> u8 { let (_, bits) = self.tab[idx]; bits }
78 fn code(&mut self, idx: usize) -> u32 { let (code, _) = self.tab[idx]; code as u32 }
79 fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
80 fn len(&mut self) -> usize { self.tab.len() }
81}
82
83#[derive(Clone,Copy)]
84pub struct H263RLSym { run: u8, level: i8 }
85impl H263RLSym {
86 pub fn get_run(&self) -> u8 { self.run }
87 pub fn is_last(&self) -> bool { self.level < 0 }
88 pub fn is_escape(&self) -> bool { (self.run == 0) && (self.level == 0) }
89 pub fn get_level(&self) -> i16 { if self.level < 0 { -self.level as i16 } else { self.level as i16 } }
90}
91
92pub struct H263RLCodeDesc { code: u8, bits: u8, sym: H263RLSym }
93
94macro_rules! rlcodes{
95 ($(($c:expr, $b:expr, $r:expr, $l:expr)),*) => {
96 &[$(H263RLCodeDesc{ code: $c, bits: $b, sym: H263RLSym{ run: $r, level: $l }}),*]
97 }
98}
99
100pub const H263_RL_CODES: &[H263RLCodeDesc] = rlcodes!(
101 (0x02, 2, 0, 1), (0x0F, 4, 0, 2), (0x15, 6, 0, 3), (0x17, 7, 0, 4),
102 (0x1F, 8, 0, 5), (0x25, 9, 0, 6), (0x24, 9, 0, 7), (0x21, 10, 0, 8),
103 (0x20, 10, 0, 9), (0x07, 11, 0, 10), (0x06, 11, 0, 11), (0x20, 11, 0, 12),
104 (0x06, 3, 1, 1), (0x14, 6, 1, 2), (0x1E, 8, 1, 3), (0x0F, 10, 1, 4),
105 (0x21, 11, 1, 5), (0x50, 12, 1, 6), (0x0E, 4, 2, 1), (0x1D, 8, 2, 2),
106 (0x0E, 10, 2, 3), (0x51, 12, 2, 4), (0x0D, 5, 3, 1), (0x23, 9, 3, 2),
107 (0x0D, 10, 3, 3), (0x0C, 5, 4, 1), (0x22, 9, 4, 2), (0x52, 12, 4, 3),
108 (0x0B, 5, 5, 1), (0x0C, 10, 5, 2), (0x53, 12, 5, 3), (0x13, 6, 6, 1),
109 (0x0B, 10, 6, 2), (0x54, 12, 6, 3), (0x12, 6, 7, 1), (0x0A, 10, 7, 2),
110 (0x11, 6, 8, 1), (0x09, 10, 8, 2), (0x10, 6, 9, 1), (0x08, 10, 9, 2),
111 (0x16, 7, 10, 1), (0x55, 12, 10, 2), (0x15, 7, 11, 1), (0x14, 7, 12, 1),
112 (0x1C, 8, 13, 1), (0x1B, 8, 14, 1), (0x21, 9, 15, 1), (0x20, 9, 16, 1),
113 (0x1F, 9, 17, 1), (0x1E, 9, 18, 1), (0x1D, 9, 19, 1), (0x1C, 9, 20, 1),
114 (0x1B, 9, 21, 1), (0x1A, 9, 22, 1), (0x22, 11, 23, 1), (0x23, 11, 24, 1),
115 (0x56, 12, 25, 1), (0x57, 12, 26, 1), (0x07, 4, 0, -1), (0x19, 9, 0, -2),
116 (0x05, 11, 0, -3), (0x0F, 6, 1, -1), (0x04, 11, 1, -2), (0x0E, 6, 2, -1),
117 (0x0D, 6, 3, -1), (0x0C, 6, 4, -1), (0x13, 7, 5, -1), (0x12, 7, 6, -1),
118 (0x11, 7, 7, -1), (0x10, 7, 8, -1), (0x1A, 8, 9, -1), (0x19, 8, 10, -1),
119 (0x18, 8, 11, -1), (0x17, 8, 12, -1), (0x16, 8, 13, -1), (0x15, 8, 14, -1),
120 (0x14, 8, 15, -1), (0x13, 8, 16, -1), (0x18, 9, 17, -1), (0x17, 9, 18, -1),
121 (0x16, 9, 19, -1), (0x15, 9, 20, -1), (0x14, 9, 21, -1), (0x13, 9, 22, -1),
122 (0x12, 9, 23, -1), (0x11, 9, 24, -1), (0x07, 10, 25, -1), (0x06, 10, 26, -1),
123 (0x05, 10, 27, -1), (0x04, 10, 28, -1), (0x24, 11, 29, -1), (0x25, 11, 30, -1),
124 (0x26, 11, 31, -1), (0x27, 11, 32, -1), (0x58, 12, 33, -1), (0x59, 12, 34, -1),
125 (0x5A, 12, 35, -1), (0x5B, 12, 36, -1), (0x5C, 12, 37, -1), (0x5D, 12, 38, -1),
126 (0x5E, 12, 39, -1), (0x5F, 12, 40, -1), (0x03, 7, 0, 0)
127);
128
129pub const H263_RL_CODES_AIC: &[H263RLCodeDesc] = rlcodes!(
130 (0x02, 2, 0, 1), (0x06, 3, 0, 2), (0x0E, 4, 0, 3), (0x0C, 5, 0, 4),
131 (0x0D, 5, 0, 5), (0x10, 6, 0, 6), (0x11, 6, 0, 7), (0x12, 6, 0, 8),
132 (0x16, 7, 0, 9), (0x1B, 8, 0, 10), (0x20, 9, 0, 11), (0x21, 9, 0, 12),
133 (0x1A, 9, 0, 13), (0x1B, 9, 0, 14), (0x1C, 9, 0, 15), (0x1D, 9, 0, 16),
134 (0x1E, 9, 0, 17), (0x1F, 9, 0, 18), (0x23, 11, 0, 19), (0x22, 11, 0, 20),
135 (0x57, 12, 0, 21), (0x56, 12, 0, 22), (0x55, 12, 0, 23), (0x54, 12, 0, 24),
136 (0x53, 12, 0, 25), (0x0F, 4, 1, 1), (0x14, 6, 1, 2), (0x14, 7, 1, 3),
137 (0x1E, 8, 1, 4), (0x0F, 10, 1, 5), (0x21, 11, 1, 6), (0x50, 12, 1, 7),
138 (0x0B, 5, 2, 1), (0x15, 7, 2, 2), (0x0E, 10, 2, 3), (0x09, 10, 2, 4),
139 (0x15, 6, 3, 1), (0x1D, 8, 3, 2), (0x0D, 10, 3, 3), (0x51, 12, 3, 4),
140 (0x13, 6, 4, 1), (0x23, 9, 4, 2), (0x07, 11, 4, 3), (0x17, 7, 5, 1),
141 (0x22, 9, 5, 2), (0x52, 12, 5, 3), (0x1C, 8, 6, 1), (0x0C, 10, 6, 2),
142 (0x1F, 8, 7, 1), (0x0B, 10, 7, 2), (0x25, 9, 8, 1), (0x0A, 10, 8, 2),
143 (0x24, 9, 9, 1), (0x06, 11, 9, 2), (0x21, 10, 10, 1), (0x20, 10, 11, 1),
144 (0x08, 10, 12, 1), (0x20, 11, 13, 1), (0x07, 4, 0, -1), (0x0C, 6, 0, -2),
145 (0x10, 7, 0, -3), (0x13, 8, 0, -4), (0x11, 9, 0, -5), (0x12, 9, 0, -6),
146 (0x04, 10, 0, -7), (0x27, 11, 0, -8), (0x26, 11, 0, -9), (0x5F, 12, 0,-10),
147 (0x0F, 6, 1, -1), (0x13, 9, 1, -2), (0x05, 10, 1, -3), (0x25, 11, 1, -4),
148 (0x0E, 6, 2, -1), (0x14, 9, 2, -2), (0x24, 11, 2, -3), (0x0D, 6, 3, -1),
149 (0x06, 10, 3, -2), (0x5E, 12, 3, -3), (0x11, 7, 4, -1), (0x07, 10, 4, -2),
150 (0x13, 7, 5, -1), (0x5D, 12, 5, -2), (0x12, 7, 6, -1), (0x5C, 12, 6, -2),
151 (0x14, 8, 7, -1), (0x5B, 12, 7, -2), (0x15, 8, 8, -1), (0x1A, 8, 9, -1),
152 (0x19, 8, 10, -1), (0x18, 8, 11, -1), (0x17, 8, 12, -1), (0x16, 8, 13, -1),
153 (0x19, 9, 14, -1), (0x15, 9, 15, -1), (0x16, 9, 16, -1), (0x18, 9, 17, -1),
154 (0x17, 9, 18, -1), (0x04, 11, 19, -1), (0x05, 11, 20, -1), (0x58, 12, 21, -1),
155 (0x59, 12, 22, -1), (0x5A, 12, 23, -1), (0x03, 7, 0, 0)
156);
157
158pub struct H263RLCodeReader { tab: &'static [H263RLCodeDesc] }
159
160impl H263RLCodeReader {
161 pub fn new(tab: &'static [H263RLCodeDesc]) -> Self { H263RLCodeReader { tab: tab } }
162}
163
164impl CodebookDescReader<H263RLSym> for H263RLCodeReader {
165 fn bits(&mut self, idx: usize) -> u8 { self.tab[idx].bits }
166 fn code(&mut self, idx: usize) -> u32 { self.tab[idx].code as u32 }
167 fn sym (&mut self, idx: usize) -> H263RLSym { self.tab[idx].sym }
168 fn len(&mut self) -> usize { self.tab.len() }
169}
170