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