1 use io::codebook::CodebookDescReader;
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 ];
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 ];
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
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
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
44 pub const H263_SIZES: &[(usize, usize)] = &[
45 (0, 0), (128, 96), (176, 144), (352, 288), (704, 576), (1408, 1152)
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)
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)
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)
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),
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)
77 // 0x1 - direct, 0x2 - has quant, 0x4 - has CBP, 0x8 - has dquant, 0x10 - has fwd, 0x20 - has bwd, 0x40 - intra
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;
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
93 pub const H263_CBPC_B: &[(u8, u8)] = &[
94 (0, 1), (2, 2), (7, 3), (6, 3)
97 pub const H263_DQUANT_TAB: &[i8] = &[-1, -2, 1, 2];
99 pub const H263_MODIFIED_QUANT: [[u8; 32]; 2] = [
101 0, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13,
102 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28
104 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17,
105 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 31, 31, 26
109 pub const H263_CHROMA_QUANT: [u8; 32] = [
110 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11,
111 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15
114 pub struct H263ShortCodeReader { tab: &'static [(u8, u8)] }
116 impl H263ShortCodeReader {
117 pub fn new(tab: &'static [(u8, u8)]) -> Self { H263ShortCodeReader { tab: tab } }
120 impl CodebookDescReader<u8> for H263ShortCodeReader {
121 fn bits(&mut self, idx: usize) -> u8 { let (_, bits) = self.tab[idx]; bits }
122 fn code(&mut self, idx: usize) -> u32 { let (code, _) = self.tab[idx]; code as u32 }
123 fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
124 fn len(&mut self) -> usize { self.tab.len() }
127 #[derive(Clone,Copy)]
128 pub struct H263RLSym { run: u8, level: i8 }
130 pub fn get_run(&self) -> u8 { self.run }
131 pub fn is_last(&self) -> bool { self.level < 0 }
132 pub fn is_escape(&self) -> bool { (self.run == 0) && (self.level == 0) }
133 pub fn get_level(&self) -> i16 { if self.level < 0 { -self.level as i16 } else { self.level as i16 } }
136 pub struct H263RLCodeDesc { code: u8, bits: u8, sym: H263RLSym }
138 macro_rules! rlcodes{
139 ($(($c:expr, $b:expr, $r:expr, $l:expr)),*) => {
140 &[$(H263RLCodeDesc{ code: $c, bits: $b, sym: H263RLSym{ run: $r, level: $l }}),*]
144 pub const H263_RL_CODES: &[H263RLCodeDesc] = rlcodes!(
145 (0x02, 2, 0, 1), (0x0F, 4, 0, 2), (0x15, 6, 0, 3), (0x17, 7, 0, 4),
146 (0x1F, 8, 0, 5), (0x25, 9, 0, 6), (0x24, 9, 0, 7), (0x21, 10, 0, 8),
147 (0x20, 10, 0, 9), (0x07, 11, 0, 10), (0x06, 11, 0, 11), (0x20, 11, 0, 12),
148 (0x06, 3, 1, 1), (0x14, 6, 1, 2), (0x1E, 8, 1, 3), (0x0F, 10, 1, 4),
149 (0x21, 11, 1, 5), (0x50, 12, 1, 6), (0x0E, 4, 2, 1), (0x1D, 8, 2, 2),
150 (0x0E, 10, 2, 3), (0x51, 12, 2, 4), (0x0D, 5, 3, 1), (0x23, 9, 3, 2),
151 (0x0D, 10, 3, 3), (0x0C, 5, 4, 1), (0x22, 9, 4, 2), (0x52, 12, 4, 3),
152 (0x0B, 5, 5, 1), (0x0C, 10, 5, 2), (0x53, 12, 5, 3), (0x13, 6, 6, 1),
153 (0x0B, 10, 6, 2), (0x54, 12, 6, 3), (0x12, 6, 7, 1), (0x0A, 10, 7, 2),
154 (0x11, 6, 8, 1), (0x09, 10, 8, 2), (0x10, 6, 9, 1), (0x08, 10, 9, 2),
155 (0x16, 7, 10, 1), (0x55, 12, 10, 2), (0x15, 7, 11, 1), (0x14, 7, 12, 1),
156 (0x1C, 8, 13, 1), (0x1B, 8, 14, 1), (0x21, 9, 15, 1), (0x20, 9, 16, 1),
157 (0x1F, 9, 17, 1), (0x1E, 9, 18, 1), (0x1D, 9, 19, 1), (0x1C, 9, 20, 1),
158 (0x1B, 9, 21, 1), (0x1A, 9, 22, 1), (0x22, 11, 23, 1), (0x23, 11, 24, 1),
159 (0x56, 12, 25, 1), (0x57, 12, 26, 1), (0x07, 4, 0, -1), (0x19, 9, 0, -2),
160 (0x05, 11, 0, -3), (0x0F, 6, 1, -1), (0x04, 11, 1, -2), (0x0E, 6, 2, -1),
161 (0x0D, 6, 3, -1), (0x0C, 6, 4, -1), (0x13, 7, 5, -1), (0x12, 7, 6, -1),
162 (0x11, 7, 7, -1), (0x10, 7, 8, -1), (0x1A, 8, 9, -1), (0x19, 8, 10, -1),
163 (0x18, 8, 11, -1), (0x17, 8, 12, -1), (0x16, 8, 13, -1), (0x15, 8, 14, -1),
164 (0x14, 8, 15, -1), (0x13, 8, 16, -1), (0x18, 9, 17, -1), (0x17, 9, 18, -1),
165 (0x16, 9, 19, -1), (0x15, 9, 20, -1), (0x14, 9, 21, -1), (0x13, 9, 22, -1),
166 (0x12, 9, 23, -1), (0x11, 9, 24, -1), (0x07, 10, 25, -1), (0x06, 10, 26, -1),
167 (0x05, 10, 27, -1), (0x04, 10, 28, -1), (0x24, 11, 29, -1), (0x25, 11, 30, -1),
168 (0x26, 11, 31, -1), (0x27, 11, 32, -1), (0x58, 12, 33, -1), (0x59, 12, 34, -1),
169 (0x5A, 12, 35, -1), (0x5B, 12, 36, -1), (0x5C, 12, 37, -1), (0x5D, 12, 38, -1),
170 (0x5E, 12, 39, -1), (0x5F, 12, 40, -1), (0x03, 7, 0, 0)
173 pub const H263_RL_CODES_AIC: &[H263RLCodeDesc] = rlcodes!(
174 (0x02, 2, 0, 1), (0x06, 3, 0, 2), (0x0E, 4, 0, 3), (0x0C, 5, 0, 4),
175 (0x0D, 5, 0, 5), (0x10, 6, 0, 6), (0x11, 6, 0, 7), (0x12, 6, 0, 8),
176 (0x16, 7, 0, 9), (0x1B, 8, 0, 10), (0x20, 9, 0, 11), (0x21, 9, 0, 12),
177 (0x1A, 9, 0, 13), (0x1B, 9, 0, 14), (0x1C, 9, 0, 15), (0x1D, 9, 0, 16),
178 (0x1E, 9, 0, 17), (0x1F, 9, 0, 18), (0x23, 11, 0, 19), (0x22, 11, 0, 20),
179 (0x57, 12, 0, 21), (0x56, 12, 0, 22), (0x55, 12, 0, 23), (0x54, 12, 0, 24),
180 (0x53, 12, 0, 25), (0x0F, 4, 1, 1), (0x14, 6, 1, 2), (0x14, 7, 1, 3),
181 (0x1E, 8, 1, 4), (0x0F, 10, 1, 5), (0x21, 11, 1, 6), (0x50, 12, 1, 7),
182 (0x0B, 5, 2, 1), (0x15, 7, 2, 2), (0x0E, 10, 2, 3), (0x09, 10, 2, 4),
183 (0x15, 6, 3, 1), (0x1D, 8, 3, 2), (0x0D, 10, 3, 3), (0x51, 12, 3, 4),
184 (0x13, 6, 4, 1), (0x23, 9, 4, 2), (0x07, 11, 4, 3), (0x17, 7, 5, 1),
185 (0x22, 9, 5, 2), (0x52, 12, 5, 3), (0x1C, 8, 6, 1), (0x0C, 10, 6, 2),
186 (0x1F, 8, 7, 1), (0x0B, 10, 7, 2), (0x25, 9, 8, 1), (0x0A, 10, 8, 2),
187 (0x24, 9, 9, 1), (0x06, 11, 9, 2), (0x21, 10, 10, 1), (0x20, 10, 11, 1),
188 (0x08, 10, 12, 1), (0x20, 11, 13, 1), (0x07, 4, 0, -1), (0x0C, 6, 0, -2),
189 (0x10, 7, 0, -3), (0x13, 8, 0, -4), (0x11, 9, 0, -5), (0x12, 9, 0, -6),
190 (0x04, 10, 0, -7), (0x27, 11, 0, -8), (0x26, 11, 0, -9), (0x5F, 12, 0,-10),
191 (0x0F, 6, 1, -1), (0x13, 9, 1, -2), (0x05, 10, 1, -3), (0x25, 11, 1, -4),
192 (0x0E, 6, 2, -1), (0x14, 9, 2, -2), (0x24, 11, 2, -3), (0x0D, 6, 3, -1),
193 (0x06, 10, 3, -2), (0x5E, 12, 3, -3), (0x11, 7, 4, -1), (0x07, 10, 4, -2),
194 (0x13, 7, 5, -1), (0x5D, 12, 5, -2), (0x12, 7, 6, -1), (0x5C, 12, 6, -2),
195 (0x14, 8, 7, -1), (0x5B, 12, 7, -2), (0x15, 8, 8, -1), (0x1A, 8, 9, -1),
196 (0x19, 8, 10, -1), (0x18, 8, 11, -1), (0x17, 8, 12, -1), (0x16, 8, 13, -1),
197 (0x19, 9, 14, -1), (0x15, 9, 15, -1), (0x16, 9, 16, -1), (0x18, 9, 17, -1),
198 (0x17, 9, 18, -1), (0x04, 11, 19, -1), (0x05, 11, 20, -1), (0x58, 12, 21, -1),
199 (0x59, 12, 22, -1), (0x5A, 12, 23, -1), (0x03, 7, 0, 0)
202 pub struct H263RLCodeReader { tab: &'static [H263RLCodeDesc] }
204 impl H263RLCodeReader {
205 pub fn new(tab: &'static [H263RLCodeDesc]) -> Self { H263RLCodeReader { tab: tab } }
208 impl CodebookDescReader<H263RLSym> for H263RLCodeReader {
209 fn bits(&mut self, idx: usize) -> u8 { self.tab[idx].bits }
210 fn code(&mut self, idx: usize) -> u32 { self.tab[idx].code as u32 }
211 fn sym (&mut self, idx: usize) -> H263RLSym { self.tab[idx].sym }
212 fn len(&mut self) -> usize { self.tab.len() }