]> git.nihav.org Git - nihav.git/blame - src/codecs/h263/data.rs
rv20: use proper DC quant in AIC mode
[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
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
72pub const H263_DQUANT_TAB: &[i8] = &[-1, -2, 1, 2];
73
74pub struct H263ShortCodeReader { tab: &'static [(u8, u8)] }
75
76impl H263ShortCodeReader {
77 pub fn new(tab: &'static [(u8, u8)]) -> Self { H263ShortCodeReader { tab: tab } }
78}
79
80impl CodebookDescReader<u8> for H263ShortCodeReader {
81 fn bits(&mut self, idx: usize) -> u8 { let (_, bits) = self.tab[idx]; bits }
82 fn code(&mut self, idx: usize) -> u32 { let (code, _) = self.tab[idx]; code as u32 }
83 fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
84 fn len(&mut self) -> usize { self.tab.len() }
85}
86
87#[derive(Clone,Copy)]
88pub struct H263RLSym { run: u8, level: i8 }
89impl H263RLSym {
90 pub fn get_run(&self) -> u8 { self.run }
91 pub fn is_last(&self) -> bool { self.level < 0 }
92 pub fn is_escape(&self) -> bool { (self.run == 0) && (self.level == 0) }
93 pub fn get_level(&self) -> i16 { if self.level < 0 { -self.level as i16 } else { self.level as i16 } }
94}
95
96pub struct H263RLCodeDesc { code: u8, bits: u8, sym: H263RLSym }
97
98macro_rules! rlcodes{
99 ($(($c:expr, $b:expr, $r:expr, $l:expr)),*) => {
100 &[$(H263RLCodeDesc{ code: $c, bits: $b, sym: H263RLSym{ run: $r, level: $l }}),*]
101 }
102}
103
104pub const H263_RL_CODES: &[H263RLCodeDesc] = rlcodes!(
105 (0x02, 2, 0, 1), (0x0F, 4, 0, 2), (0x15, 6, 0, 3), (0x17, 7, 0, 4),
106 (0x1F, 8, 0, 5), (0x25, 9, 0, 6), (0x24, 9, 0, 7), (0x21, 10, 0, 8),
107 (0x20, 10, 0, 9), (0x07, 11, 0, 10), (0x06, 11, 0, 11), (0x20, 11, 0, 12),
108 (0x06, 3, 1, 1), (0x14, 6, 1, 2), (0x1E, 8, 1, 3), (0x0F, 10, 1, 4),
109 (0x21, 11, 1, 5), (0x50, 12, 1, 6), (0x0E, 4, 2, 1), (0x1D, 8, 2, 2),
110 (0x0E, 10, 2, 3), (0x51, 12, 2, 4), (0x0D, 5, 3, 1), (0x23, 9, 3, 2),
111 (0x0D, 10, 3, 3), (0x0C, 5, 4, 1), (0x22, 9, 4, 2), (0x52, 12, 4, 3),
112 (0x0B, 5, 5, 1), (0x0C, 10, 5, 2), (0x53, 12, 5, 3), (0x13, 6, 6, 1),
113 (0x0B, 10, 6, 2), (0x54, 12, 6, 3), (0x12, 6, 7, 1), (0x0A, 10, 7, 2),
114 (0x11, 6, 8, 1), (0x09, 10, 8, 2), (0x10, 6, 9, 1), (0x08, 10, 9, 2),
115 (0x16, 7, 10, 1), (0x55, 12, 10, 2), (0x15, 7, 11, 1), (0x14, 7, 12, 1),
116 (0x1C, 8, 13, 1), (0x1B, 8, 14, 1), (0x21, 9, 15, 1), (0x20, 9, 16, 1),
117 (0x1F, 9, 17, 1), (0x1E, 9, 18, 1), (0x1D, 9, 19, 1), (0x1C, 9, 20, 1),
118 (0x1B, 9, 21, 1), (0x1A, 9, 22, 1), (0x22, 11, 23, 1), (0x23, 11, 24, 1),
119 (0x56, 12, 25, 1), (0x57, 12, 26, 1), (0x07, 4, 0, -1), (0x19, 9, 0, -2),
120 (0x05, 11, 0, -3), (0x0F, 6, 1, -1), (0x04, 11, 1, -2), (0x0E, 6, 2, -1),
121 (0x0D, 6, 3, -1), (0x0C, 6, 4, -1), (0x13, 7, 5, -1), (0x12, 7, 6, -1),
122 (0x11, 7, 7, -1), (0x10, 7, 8, -1), (0x1A, 8, 9, -1), (0x19, 8, 10, -1),
123 (0x18, 8, 11, -1), (0x17, 8, 12, -1), (0x16, 8, 13, -1), (0x15, 8, 14, -1),
124 (0x14, 8, 15, -1), (0x13, 8, 16, -1), (0x18, 9, 17, -1), (0x17, 9, 18, -1),
125 (0x16, 9, 19, -1), (0x15, 9, 20, -1), (0x14, 9, 21, -1), (0x13, 9, 22, -1),
126 (0x12, 9, 23, -1), (0x11, 9, 24, -1), (0x07, 10, 25, -1), (0x06, 10, 26, -1),
127 (0x05, 10, 27, -1), (0x04, 10, 28, -1), (0x24, 11, 29, -1), (0x25, 11, 30, -1),
128 (0x26, 11, 31, -1), (0x27, 11, 32, -1), (0x58, 12, 33, -1), (0x59, 12, 34, -1),
129 (0x5A, 12, 35, -1), (0x5B, 12, 36, -1), (0x5C, 12, 37, -1), (0x5D, 12, 38, -1),
130 (0x5E, 12, 39, -1), (0x5F, 12, 40, -1), (0x03, 7, 0, 0)
131);
132
133pub const H263_RL_CODES_AIC: &[H263RLCodeDesc] = rlcodes!(
134 (0x02, 2, 0, 1), (0x06, 3, 0, 2), (0x0E, 4, 0, 3), (0x0C, 5, 0, 4),
135 (0x0D, 5, 0, 5), (0x10, 6, 0, 6), (0x11, 6, 0, 7), (0x12, 6, 0, 8),
136 (0x16, 7, 0, 9), (0x1B, 8, 0, 10), (0x20, 9, 0, 11), (0x21, 9, 0, 12),
137 (0x1A, 9, 0, 13), (0x1B, 9, 0, 14), (0x1C, 9, 0, 15), (0x1D, 9, 0, 16),
138 (0x1E, 9, 0, 17), (0x1F, 9, 0, 18), (0x23, 11, 0, 19), (0x22, 11, 0, 20),
139 (0x57, 12, 0, 21), (0x56, 12, 0, 22), (0x55, 12, 0, 23), (0x54, 12, 0, 24),
140 (0x53, 12, 0, 25), (0x0F, 4, 1, 1), (0x14, 6, 1, 2), (0x14, 7, 1, 3),
141 (0x1E, 8, 1, 4), (0x0F, 10, 1, 5), (0x21, 11, 1, 6), (0x50, 12, 1, 7),
142 (0x0B, 5, 2, 1), (0x15, 7, 2, 2), (0x0E, 10, 2, 3), (0x09, 10, 2, 4),
143 (0x15, 6, 3, 1), (0x1D, 8, 3, 2), (0x0D, 10, 3, 3), (0x51, 12, 3, 4),
144 (0x13, 6, 4, 1), (0x23, 9, 4, 2), (0x07, 11, 4, 3), (0x17, 7, 5, 1),
145 (0x22, 9, 5, 2), (0x52, 12, 5, 3), (0x1C, 8, 6, 1), (0x0C, 10, 6, 2),
146 (0x1F, 8, 7, 1), (0x0B, 10, 7, 2), (0x25, 9, 8, 1), (0x0A, 10, 8, 2),
147 (0x24, 9, 9, 1), (0x06, 11, 9, 2), (0x21, 10, 10, 1), (0x20, 10, 11, 1),
148 (0x08, 10, 12, 1), (0x20, 11, 13, 1), (0x07, 4, 0, -1), (0x0C, 6, 0, -2),
149 (0x10, 7, 0, -3), (0x13, 8, 0, -4), (0x11, 9, 0, -5), (0x12, 9, 0, -6),
150 (0x04, 10, 0, -7), (0x27, 11, 0, -8), (0x26, 11, 0, -9), (0x5F, 12, 0,-10),
151 (0x0F, 6, 1, -1), (0x13, 9, 1, -2), (0x05, 10, 1, -3), (0x25, 11, 1, -4),
152 (0x0E, 6, 2, -1), (0x14, 9, 2, -2), (0x24, 11, 2, -3), (0x0D, 6, 3, -1),
153 (0x06, 10, 3, -2), (0x5E, 12, 3, -3), (0x11, 7, 4, -1), (0x07, 10, 4, -2),
154 (0x13, 7, 5, -1), (0x5D, 12, 5, -2), (0x12, 7, 6, -1), (0x5C, 12, 6, -2),
155 (0x14, 8, 7, -1), (0x5B, 12, 7, -2), (0x15, 8, 8, -1), (0x1A, 8, 9, -1),
156 (0x19, 8, 10, -1), (0x18, 8, 11, -1), (0x17, 8, 12, -1), (0x16, 8, 13, -1),
157 (0x19, 9, 14, -1), (0x15, 9, 15, -1), (0x16, 9, 16, -1), (0x18, 9, 17, -1),
158 (0x17, 9, 18, -1), (0x04, 11, 19, -1), (0x05, 11, 20, -1), (0x58, 12, 21, -1),
159 (0x59, 12, 22, -1), (0x5A, 12, 23, -1), (0x03, 7, 0, 0)
160);
161
162pub struct H263RLCodeReader { tab: &'static [H263RLCodeDesc] }
163
164impl H263RLCodeReader {
165 pub fn new(tab: &'static [H263RLCodeDesc]) -> Self { H263RLCodeReader { tab: tab } }
166}
167
168impl CodebookDescReader<H263RLSym> for H263RLCodeReader {
169 fn bits(&mut self, idx: usize) -> u8 { self.tab[idx].bits }
170 fn code(&mut self, idx: usize) -> u32 { self.tab[idx].code as u32 }
171 fn sym (&mut self, idx: usize) -> H263RLSym { self.tab[idx].sym }
172 fn len(&mut self) -> usize { self.tab.len() }
173}
174