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