optimize mpeg1_encode_block()
[ffmpeg.git] / libavcodec / mpeg12data.h
1 /*
2  * MPEG1/2 tables
3  */
4
5 INT16 default_intra_matrix[64] = {
6         8, 16, 19, 22, 26, 27, 29, 34,
7         16, 16, 22, 24, 27, 29, 34, 37,
8         19, 22, 26, 27, 29, 34, 34, 38,
9         22, 22, 26, 27, 29, 34, 37, 40,
10         22, 26, 27, 29, 32, 35, 40, 48,
11         26, 27, 29, 32, 35, 40, 48, 58,
12         26, 27, 29, 34, 38, 46, 56, 69,
13         27, 29, 35, 38, 46, 56, 69, 83
14 };
15
16 INT16 default_non_intra_matrix[64] = {
17     16, 16, 16, 16, 16, 16, 16, 16,
18     16, 16, 16, 16, 16, 16, 16, 16,
19     16, 16, 16, 16, 16, 16, 16, 16,
20     16, 16, 16, 16, 16, 16, 16, 16,
21     16, 16, 16, 16, 16, 16, 16, 16,
22     16, 16, 16, 16, 16, 16, 16, 16,
23     16, 16, 16, 16, 16, 16, 16, 16,
24     16, 16, 16, 16, 16, 16, 16, 16,
25 };
26
27 const unsigned char vlc_dc_table[256] = {
28     0, 1, 2, 2,
29     3, 3, 3, 3,
30     4, 4, 4, 4, 4, 4, 4, 4,
31     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
32     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
33     6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
34
35     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
36     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
37     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
38     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
39
40     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
41     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
42     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
43     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
44     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
45     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
46     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
47     8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
48 };
49
50 const UINT16 vlc_dc_lum_code[12] = {
51     0x4, 0x0, 0x1, 0x5, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe, 0x1ff,
52 };
53 const unsigned char vlc_dc_lum_bits[12] = {
54     3, 2, 2, 3, 3, 4, 5, 6, 7, 8, 9, 9,
55 };
56
57 const UINT16 vlc_dc_chroma_code[12] = {
58     0x0, 0x1, 0x2, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe, 0x3fe, 0x3ff,
59 };
60 const unsigned char vlc_dc_chroma_bits[12] = {
61     2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10,
62 };
63
64 static const UINT16 mpeg1_vlc[113][2] = {
65  { 0x3, 2 }, { 0x4, 4 }, { 0x5, 5 }, { 0x6, 7 },
66  { 0x26, 8 }, { 0x21, 8 }, { 0xa, 10 }, { 0x1d, 12 },
67  { 0x18, 12 }, { 0x13, 12 }, { 0x10, 12 }, { 0x1a, 13 },
68  { 0x19, 13 }, { 0x18, 13 }, { 0x17, 13 }, { 0x1f, 14 },
69  { 0x1e, 14 }, { 0x1d, 14 }, { 0x1c, 14 }, { 0x1b, 14 },
70  { 0x1a, 14 }, { 0x19, 14 }, { 0x18, 14 }, { 0x17, 14 },
71  { 0x16, 14 }, { 0x15, 14 }, { 0x14, 14 }, { 0x13, 14 },
72  { 0x12, 14 }, { 0x11, 14 }, { 0x10, 14 }, { 0x18, 15 },
73  { 0x17, 15 }, { 0x16, 15 }, { 0x15, 15 }, { 0x14, 15 },
74  { 0x13, 15 }, { 0x12, 15 }, { 0x11, 15 }, { 0x10, 15 },
75  { 0x3, 3 }, { 0x6, 6 }, { 0x25, 8 }, { 0xc, 10 },
76  { 0x1b, 12 }, { 0x16, 13 }, { 0x15, 13 }, { 0x1f, 15 },
77  { 0x1e, 15 }, { 0x1d, 15 }, { 0x1c, 15 }, { 0x1b, 15 },
78  { 0x1a, 15 }, { 0x19, 15 }, { 0x13, 16 }, { 0x12, 16 },
79  { 0x11, 16 }, { 0x10, 16 }, { 0x5, 4 }, { 0x4, 7 },
80  { 0xb, 10 }, { 0x14, 12 }, { 0x14, 13 }, { 0x7, 5 },
81  { 0x24, 8 }, { 0x1c, 12 }, { 0x13, 13 }, { 0x6, 5 },
82  { 0xf, 10 }, { 0x12, 12 }, { 0x7, 6 }, { 0x9, 10 },
83  { 0x12, 13 }, { 0x5, 6 }, { 0x1e, 12 }, { 0x14, 16 },
84  { 0x4, 6 }, { 0x15, 12 }, { 0x7, 7 }, { 0x11, 12 },
85  { 0x5, 7 }, { 0x11, 13 }, { 0x27, 8 }, { 0x10, 13 },
86  { 0x23, 8 }, { 0x1a, 16 }, { 0x22, 8 }, { 0x19, 16 },
87  { 0x20, 8 }, { 0x18, 16 }, { 0xe, 10 }, { 0x17, 16 },
88  { 0xd, 10 }, { 0x16, 16 }, { 0x8, 10 }, { 0x15, 16 },
89  { 0x1f, 12 }, { 0x1a, 12 }, { 0x19, 12 }, { 0x17, 12 },
90  { 0x16, 12 }, { 0x1f, 13 }, { 0x1e, 13 }, { 0x1d, 13 },
91  { 0x1c, 13 }, { 0x1b, 13 }, { 0x1f, 16 }, { 0x1e, 16 },
92  { 0x1d, 16 }, { 0x1c, 16 }, { 0x1b, 16 },
93  { 0x1, 6 }, /* escape */
94  { 0x2, 2 }, /* EOB */
95 };
96
97 static const UINT16 mpeg2_vlc[113][2] = {
98   {0x02, 2}, {0x06, 3}, {0x07, 4}, {0x1c, 5},
99   {0x1d, 5}, {0x05, 6}, {0x04, 6}, {0x7b, 7},
100   {0x7c, 7}, {0x23, 8}, {0x22, 8}, {0xfa, 8},
101   {0xfb, 8}, {0xfe, 8}, {0xff, 8}, {0x1f,14},
102   {0x1e,14}, {0x1d,14}, {0x1c,14}, {0x1b,14},
103   {0x1a,14}, {0x19,14}, {0x18,14}, {0x17,14},
104   {0x16,14}, {0x15,14}, {0x14,14}, {0x13,14},
105   {0x12,14}, {0x11,14}, {0x10,14}, {0x18,15},
106   {0x17,15}, {0x16,15}, {0x15,15}, {0x14,15},
107   {0x13,15}, {0x12,15}, {0x11,15}, {0x10,15},
108   {0x02, 3}, {0x06, 5}, {0x79, 7}, {0x27, 8},
109   {0x20, 8}, {0x16,13}, {0x15,13}, {0x1f,15},
110   {0x1e,15}, {0x1d,15}, {0x1c,15}, {0x1b,15},
111   {0x1a,15}, {0x19,15}, {0x13,16}, {0x12,16},
112   {0x11,16}, {0x10,16}, {0x05, 5}, {0x07, 7}, 
113   {0xfc, 8}, {0x0c,10}, {0x14,13}, {0x07, 5}, 
114   {0x26, 8}, {0x1c,12}, {0x13,13}, {0x06, 6}, 
115   {0xfd, 8}, {0x12,12}, {0x07, 6}, {0x04, 9}, 
116   {0x12,13}, {0x06, 7}, {0x1e,12}, {0x14,16}, 
117   {0x04, 7}, {0x15,12}, {0x05, 7}, {0x11,12}, 
118   {0x78, 7}, {0x11,13}, {0x7a, 7}, {0x10,13}, 
119   {0x21, 8}, {0x1a,16}, {0x25, 8}, {0x19,16}, 
120   {0x24, 8}, {0x18,16}, {0x05, 9}, {0x17,16}, 
121   {0x07, 9}, {0x16,16}, {0x0d,10}, {0x15,16}, 
122   {0x1f,12}, {0x1a,12}, {0x19,12}, {0x17,12}, 
123   {0x16,12}, {0x1f,13}, {0x1e,13}, {0x1d,13}, 
124   {0x1c,13}, {0x1b,13}, {0x1f,16}, {0x1e,16}, 
125   {0x1d,16}, {0x1c,16}, {0x1b,16}, 
126   {0x01,6}, /* escape */
127   {0x06,4}, /* EOB */
128 };
129
130 static const INT8 mpeg1_level[111] = {
131   1,  2,  3,  4,  5,  6,  7,  8,
132   9, 10, 11, 12, 13, 14, 15, 16,
133  17, 18, 19, 20, 21, 22, 23, 24,
134  25, 26, 27, 28, 29, 30, 31, 32,
135  33, 34, 35, 36, 37, 38, 39, 40,
136   1,  2,  3,  4,  5,  6,  7,  8,
137   9, 10, 11, 12, 13, 14, 15, 16,
138  17, 18,  1,  2,  3,  4,  5,  1,
139   2,  3,  4,  1,  2,  3,  1,  2,
140   3,  1,  2,  3,  1,  2,  1,  2,
141   1,  2,  1,  2,  1,  2,  1,  2,
142   1,  2,  1,  2,  1,  2,  1,  2,
143   1,  1,  1,  1,  1,  1,  1,  1,
144   1,  1,  1,  1,  1,  1,  1,
145 };
146
147 static const INT8 mpeg1_run[111] = {
148   0,  0,  0,  0,  0,  0,  0,  0,
149   0,  0,  0,  0,  0,  0,  0,  0,
150   0,  0,  0,  0,  0,  0,  0,  0,
151   0,  0,  0,  0,  0,  0,  0,  0,
152   0,  0,  0,  0,  0,  0,  0,  0,
153   1,  1,  1,  1,  1,  1,  1,  1,
154   1,  1,  1,  1,  1,  1,  1,  1,
155   1,  1,  2,  2,  2,  2,  2,  3,
156   3,  3,  3,  4,  4,  4,  5,  5,
157   5,  6,  6,  6,  7,  7,  8,  8,
158   9,  9, 10, 10, 11, 11, 12, 12,
159  13, 13, 14, 14, 15, 15, 16, 16,
160  17, 18, 19, 20, 21, 22, 23, 24,
161  25, 26, 27, 28, 29, 30, 31,
162 };
163
164 static UINT8 mpeg1_index_run[2][64];
165 static INT8 mpeg1_max_level[2][64];
166
167 static RLTable rl_mpeg1 = {
168     111,
169     111,
170     mpeg1_vlc,
171     mpeg1_run,
172     mpeg1_level,
173 };
174
175 static RLTable rl_mpeg2 = {
176     111,
177     111,
178     mpeg2_vlc,
179     mpeg1_run,
180     mpeg1_level,
181 };
182
183 static const UINT8 mbAddrIncrTable[35][2] = {
184     {0x1, 1},
185     {0x3, 3},
186     {0x2, 3},
187     {0x3, 4},
188     {0x2, 4},
189     {0x3, 5},
190     {0x2, 5},
191     {0x7, 7},
192     {0x6, 7},
193     {0xb, 8},
194     {0xa, 8},
195     {0x9, 8},
196     {0x8, 8},
197     {0x7, 8},
198     {0x6, 8},
199     {0x17, 10},
200     {0x16, 10},
201     {0x15, 10},
202     {0x14, 10},
203     {0x13, 10},
204     {0x12, 10},
205     {0x23, 11},
206     {0x22, 11},
207     {0x21, 11},
208     {0x20, 11},
209     {0x1f, 11},
210     {0x1e, 11},
211     {0x1d, 11},
212     {0x1c, 11},
213     {0x1b, 11},
214     {0x1a, 11},
215     {0x19, 11},
216     {0x18, 11},
217     {0x8, 11}, /* escape */
218     {0xf, 11}, /* stuffing */
219 };
220
221 static const UINT8 mbPatTable[63][2] = {
222     {0xb, 5},
223     {0x9, 5},
224     {0xd, 6},
225     {0xd, 4},
226     {0x17, 7},
227     {0x13, 7},
228     {0x1f, 8},
229     {0xc, 4},
230     {0x16, 7},
231     {0x12, 7},
232     {0x1e, 8},
233     {0x13, 5},
234     {0x1b, 8},
235     {0x17, 8},
236     {0x13, 8},
237     {0xb, 4},
238     {0x15, 7},
239     {0x11, 7},
240     {0x1d, 8},
241     {0x11, 5},
242     {0x19, 8},
243     {0x15, 8},
244     {0x11, 8},
245     {0xf, 6},
246     {0xf, 8},
247     {0xd, 8},
248     {0x3, 9},
249     {0xf, 5},
250     {0xb, 8},
251     {0x7, 8},
252     {0x7, 9},
253     {0xa, 4},
254     {0x14, 7},
255     {0x10, 7},
256     {0x1c, 8},
257     {0xe, 6},
258     {0xe, 8},
259     {0xc, 8},
260     {0x2, 9},
261     {0x10, 5},
262     {0x18, 8},
263     {0x14, 8},
264     {0x10, 8},
265     {0xe, 5},
266     {0xa, 8},
267     {0x6, 8},
268     {0x6, 9},
269     {0x12, 5},
270     {0x1a, 8},
271     {0x16, 8},
272     {0x12, 8},
273     {0xd, 5},
274     {0x9, 8},
275     {0x5, 8},
276     {0x5, 9},
277     {0xc, 5},
278     {0x8, 8},
279     {0x4, 8},
280     {0x4, 9},
281     {0x7, 3},
282     {0xa, 5},
283     {0x8, 5},
284     {0xc, 6}
285 };
286
287 #define MB_INTRA 0x01
288 #define MB_PAT   0x02
289 #define MB_BACK  0x04
290 #define MB_FOR   0x08
291 #define MB_QUANT 0x10  
292
293 static const UINT8 table_mb_ptype[32][2] = {
294     { 0, 0 }, // 0x00
295     { 3, 5 }, // 0x01 MB_INTRA
296     { 1, 2 }, // 0x02 MB_PAT
297     { 0, 0 }, // 0x03
298     { 0, 0 }, // 0x04
299     { 0, 0 }, // 0x05
300     { 0, 0 }, // 0x06
301     { 0, 0 }, // 0x07
302     { 1, 3 }, // 0x08 MB_FOR
303     { 0, 0 }, // 0x09
304     { 1, 1 }, // 0x0A MB_FOR|MB_PAT
305     { 0, 0 }, // 0x0B
306     { 0, 0 }, // 0x0C
307     { 0, 0 }, // 0x0D
308     { 0, 0 }, // 0x0E
309     { 0, 0 }, // 0x0F
310     { 0, 0 }, // 0x10
311     { 1, 6 }, // 0x11 MB_QUANT|MB_INTRA
312     { 1, 5 }, // 0x12 MB_QUANT|MB_PAT
313     { 0, 0 }, // 0x13
314     { 0, 0 }, // 0x14
315     { 0, 0 }, // 0x15
316     { 0, 0 }, // 0x16
317     { 0, 0 }, // 0x17
318     { 0, 0 }, // 0x18
319     { 0, 0 }, // 0x19
320     { 2, 5 }, // 0x1A MB_QUANT|MB_FOR|MB_PAT
321     { 0, 0 }, // 0x1B
322     { 0, 0 }, // 0x1C
323     { 0, 0 }, // 0x1D
324     { 0, 0 }, // 0x1E
325     { 0, 0 }, // 0x1F
326 };
327
328 static const UINT8 table_mb_btype[32][2] = {
329     { 0, 0 }, // 0x00
330     { 3, 5 }, // 0x01 MB_INTRA
331     { 0, 0 }, // 0x02
332     { 0, 0 }, // 0x03
333     { 2, 3 }, // 0x04 MB_BACK
334     { 0, 0 }, // 0x05
335     { 3, 3 }, // 0x06 MB_BACK|MB_PAT
336     { 0, 0 }, // 0x07
337     { 2, 4 }, // 0x08 MB_FOR
338     { 0, 0 }, // 0x09
339     { 3, 4 }, // 0x0A MB_FOR|MB_PAT
340     { 0, 0 }, // 0x0B
341     { 2, 2 }, // 0x0C MB_FOR|MB_BACK
342     { 0, 0 }, // 0x0D
343     { 3, 2 }, // 0x0E MB_FOR|MB_BACK|MB_PAT
344     { 0, 0 }, // 0x0F
345     { 0, 0 }, // 0x10
346     { 1, 6 }, // 0x11 MB_QUANT|MB_INTRA
347     { 0, 0 }, // 0x12
348     { 0, 0 }, // 0x13
349     { 0, 0 }, // 0x14
350     { 0, 0 }, // 0x15
351     { 2, 6 }, // 0x16 MB_QUANT|MB_BACK|MB_PAT
352     { 0, 0 }, // 0x17
353     { 0, 0 }, // 0x18
354     { 0, 0 }, // 0x19
355     { 3, 6 }, // 0x1A MB_QUANT|MB_FOR|MB_PAT
356     { 0, 0 }, // 0x1B
357     { 0, 0 }, // 0x1C
358     { 0, 0 }, // 0x1D
359     { 2, 5 }, // 0x1E MB_QUANT|MB_FOR|MB_BACK|MB_PAT
360     { 0, 0 }, // 0x1F
361 };
362
363 static const UINT8 mbMotionVectorTable[17][2] = {
364 { 0x1, 1 },
365 { 0x1, 2 },
366 { 0x1, 3 },
367 { 0x1, 4 },
368 { 0x3, 6 },
369 { 0x5, 7 },
370 { 0x4, 7 },
371 { 0x3, 7 },
372 { 0xb, 9 },
373 { 0xa, 9 },
374 { 0x9, 9 },
375 { 0x11, 10 },
376 { 0x10, 10 },
377 { 0xf, 10 },
378 { 0xe, 10 },
379 { 0xd, 10 },
380 { 0xc, 10 },
381 };
382
383 static const int frame_rate_tab[9] = {
384     0, 
385     (int)(23.976 * FRAME_RATE_BASE), 
386     (int)(24 * FRAME_RATE_BASE), 
387     (int)(25 * FRAME_RATE_BASE), 
388     (int)(29.97 * FRAME_RATE_BASE), 
389     (int)(30 * FRAME_RATE_BASE), 
390     (int)(50 * FRAME_RATE_BASE), 
391     (int)(59.94 * FRAME_RATE_BASE), 
392     (int)(60 * FRAME_RATE_BASE), 
393 };
394
395 static const UINT8 non_linear_qscale[32] = {
396     0, 1, 2, 3, 4, 5, 6, 7,
397     8,10,12,14,16,18,20,22,
398     24,28,32,36,40,44,48,52,
399     56,64,72,80,88,96,104,112,
400 };