comparison vp8data.h @ 11921:f2007d7c3f1d libavcodec

Native VP8 decoder. Patch by David Conrad <lessen42 gmail com> and myself.
author rbultje
date Tue, 22 Jun 2010 19:24:09 +0000
parents
children 1e8556438209
comparison
equal deleted inserted replaced
11920:7d04a6cec75f 11921:f2007d7c3f1d
1 /**
2 * VP8 compatible video decoder
3 *
4 * Copyright (C) 2010 David Conrad
5 * Copyright (C) 2010 Ronald S. Bultje
6 *
7 * This file is part of FFmpeg.
8 *
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24 // TODO: move these #define ane enum to a better header...
25
26 #define VP8_MAX_QUANT 127
27
28 enum dct_token {
29 DCT_0,
30 DCT_1,
31 DCT_2,
32 DCT_3,
33 DCT_4,
34 DCT_CAT1,
35 DCT_CAT2,
36 DCT_CAT3,
37 DCT_CAT4,
38 DCT_CAT5,
39 DCT_CAT6,
40 DCT_EOB,
41
42 NUM_DCT_TOKENS
43 };
44
45 #include "h264pred.h"
46
47 // used to signal 4x4 intra pred in luma MBs
48 #define MODE_I4x4 4
49
50 enum inter_mvmode {
51 VP8_MVMODE_NEAREST = MODE_I4x4 + 1,
52 VP8_MVMODE_NEAR,
53 VP8_MVMODE_ZERO,
54 VP8_MVMODE_NEW,
55 VP8_MVMODE_SPLIT
56 };
57
58 enum inter_submvmode {
59 VP8_SUBMVMODE_LEFT4X4,
60 VP8_SUBMVMODE_TOP4X4,
61 VP8_SUBMVMODE_ZERO4X4,
62 VP8_SUBMVMODE_NEW4X4
63 };
64
65 static const uint8_t vp8_pred4x4_mode[] =
66 {
67 [DC_PRED8x8] = DC_PRED,
68 [VERT_PRED8x8] = VERT_PRED,
69 [HOR_PRED8x8] = HOR_PRED,
70 [PLANE_PRED8x8] = TM_VP8_PRED,
71 };
72
73 static const int8_t vp8_pred16x16_tree_intra[4][2] =
74 {
75 { -MODE_I4x4, 1 }, // '0'
76 { 2, 3 },
77 { -DC_PRED8x8, -VERT_PRED8x8 }, // '100', '101'
78 { -HOR_PRED8x8, -PLANE_PRED8x8 }, // '110', '111'
79 };
80
81 static const int8_t vp8_pred16x16_tree_inter[4][2] =
82 {
83 { -DC_PRED8x8, 1 }, // '0'
84 { 2, 3 },
85 { -VERT_PRED8x8, -HOR_PRED8x8 }, // '100', '101'
86 { -PLANE_PRED8x8, -MODE_I4x4 }, // '110', '111'
87 };
88
89 static const int vp8_mode_contexts[6][4] = {
90 { 7, 1, 1, 143 },
91 { 14, 18, 14, 107 },
92 { 135, 64, 57, 68 },
93 { 60, 56, 128, 65 },
94 { 159, 134, 128, 34 },
95 { 234, 188, 128, 28 },
96 };
97
98 static const int8_t vp8_pred16x16_tree_mvinter[4][2] = {
99 { -VP8_MVMODE_ZERO, 1 }, // '0'
100 { -VP8_MVMODE_NEAREST, 2 }, // '10'
101 { -VP8_MVMODE_NEAR, 3 }, // '110'
102 { -VP8_MVMODE_NEW, -VP8_MVMODE_SPLIT } // '1110', '1111'
103 };
104
105 static const int8_t vp8_small_mvtree[7][2] = {
106 { 1, 4 },
107 { 2, 3 },
108 { -0, -1 }, // '000', '001'
109 { -2, -3 }, // '010', '011'
110 { 5, 6 },
111 { -4, -5 }, // '100', '101'
112 { -6, -7 } // '110', '111'
113 };
114
115 static const uint8_t vp8_mbsplits[4][16] = {
116 { 0, 0, 0, 0, 0, 0, 0, 0,
117 1, 1, 1, 1, 1, 1, 1, 1 },
118 { 0, 0, 1, 1, 0, 0, 1, 1,
119 0, 0, 1, 1, 0, 0, 1, 1 },
120 { 0, 0, 1, 1, 0, 0, 1, 1,
121 2, 2, 3, 3, 2, 2, 3, 3 },
122 { 0, 1, 2, 3, 4, 5, 6, 7,
123 8, 9, 10, 11, 12, 13, 14, 15 }
124 };
125
126 static const uint8_t vp8_mbfirstidx[4][16] = {
127 { 0, 8 }, { 0, 2 }, { 0, 2, 8, 10 },
128 { 0, 1, 2, 3, 4, 5, 6, 7,
129 8, 9, 10, 11, 12, 13, 14, 15 }
130 };
131
132 static const int8_t vp8_mbsplit_tree[3][2] = {
133 { -3, 1 }, // '0' - 16 individual MVs
134 { -2, 2 }, // '10' - quarter-based MVs
135 { -0, -1 } // '110' - top/bottom MVs,
136 // '111' - left/right MVs
137 };
138 static const uint8_t vp8_mbsplit_count[4] = { 2, 2, 4, 16 };
139 static const uint8_t vp8_mbsplit_prob[3] = { 110, 111, 150 };
140
141 static const uint8_t vp8_submv_prob[5][3] = {
142 { 147, 136, 18 },
143 { 106, 145, 1 },
144 { 179, 121, 1 },
145 { 223, 1, 34 },
146 { 208, 1, 1 }
147 };
148
149 static const int8_t vp8_submv_ref_tree[3][2] = {
150 { -VP8_SUBMVMODE_LEFT4X4, 1 }, // '0'
151 { -VP8_SUBMVMODE_TOP4X4, 2 }, // '10'
152 { -VP8_SUBMVMODE_ZERO4X4, -VP8_SUBMVMODE_NEW4X4 } // '110', '111'
153 };
154
155 static const uint8_t vp8_pred16x16_prob_intra[4] = { 145, 156, 163, 128 };
156 static const uint8_t vp8_pred16x16_prob_inter[4] = { 112, 86, 140, 37 };
157
158 static const int8_t vp8_pred4x4_tree[9][2] =
159 {
160 { -DC_PRED, 1 }, // '0'
161 { -TM_VP8_PRED, 2 }, // '10'
162 { -VERT_PRED, 3 }, // '110'
163 { 4, 6 },
164 { -HOR_PRED, 5 }, // '11100'
165 { -DIAG_DOWN_RIGHT_PRED, -VERT_RIGHT_PRED }, // '111010', '111011'
166 { -DIAG_DOWN_LEFT_PRED, 7 }, // '11110'
167 { -VERT_LEFT_PRED, 8 }, // '111110'
168 { -HOR_DOWN_PRED, -HOR_UP_PRED }, // '1111110', '1111111'
169 };
170
171 static const int8_t vp8_pred8x8c_tree[3][2] =
172 {
173 { -DC_PRED8x8, 1 }, // '0'
174 { -VERT_PRED8x8, 2 }, // '10
175 { -HOR_PRED8x8, -PLANE_PRED8x8 }, // '110', '111'
176 };
177
178 static const uint8_t vp8_pred8x8c_prob_intra[3] = { 142, 114, 183 };
179 static const uint8_t vp8_pred8x8c_prob_inter[3] = { 162, 101, 204 };
180
181 static const uint8_t vp8_pred4x4_prob_inter[9] =
182 {
183 120, 90, 79, 133, 87, 85, 80, 111, 151
184 };
185
186 static const uint8_t vp8_pred4x4_prob_intra[10][10][9] =
187 {
188 {
189 { 39, 53, 200, 87, 26, 21, 43, 232, 171 },
190 { 56, 34, 51, 104, 114, 102, 29, 93, 77 },
191 { 88, 88, 147, 150, 42, 46, 45, 196, 205 },
192 { 107, 54, 32, 26, 51, 1, 81, 43, 31 },
193 { 39, 28, 85, 171, 58, 165, 90, 98, 64 },
194 { 34, 22, 116, 206, 23, 34, 43, 166, 73 },
195 { 34, 19, 21, 102, 132, 188, 16, 76, 124 },
196 { 68, 25, 106, 22, 64, 171, 36, 225, 114 },
197 { 62, 18, 78, 95, 85, 57, 50, 48, 51 },
198 { 43, 97, 183, 117, 85, 38, 35, 179, 61 },
199 },
200 {
201 { 112, 113, 77, 85, 179, 255, 38, 120, 114 },
202 { 40, 42, 1, 196, 245, 209, 10, 25, 109 },
203 { 193, 101, 35, 159, 215, 111, 89, 46, 111 },
204 { 100, 80, 8, 43, 154, 1, 51, 26, 71 },
205 { 88, 43, 29, 140, 166, 213, 37, 43, 154 },
206 { 61, 63, 30, 155, 67, 45, 68, 1, 209 },
207 { 41, 40, 5, 102, 211, 183, 4, 1, 221 },
208 { 142, 78, 78, 16, 255, 128, 34, 197, 171 },
209 { 51, 50, 17, 168, 209, 192, 23, 25, 82 },
210 { 60, 148, 31, 172, 219, 228, 21, 18, 111 },
211 },
212 {
213 { 175, 69, 143, 80, 85, 82, 72, 155, 103 },
214 { 56, 58, 10, 171, 218, 189, 17, 13, 152 },
215 { 231, 120, 48, 89, 115, 113, 120, 152, 112 },
216 { 144, 71, 10, 38, 171, 213, 144, 34, 26 },
217 { 114, 26, 17, 163, 44, 195, 21, 10, 173 },
218 { 121, 24, 80, 195, 26, 62, 44, 64, 85 },
219 { 63, 20, 8, 114, 114, 208, 12, 9, 226 },
220 { 170, 46, 55, 19, 136, 160, 33, 206, 71 },
221 { 81, 40, 11, 96, 182, 84, 29, 16, 36 },
222 { 152, 179, 64, 126, 170, 118, 46, 70, 95 },
223 },
224 {
225 { 75, 79, 123, 47, 51, 128, 81, 171, 1 },
226 { 57, 17, 5, 71, 102, 57, 53, 41, 49 },
227 { 125, 98, 42, 88, 104, 85, 117, 175, 82 },
228 { 115, 21, 2, 10, 102, 255, 166, 23, 6 },
229 { 38, 33, 13, 121, 57, 73, 26, 1, 85 },
230 { 41, 10, 67, 138, 77, 110, 90, 47, 114 },
231 { 57, 18, 10, 102, 102, 213, 34, 20, 43 },
232 { 101, 29, 16, 10, 85, 128, 101, 196, 26 },
233 { 117, 20, 15, 36, 163, 128, 68, 1, 26 },
234 { 95, 84, 53, 89, 128, 100, 113, 101, 45 },
235 },
236 {
237 { 63, 59, 90, 180, 59, 166, 93, 73, 154 },
238 { 40, 40, 21, 116, 143, 209, 34, 39, 175 },
239 { 138, 31, 36, 171, 27, 166, 38, 44, 229 },
240 { 57, 46, 22, 24, 128, 1, 54, 17, 37 },
241 { 47, 15, 16, 183, 34, 223, 49, 45, 183 },
242 { 46, 17, 33, 183, 6, 98, 15, 32, 183 },
243 { 40, 3, 9, 115, 51, 192, 18, 6, 223 },
244 { 65, 32, 73, 115, 28, 128, 23, 128, 205 },
245 { 87, 37, 9, 115, 59, 77, 64, 21, 47 },
246 { 67, 87, 58, 169, 82, 115, 26, 59, 179 },
247 },
248 {
249 { 54, 57, 112, 184, 5, 41, 38, 166, 213 },
250 { 30, 34, 26, 133, 152, 116, 10, 32, 134 },
251 { 104, 55, 44, 218, 9, 54, 53, 130, 226 },
252 { 75, 32, 12, 51, 192, 255, 160, 43, 51 },
253 { 39, 19, 53, 221, 26, 114, 32, 73, 255 },
254 { 31, 9, 65, 234, 2, 15, 1, 118, 73 },
255 { 56, 21, 23, 111, 59, 205, 45, 37, 192 },
256 { 88, 31, 35, 67, 102, 85, 55, 186, 85 },
257 { 55, 38, 70, 124, 73, 102, 1, 34, 98 },
258 { 64, 90, 70, 205, 40, 41, 23, 26, 57 },
259 },
260 {
261 { 86, 40, 64, 135, 148, 224, 45, 183, 128 },
262 { 22, 26, 17, 131, 240, 154, 14, 1, 209 },
263 { 164, 50, 31, 137, 154, 133, 25, 35, 218 },
264 { 83, 12, 13, 54, 192, 255, 68, 47, 28 },
265 { 45, 16, 21, 91, 64, 222, 7, 1, 197 },
266 { 56, 21, 39, 155, 60, 138, 23, 102, 213 },
267 { 18, 11, 7, 63, 144, 171, 4, 4, 246 },
268 { 85, 26, 85, 85, 128, 128, 32, 146, 171 },
269 { 35, 27, 10, 146, 174, 171, 12, 26, 128 },
270 { 51, 103, 44, 131, 131, 123, 31, 6, 158 },
271 },
272 {
273 { 68, 45, 128, 34, 1, 47, 11, 245, 171 },
274 { 62, 17, 19, 70, 146, 85, 55, 62, 70 },
275 { 102, 61, 71, 37, 34, 53, 31, 243, 192 },
276 { 75, 15, 9, 9, 64, 255, 184, 119, 16 },
277 { 37, 43, 37, 154, 100, 163, 85, 160, 1 },
278 { 63, 9, 92, 136, 28, 64, 32, 201, 85 },
279 { 56, 8, 17, 132, 137, 255, 55, 116, 128 },
280 { 86, 6, 28, 5, 64, 255, 25, 248, 1 },
281 { 58, 15, 20, 82, 135, 57, 26, 121, 40 },
282 { 69, 60, 71, 38, 73, 119, 28, 222, 37 },
283 },
284 {
285 { 101, 75, 128, 139, 118, 146, 116, 128, 85 },
286 { 56, 41, 15, 176, 236, 85, 37, 9, 62 },
287 { 190, 80, 35, 99, 180, 80, 126, 54, 45 },
288 { 146, 36, 19, 30, 171, 255, 97, 27, 20 },
289 { 71, 30, 17, 119, 118, 255, 17, 18, 138 },
290 { 101, 38, 60, 138, 55, 70, 43, 26, 142 },
291 { 32, 41, 20, 117, 151, 142, 20, 21, 163 },
292 { 138, 45, 61, 62, 219, 1, 81, 188, 64 },
293 { 112, 19, 12, 61, 195, 128, 48, 4, 24 },
294 { 85, 126, 47, 87, 176, 51, 41, 20, 32 },
295 },
296 {
297 { 66, 102, 167, 99, 74, 62, 40, 234, 128 },
298 { 41, 53, 9, 178, 241, 141, 26, 8, 107 },
299 { 134, 183, 89, 137, 98, 101, 106, 165, 148 },
300 { 104, 79, 12, 27, 217, 255, 87, 17, 7 },
301 { 74, 43, 26, 146, 73, 166, 49, 23, 157 },
302 { 65, 38, 105, 160, 51, 52, 31, 115, 128 },
303 { 47, 41, 14, 110, 182, 183, 21, 17, 194 },
304 { 87, 68, 71, 44, 114, 51, 15, 186, 23 },
305 { 66, 45, 25, 102, 197, 189, 23, 18, 22 },
306 { 72, 187, 100, 130, 157, 111, 32, 75, 80 },
307 },
308 };
309
310 static const int8_t vp8_segmentid_tree[][2] =
311 {
312 { 1, 2 },
313 { -0, -1 }, // '00', '01'
314 { -2, -3 }, // '10', '11'
315 };
316
317 static const uint8_t vp8_coeff_band[16] =
318 {
319 0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7
320 };
321
322 static const int8_t vp8_coeff_tree[NUM_DCT_TOKENS-1][2] =
323 {
324 { -DCT_EOB, 1 }, // '0'
325 { -DCT_0, 2 }, // '10'
326 { -DCT_1, 3 }, // '110'
327 { 4, 6 },
328 { -DCT_2, 5 }, // '11100'
329 { -DCT_3, -DCT_4 }, // '111010', '111011'
330 { 7, 8 },
331 { -DCT_CAT1, -DCT_CAT2 }, // '111100', '111101'
332 { 9, 10 },
333 { -DCT_CAT3, -DCT_CAT4 }, // '1111100', '1111101'
334 { -DCT_CAT5, -DCT_CAT6 }, // '1111110', '1111111'
335 };
336
337 static const uint8_t vp8_dct_cat1_prob[] = { 159, 0 };
338 static const uint8_t vp8_dct_cat2_prob[] = { 165, 145, 0 };
339 static const uint8_t vp8_dct_cat3_prob[] = { 173, 148, 140, 0 };
340 static const uint8_t vp8_dct_cat4_prob[] = { 176, 155, 140, 135, 0 };
341 static const uint8_t vp8_dct_cat5_prob[] = { 180, 157, 141, 134, 130, 0 };
342 static const uint8_t vp8_dct_cat6_prob[] = { 254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0 };
343
344 static const uint8_t * const vp8_dct_cat_prob[6] =
345 {
346 vp8_dct_cat1_prob,
347 vp8_dct_cat2_prob,
348 vp8_dct_cat3_prob,
349 vp8_dct_cat4_prob,
350 vp8_dct_cat5_prob,
351 vp8_dct_cat6_prob,
352 };
353
354 static const uint8_t vp8_dct_cat_offset[6] = { 5, 7, 11, 19, 35, 67 };
355
356 static const uint8_t vp8_token_default_probs[4][8][3][NUM_DCT_TOKENS-1] =
357 {
358 {
359 {
360 { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
361 { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
362 { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
363 },
364 {
365 { 253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128 },
366 { 189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128 },
367 { 106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128 },
368 },
369 {
370 { 1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128 },
371 { 181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128 },
372 { 78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128 },
373 },
374 {
375 { 1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128 },
376 { 184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128 },
377 { 77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128 },
378 },
379 {
380 { 1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128 },
381 { 170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128 },
382 { 37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128 },
383 },
384 {
385 { 1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128 },
386 { 207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128 },
387 { 102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128 },
388 },
389 {
390 { 1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128 },
391 { 177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128 },
392 { 80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128 },
393 },
394 {
395 { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
396 { 246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
397 { 255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
398 },
399 },
400 {
401 {
402 { 198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62 },
403 { 131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1 },
404 { 68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128 },
405 },
406 {
407 { 1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128 },
408 { 184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128 },
409 { 81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128 },
410 },
411 {
412 { 1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128 },
413 { 99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128 },
414 { 23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128 },
415 },
416 {
417 { 1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128 },
418 { 109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128 },
419 { 44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128 },
420 },
421 {
422 { 1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128 },
423 { 94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128 },
424 { 22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128 },
425 },
426 {
427 { 1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128 },
428 { 124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128 },
429 { 35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128 },
430 },
431 {
432 { 1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128 },
433 { 121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128 },
434 { 45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128 },
435 },
436 {
437 { 1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128 },
438 { 203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128 },
439 { 137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128 },
440 },
441 },
442 {
443 {
444 { 253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128 },
445 { 175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128 },
446 { 73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128 },
447 },
448 {
449 { 1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128 },
450 { 239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128 },
451 { 155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128 },
452 },
453 {
454 { 1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128 },
455 { 201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128 },
456 { 69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128 },
457 },
458 {
459 { 1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128 },
460 { 223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128 },
461 { 141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128 },
462 },
463 {
464 { 1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128 },
465 { 190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128 },
466 { 149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
467 },
468 {
469 { 1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
470 { 247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
471 { 240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
472 },
473 {
474 { 1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128 },
475 { 213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128 },
476 { 55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
477 },
478 {
479 { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
480 { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
481 { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 },
482 },
483 },
484 {
485 {
486 { 202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255 },
487 { 126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128 },
488 { 61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128 },
489 },
490 {
491 { 1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128 },
492 { 166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128 },
493 { 39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128 },
494 },
495 {
496 { 1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128 },
497 { 124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128 },
498 { 24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128 },
499 },
500 {
501 { 1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128 },
502 { 149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128 },
503 { 28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128 },
504 },
505 {
506 { 1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128 },
507 { 123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128 },
508 { 20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128 },
509 },
510 {
511 { 1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128 },
512 { 168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128 },
513 { 47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128 },
514 },
515 {
516 { 1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128 },
517 { 141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128 },
518 { 42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128 },
519 },
520 {
521 { 1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
522 { 244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
523 { 238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128 },
524 },
525 },
526 };
527
528 static const uint8_t vp8_token_update_probs[4][8][3][NUM_DCT_TOKENS-1] =
529 {
530 {
531 {
532 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
533 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
534 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
535 },
536 {
537 { 176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
538 { 223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255 },
539 { 249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
540 },
541 {
542 { 255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255 },
543 { 234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
544 { 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
545 },
546 {
547 { 255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
548 { 239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
549 { 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
550 },
551 {
552 { 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
553 { 251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
554 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
555 },
556 {
557 { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
558 { 251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
559 { 254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
560 },
561 {
562 { 255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255 },
563 { 250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255 },
564 { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
565 },
566 {
567 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
568 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
569 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
570 },
571 },
572 {
573 {
574 { 217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
575 { 225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255 },
576 { 234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255 },
577 },
578 {
579 { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
580 { 223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
581 { 238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255 },
582 },
583 {
584 { 255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
585 { 249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
586 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
587 },
588 {
589 { 255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
590 { 247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
591 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
592 },
593 {
594 { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
595 { 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
596 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
597 },
598 {
599 { 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
600 { 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
601 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
602 },
603 {
604 { 255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
605 { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
606 { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
607 },
608 {
609 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
610 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
611 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
612 },
613 },
614 {
615 {
616 { 186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255 },
617 { 234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255 },
618 { 251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255 },
619 },
620 {
621 { 255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
622 { 236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
623 { 251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255 },
624 },
625 {
626 { 255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
627 { 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
628 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
629 },
630 {
631 { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
632 { 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
633 { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
634 },
635 {
636 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
637 { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
638 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
639 },
640 {
641 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
642 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
643 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
644 },
645 {
646 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
647 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
648 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
649 },
650 {
651 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
652 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
653 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
654 },
655 },
656 {
657 {
658 { 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
659 { 250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255 },
660 { 248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255 },
661 },
662 {
663 { 255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
664 { 246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
665 { 252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255 },
666 },
667 {
668 { 255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255 },
669 { 248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
670 { 253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255 },
671 },
672 {
673 { 255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
674 { 245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
675 { 253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
676 },
677 {
678 { 255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
679 { 252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
680 { 255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
681 },
682 {
683 { 255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
684 { 249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
685 { 255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255 },
686 },
687 {
688 { 255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255 },
689 { 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
690 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
691 },
692 {
693 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
694 { 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
695 { 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 },
696 },
697 },
698 };
699
700 // fixme: copied from h264data.h
701 static const uint8_t zigzag_scan[16]={
702 0+0*4, 1+0*4, 0+1*4, 0+2*4,
703 1+1*4, 2+0*4, 3+0*4, 2+1*4,
704 1+2*4, 0+3*4, 1+3*4, 2+2*4,
705 3+1*4, 3+2*4, 2+3*4, 3+3*4,
706 };
707
708 static const uint8_t vp8_dc_qlookup[VP8_MAX_QUANT+1] =
709 {
710 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17,
711 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28,
712 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43,
713 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
714 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
715 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
716 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118,
717 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,
718 };
719
720 static const uint16_t vp8_ac_qlookup[VP8_MAX_QUANT+1] =
721 {
722 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
723 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
724 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
725 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76,
726 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108,
727 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152,
728 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209,
729 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,
730 };
731
732 static const uint8_t vp8_mv_update_prob[2][19] = {
733 { 237,
734 246,
735 253, 253, 254, 254, 254, 254, 254,
736 254, 254, 254, 254, 254, 250, 250, 252, 254, 254 },
737 { 231,
738 243,
739 245, 253, 254, 254, 254, 254, 254,
740 254, 254, 254, 254, 254, 251, 251, 254, 254, 254 }
741 };
742
743 static const uint8_t vp8_mv_default_prob[2][19] = {
744 { 162,
745 128,
746 225, 146, 172, 147, 214, 39, 156,
747 128, 129, 132, 75, 145, 178, 206, 239, 254, 254 },
748 { 164,
749 128,
750 204, 170, 119, 235, 140, 230, 228,
751 128, 130, 130, 74, 148, 180, 203, 236, 254, 254 }
752 };