]> git.nihav.org Git - nihav.git/blame - nihav-core/src/codecs/h263/data.rs
crate for Duck decoders with TM RT decoder
[nihav.git] / nihav-core / src / codecs / h263 / data.rs
CommitLineData
aca89041 1use crate::io::codebook::CodebookDescReader;
cf64af13
KS
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
de919937
KS
7#[allow(dead_code)]
8pub 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
cf64af13
KS
11pub 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
ef3209c7
KS
22pub 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
33pub 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
cf64af13
KS
44pub const H263_SIZES: &[(usize, usize)] = &[
45 (0, 0), (128, 96), (176, 144), (352, 288), (704, 576), (1408, 1152)
46];
47
48pub 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
52pub 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
59pub 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
64pub 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
271cfde5
KS
72pub 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
79pub const H263_MBB_CAP_CODED: u8 = 0x2;
80pub const H263_MBB_CAP_DQUANT: u8 = 0x4;
81pub const H263_MBB_CAP_FORWARD: u8 = 0x10;
82pub const H263_MBB_CAP_BACKWARD: u8 = 0x20;
83pub const H263_MBB_CAP_INTRA: u8 = 0x80;
84
85pub 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
93pub const H263_CBPC_B: &[(u8, u8)] = &[
94 (0, 1), (2, 2), (7, 3), (6, 3)
95];
96
cf64af13
KS
97pub const H263_DQUANT_TAB: &[i8] = &[-1, -2, 1, 2];
98
43c8b55e
KS
99pub const H263_MODIFIED_QUANT: [[u8; 32]; 2] = [
100 [
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
103 ], [
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
106 ]
107];
108
109pub 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
112];
113
cf64af13
KS
114pub struct H263ShortCodeReader { tab: &'static [(u8, u8)] }
115
116impl H263ShortCodeReader {
117 pub fn new(tab: &'static [(u8, u8)]) -> Self { H263ShortCodeReader { tab: tab } }
118}
119
120impl 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() }
125}
126
127#[derive(Clone,Copy)]
128pub struct H263RLSym { run: u8, level: i8 }
129impl H263RLSym {
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 } }
134}
135
136pub struct H263RLCodeDesc { code: u8, bits: u8, sym: H263RLSym }
137
138macro_rules! rlcodes{
139 ($(($c:expr, $b:expr, $r:expr, $l:expr)),*) => {
140 &[$(H263RLCodeDesc{ code: $c, bits: $b, sym: H263RLSym{ run: $r, level: $l }}),*]
141 }
142}
143
144pub 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)
171);
172
173pub 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)
200);
201
202pub struct H263RLCodeReader { tab: &'static [H263RLCodeDesc] }
203
204impl H263RLCodeReader {
205 pub fn new(tab: &'static [H263RLCodeDesc]) -> Self { H263RLCodeReader { tab: tab } }
206}
207
208impl 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() }
213}
214