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