]> git.sesse.net Git - vlc/blob - modules/stream_out/transrate/putvlc.h
f19610c1e15b8ad169fe1155829fa17a80d298fc
[vlc] / modules / stream_out / transrate / putvlc.h
1 /* vlc.h, variable length code tables (used by routines in putvlc.c)        */
2
3 /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
4
5 /*
6  * Disclaimer of Warranty
7  *
8  * These software programs are available to the user without any license fee or
9  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
10  * any and all warranties, whether express, implied, or statuary, including any
11  * implied warranties or merchantability or of fitness for a particular
12  * purpose.  In no event shall the copyright-holder be liable for any
13  * incidental, punitive, or consequential damages of any kind whatsoever
14  * arising from the use of these programs.
15  *
16  * This disclaimer of warranty extends to the user of these programs and user's
17  * customers, employees, agents, transferees, successors, and assigns.
18  *
19  * The MPEG Software Simulation Group does not represent or warrant that the
20  * programs furnished hereunder are free of infringement of any third-party
21  * patents.
22  *
23  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
24  * are subject to royalty fees to patent holders.  Many of these patents are
25  * general enough such that they are unavoidable regardless of implementation
26  * design.
27  *
28  */
29
30 /* type definitions for variable length code table entries */
31
32 typedef struct
33 {
34   unsigned char code; /* right justified */
35   char len;
36 } VLCtable;
37
38 /* for codes longer than 8 bits (excluding leading zeroes) */
39 typedef struct
40 {
41   unsigned short code; /* right justified */
42   char len;
43 } sVLCtable;
44
45
46 /* data from ISO/IEC 13818-2 DIS, Annex B, variable length code tables */
47
48 /* Table B-1, variable length codes for macroblock_address_increment
49  *
50  * indexed by [macroblock_address_increment-1]
51  * 'macroblock_escape' is treated elsewhere
52  */
53
54 const static VLCtable addrinctab[33]=
55 {
56   {0x01,1},  {0x03,3},  {0x02,3},  {0x03,4},
57   {0x02,4},  {0x03,5},  {0x02,5},  {0x07,7},
58   {0x06,7},  {0x0b,8},  {0x0a,8},  {0x09,8},
59   {0x08,8},  {0x07,8},  {0x06,8},  {0x17,10},
60   {0x16,10}, {0x15,10}, {0x14,10}, {0x13,10},
61   {0x12,10}, {0x23,11}, {0x22,11}, {0x21,11},
62   {0x20,11}, {0x1f,11}, {0x1e,11}, {0x1d,11},
63   {0x1c,11}, {0x1b,11}, {0x1a,11}, {0x19,11},
64   {0x18,11}
65 };
66
67
68 /* Table B-2, B-3, B-4 variable length codes for macroblock_type
69  *
70  * indexed by [macroblock_type]
71  */
72
73 const static VLCtable mbtypetab[3][32]=
74 {
75  /* I */
76  {
77   {0,0}, {1,1}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
78   {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
79   {0,0}, {1,2}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
80   {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}
81  },
82  /* P */
83  {
84   {0,0}, {3,5}, {1,2}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
85   {1,3}, {0,0}, {1,1}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
86   {0,0}, {1,6}, {1,5}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
87   {0,0}, {0,0}, {2,5}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}
88  },
89  /* B */
90  {
91   {0,0}, {3,5}, {0,0}, {0,0}, {2,3}, {0,0}, {3,3}, {0,0},
92   {2,4}, {0,0}, {3,4}, {0,0}, {2,2}, {0,0}, {3,2}, {0,0},
93   {0,0}, {1,6}, {0,0}, {0,0}, {0,0}, {0,0}, {2,6}, {0,0},
94   {0,0}, {0,0}, {3,6}, {0,0}, {0,0}, {0,0}, {2,5}, {0,0}
95  }
96 };
97
98
99 /* Table B-5 ... B-8 variable length codes for macroblock_type in
100  *  scalable sequences
101  *
102  * not implemented
103  */
104
105 /* Table B-9, variable length codes for coded_block_pattern
106  *
107  * indexed by [coded_block_pattern]
108  */
109
110 const static VLCtable cbptable[64]=
111 {
112   {0x01,9}, {0x0b,5}, {0x09,5}, {0x0d,6}, 
113   {0x0d,4}, {0x17,7}, {0x13,7}, {0x1f,8}, 
114   {0x0c,4}, {0x16,7}, {0x12,7}, {0x1e,8}, 
115   {0x13,5}, {0x1b,8}, {0x17,8}, {0x13,8}, 
116   {0x0b,4}, {0x15,7}, {0x11,7}, {0x1d,8}, 
117   {0x11,5}, {0x19,8}, {0x15,8}, {0x11,8}, 
118   {0x0f,6}, {0x0f,8}, {0x0d,8}, {0x03,9}, 
119   {0x0f,5}, {0x0b,8}, {0x07,8}, {0x07,9}, 
120   {0x0a,4}, {0x14,7}, {0x10,7}, {0x1c,8}, 
121   {0x0e,6}, {0x0e,8}, {0x0c,8}, {0x02,9}, 
122   {0x10,5}, {0x18,8}, {0x14,8}, {0x10,8}, 
123   {0x0e,5}, {0x0a,8}, {0x06,8}, {0x06,9}, 
124   {0x12,5}, {0x1a,8}, {0x16,8}, {0x12,8}, 
125   {0x0d,5}, {0x09,8}, {0x05,8}, {0x05,9}, 
126   {0x0c,5}, {0x08,8}, {0x04,8}, {0x04,9},
127   {0x07,3}, {0x0a,5}, {0x08,5}, {0x0c,6}
128 };
129
130
131 /* Table B-14, DCT coefficients table zero
132  *
133  * indexed by [run][level-1]
134  * split into two tables (dct_code_tab1, dct_code_tab2) to reduce size
135  * 'first DCT coefficient' condition and 'End of Block' are treated elsewhere
136  * codes do not include s (sign bit)
137  */
138
139 const static VLCtable dct_code_tab1[2][40]=
140 {
141  /* run = 0, level = 1...40 */
142  {
143   {0x03, 2}, {0x04, 4}, {0x05, 5}, {0x06, 7},
144   {0x26, 8}, {0x21, 8}, {0x0a,10}, {0x1d,12},
145   {0x18,12}, {0x13,12}, {0x10,12}, {0x1a,13},
146   {0x19,13}, {0x18,13}, {0x17,13}, {0x1f,14},
147   {0x1e,14}, {0x1d,14}, {0x1c,14}, {0x1b,14},
148   {0x1a,14}, {0x19,14}, {0x18,14}, {0x17,14},
149   {0x16,14}, {0x15,14}, {0x14,14}, {0x13,14},
150   {0x12,14}, {0x11,14}, {0x10,14}, {0x18,15},
151   {0x17,15}, {0x16,15}, {0x15,15}, {0x14,15},
152   {0x13,15}, {0x12,15}, {0x11,15}, {0x10,15}
153  },
154  /* run = 1, level = 1...18 */
155  {
156   {0x03, 3}, {0x06, 6}, {0x25, 8}, {0x0c,10},
157   {0x1b,12}, {0x16,13}, {0x15,13}, {0x1f,15},
158   {0x1e,15}, {0x1d,15}, {0x1c,15}, {0x1b,15},
159   {0x1a,15}, {0x19,15}, {0x13,16}, {0x12,16},
160   {0x11,16}, {0x10,16}, {0x00, 0}, {0x00, 0},
161   {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
162   {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
163   {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
164   {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
165   {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}
166  }
167 };
168
169 const static VLCtable dct_code_tab2[30][5]=
170 {
171   /* run = 2...31, level = 1...5 */
172   {{0x05, 4}, {0x04, 7}, {0x0b,10}, {0x14,12}, {0x14,13}},
173   {{0x07, 5}, {0x24, 8}, {0x1c,12}, {0x13,13}, {0x00, 0}},
174   {{0x06, 5}, {0x0f,10}, {0x12,12}, {0x00, 0}, {0x00, 0}},
175   {{0x07, 6}, {0x09,10}, {0x12,13}, {0x00, 0}, {0x00, 0}},
176   {{0x05, 6}, {0x1e,12}, {0x14,16}, {0x00, 0}, {0x00, 0}},
177   {{0x04, 6}, {0x15,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
178   {{0x07, 7}, {0x11,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
179   {{0x05, 7}, {0x11,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
180   {{0x27, 8}, {0x10,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
181   {{0x23, 8}, {0x1a,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
182   {{0x22, 8}, {0x19,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
183   {{0x20, 8}, {0x18,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
184   {{0x0e,10}, {0x17,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
185   {{0x0d,10}, {0x16,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
186   {{0x08,10}, {0x15,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
187   {{0x1f,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
188   {{0x1a,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
189   {{0x19,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
190   {{0x17,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
191   {{0x16,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
192   {{0x1f,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
193   {{0x1e,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
194   {{0x1d,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
195   {{0x1c,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
196   {{0x1b,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
197   {{0x1f,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
198   {{0x1e,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
199   {{0x1d,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
200   {{0x1c,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
201   {{0x1b,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}}
202 };
203
204
205 /* Table B-15, DCT coefficients table one
206  *
207  * indexed by [run][level-1]
208  * split into two tables (dct_code_tab1a, dct_code_tab2a) to reduce size
209  * 'End of Block' is treated elsewhere
210  * codes do not include s (sign bit)
211  */
212
213 const static VLCtable dct_code_tab1a[2][40]=
214 {
215  /* run = 0, level = 1...40 */
216  {
217   {0x02, 2}, {0x06, 3}, {0x07, 4}, {0x1c, 5},
218   {0x1d, 5}, {0x05, 6}, {0x04, 6}, {0x7b, 7},
219   {0x7c, 7}, {0x23, 8}, {0x22, 8}, {0xfa, 8},
220   {0xfb, 8}, {0xfe, 8}, {0xff, 8}, {0x1f,14},
221   {0x1e,14}, {0x1d,14}, {0x1c,14}, {0x1b,14},
222   {0x1a,14}, {0x19,14}, {0x18,14}, {0x17,14},
223   {0x16,14}, {0x15,14}, {0x14,14}, {0x13,14},
224   {0x12,14}, {0x11,14}, {0x10,14}, {0x18,15},
225   {0x17,15}, {0x16,15}, {0x15,15}, {0x14,15},
226   {0x13,15}, {0x12,15}, {0x11,15}, {0x10,15}
227  },
228  /* run = 1, level = 1...18 */
229  {
230   {0x02, 3}, {0x06, 5}, {0x79, 7}, {0x27, 8},
231   {0x20, 8}, {0x16,13}, {0x15,13}, {0x1f,15},
232   {0x1e,15}, {0x1d,15}, {0x1c,15}, {0x1b,15},
233   {0x1a,15}, {0x19,15}, {0x13,16}, {0x12,16},
234   {0x11,16}, {0x10,16}, {0x00, 0}, {0x00, 0},
235   {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
236   {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
237   {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
238   {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0},
239   {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}
240  }
241 };
242
243 const static VLCtable dct_code_tab2a[30][5]=
244 {
245   /* run = 2...31, level = 1...5 */
246   {{0x05, 5}, {0x07, 7}, {0xfc, 8}, {0x0c,10}, {0x14,13}},
247   {{0x07, 5}, {0x26, 8}, {0x1c,12}, {0x13,13}, {0x00, 0}},
248   {{0x06, 6}, {0xfd, 8}, {0x12,12}, {0x00, 0}, {0x00, 0}},
249   {{0x07, 6}, {0x04, 9}, {0x12,13}, {0x00, 0}, {0x00, 0}},
250   {{0x06, 7}, {0x1e,12}, {0x14,16}, {0x00, 0}, {0x00, 0}},
251   {{0x04, 7}, {0x15,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
252   {{0x05, 7}, {0x11,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
253   {{0x78, 7}, {0x11,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
254   {{0x7a, 7}, {0x10,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
255   {{0x21, 8}, {0x1a,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
256   {{0x25, 8}, {0x19,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
257   {{0x24, 8}, {0x18,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
258   {{0x05, 9}, {0x17,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
259   {{0x07, 9}, {0x16,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
260   {{0x0d,10}, {0x15,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
261   {{0x1f,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
262   {{0x1a,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
263   {{0x19,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
264   {{0x17,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
265   {{0x16,12}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
266   {{0x1f,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
267   {{0x1e,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
268   {{0x1d,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
269   {{0x1c,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
270   {{0x1b,13}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
271   {{0x1f,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
272   {{0x1e,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
273   {{0x1d,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
274   {{0x1c,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}},
275   {{0x1b,16}, {0x00, 0}, {0x00, 0}, {0x00, 0}, {0x00, 0}}
276 };
277
278 /* MPEG-4 matrices */
279 static const uint8_t mpeg4_default_intra_matrix[64] = {
280   8, 17, 18, 19, 21, 23, 25, 27,
281  17, 18, 19, 21, 23, 25, 27, 28,
282  20, 21, 22, 23, 24, 26, 28, 30,
283  21, 22, 23, 24, 26, 28, 30, 32,
284  22, 23, 24, 26, 28, 30, 32, 35,
285  23, 24, 26, 28, 30, 32, 35, 38,
286  25, 26, 28, 30, 32, 35, 38, 41,
287  27, 28, 30, 32, 35, 38, 41, 45, 
288 };
289
290 static const uint8_t mpeg4_default_non_intra_matrix[64] = {
291  16, 17, 18, 19, 20, 21, 22, 23,
292  17, 18, 19, 20, 21, 22, 23, 24,
293  18, 19, 20, 21, 22, 23, 24, 25,
294  19, 20, 21, 22, 23, 24, 26, 27,
295  20, 21, 22, 23, 25, 26, 27, 28,
296  21, 22, 23, 24, 26, 27, 28, 30,
297  22, 23, 24, 26, 27, 28, 30, 31,
298  23, 24, 25, 27, 28, 30, 31, 33,
299 };
300