1 /*
2  *  vlc.c
3  *
4  *     Copyright (C) Charles 'Buck' Krasic - April 2000
5  *     Copyright (C) Erik Walthinsen - April 2000
6  *
7  *  This file is part of libdv, a free DV (IEC 61834/SMPTE 314M)
8  *  codec.
9  *
10  *  libdv is free software; you can redistribute it and/or modify it
11  *  under the terms of the GNU Lesser Public License as published by
12  *  the Free Software Foundation; either version 2.1, or (at your
13  *  option) any later version.
14  *
15  *  libdv is distributed in the hope that it will be useful, but
16  *  WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  *  Lesser Public License for more details.
19  *
20  *  You should have received a copy of the GNU Lesser Public License
21  *  along with libdv; see the file COPYING.  If not, write to
22  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23  *
24  *  The libdv homepage is http://libdv.sourceforge.net/.
25  */
26 
27 
28 #if HAVE_CONFIG_H
29 # include <config.h>
30 #endif
31 
32 #include <stdio.h>
33 #include "vlc.h"
34 
35 /* We will used five vlc tables, divided into what I term vlc
36  * "classes".  A vlc class is identified by the codeword prefix, and
37  * its corresponding lookup table indexed by codeword suffix.  The
38  * classes are organized by ranges of vlc codeword lengths as follows:
39  *
40  *   class 0: incomplete vlcs (less than 3 bits available to decode);
41  *   class 1: 2 <= length <= 5;
42  *   class 2: 6 <= length <= 9;
43  *   class 3: 10 <= length <= 12;
44  *   class 4: length == 13
45  *   class 5: length == 15
46  *
47  * The sizes of the respective lookup tables are: 1, 32, 128, 64, 64, 256 (all 32 bit elements). */
48 
49 /* 2 or less bits available (no class selector) */
50 static int8_t dv_vlc_class_broken[1] = { 0 };
51 
52 /* 3 - 6 bits available (no class selector) */
53 static int8_t dv_vlc_class_lookup1[1] = { 1 };
54 
55 /* compact "rolled up" syntax not available for all compilers.
56  * It is safe to remove the "rolled" code, but it is left here
57  * until a code review agrees that the compiler safe code is
58  * identical. */
59 
60 /* 7 - 10 bits available class selector is [0:1]  */
61 #ifdef __GNUC__
62 static int8_t dv_vlc_class_lookup2[4] = {
63   [0x0 ... 0x2] = 1,
64   [0x3        ] = 2,
65 }; /* dv_vlc_class_lookup2 */
66 #else /* ! __GNUC__ */
67 static int8_t dv_vlc_class_lookup2[4] = {
68   1, 1, 1, 2
69 }; /* dv_vlc_class_lookup2 */
70 #endif /* ! __GNUC__ */
71 
72 /* 11 - 16 bits available, class selector is [0:6] */
73 #ifdef __GNUC__
74 static int8_t dv_vlc_class_lookup3[128] = {
75   [0x00 ... 0x5f] = 1,
76   [0x60 ... 0x7b] = 2,
77   [0x7c ... 0x7d] = 3,
78   [0x7e         ] = 0,
79   [0x7f         ] = 0
80 }; /* dv_vlc_class_lookup3 */
81 #else /* ! __GNUC__ */
82 static int8_t dv_vlc_class_lookup3[128] = {
83   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x00 ... 0x0f */
84   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x10 ... 0x1f */
85   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x20 ... 0x2f */
86   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x30 ... 0x3f */
87   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 ... 0x4f */
88   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 ... 0x5f */
89   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x60 ... 0x6f */
90   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 0, 0, /* 0x70 ... 0x7f */
91 }; /* dv_vlc_class_lookup3 */
92 #endif /* ! __GNUC__ */
93 
94 #ifdef __GNUC__
95 static int8_t dv_vlc_class_lookup4[128] = {
96   [0x00 ... 0x5f] = 1,
97   [0x60 ... 0x7b] = 2,
98   [0x7c ... 0x7d] = 3,
99   [0x7e         ] = 4,
100   [0x7f         ] = 0
101 }; /* dv_vlc_class_lookup4 */
102 #else /* ! __GNUC__ */
103 static int8_t dv_vlc_class_lookup4[128] = {
104   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x00 ... 0x0f */
105   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x10 ... 0x1f */
106   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x20 ... 0x2f */
107   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x30 ... 0x3f */
108   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 ... 0x4f */
109   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 ... 0x5f */
110   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x60 ... 0x6f */
111   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 0, /* 0x70 ... 0x7f */
112 }; /* dv_vlc_class_lookup4 */
113 #endif /* ! __GNUC__ */
114 
115 #ifdef __GNUC__
116 int8_t dv_vlc_class_lookup5[128] = {
117   [0x00 ... 0x5f] = 1,
118   [0x60 ... 0x7b] = 2,
119   [0x7c ... 0x7d] = 3,
120   [0x7e         ] = 4,
121   [0x7f         ] = 5
122 }; /* dv_vlc_class_lookup5 */
123 #else /* ! __GNUC__ */
124 int8_t dv_vlc_class_lookup5[128] = {
125   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x00 ... 0x0f */
126   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x10 ... 0x1f */
127   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x20 ... 0x2f */
128   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x30 ... 0x3f */
129   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 ... 0x4f */
130   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 ... 0x5f */
131   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x60 ... 0x6f */
132   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 5, /* 0x70 ... 0x7f */
133 }; /* dv_vlc_class_lookup5 */
134 #endif /* ! __GNUC__ */
135 
136 /* Indexed by number of bits available */
137 
138 /* bitmask to extract class index, given x bits of left-aligned input
139  * the class index is derived from y prefix bits */
140 
141 /* ---------------------------------------------------------------------------
142  * now initialized at runtime STL
143  */
144 int8_t	*dv_vlc_classes[64];
145 int	dv_vlc_class_index_mask[64];
146 int	dv_vlc_class_index_rshift[64];
147 
148 #ifdef __GNUC__
149 const dv_vlc_tab_t dv_vlc_broken[1] = { [0] = {run: -1, amp: -1, len: VLC_NOBITS} };
150 #else /* ! __GNUC__ */
151 const dv_vlc_tab_t dv_vlc_broken[1] = { {-1, VLC_NOBITS, -1} };
152 #endif /* ! __GNUC__ */
153 
154 #ifdef __GNUC__
155 const dv_vlc_tab_t dv_vlc_lookup1[32] = {
156   /* prefix 00 */
157   [0x00 ... 0x07] = {run:  0, amp:  1, len:  1+2}, /* 00s */
158   /* prefix 010 */
159   [0x08 ... 0x0b] = {run:  0, amp:  2, len:  1+3}, /* 010s */
160   /* prefix 011 */
161   [0x0c ... 0x0d] = {run: -1, amp:  0, len:    4}, /* 0110 (EOB) */
162   [0x0e ... 0x0f] = {run:  1, amp:  1, len:  1+4}, /* 0111s */
163   /* prefix 100 */
164   [0x10 ... 0x11] = {run:  0, amp:  3, len:  1+4}, /* 1000s */
165   [0x12 ... 0x13] = {run:  0, amp:  4, len:  1+4}, /* 1001s */
166   /* prefix 101 */
167   [0x14         ] = {run:  2, amp:  1, len:  1+5}, /* 10100s */
168   [0x15         ] = {run:  1, amp:  2, len:  1+5}, /* 10101s */
169   [0x16         ] = {run:  0, amp:  5, len:  1+5}, /* 10110s */
170   [0x17         ] = {run:  0, amp:  6, len:  1+5}, /* 10111s */
171   /* prefix 110-111 */
172   [0x18 ... 0x1f] = {run: -1, amp: -1,  len: VLC_NOBITS},
173 }; /* dv_vlc_lookup1 */
174 #else /* ! __GNUC__ */
175 const dv_vlc_tab_t dv_vlc_lookup1[32] = {
176   /* prefix 00 */
177   {0, 1+2, 1}, {0, 1+2, 1}, {0, 1+2, 1}, {0, 1+2, 1},
178   {0, 1+2, 1}, {0, 1+2, 1}, {0, 1+2, 1}, {0, 1+2, 1},
179   /* prefix 010 */
180   {0, 1+3, 2}, {0, 1+3, 2}, {0, 1+3, 2}, {0, 1+3, 2},
181   /* prefix 011 */
182   {-1, 4, 0}, {-1, 4, 0},
183   { 1, 1+4, 1}, { 1, 1+4, 1},
184   /* prefix 100 */
185   { 0, 1+4, 3}, { 0, 1+4, 3},
186   { 0, 1+4, 4}, { 0, 1+4, 4},
187   /* prefix 101 */
188   { 2, 1+5, 1},
189   { 1, 1+5, 2},
190   { 0, 1+5, 5},
191   { 0, 1+5, 6},
192   /* prefix 110-111 */
193   { -1,VLC_NOBITS,-1}, { -1,VLC_NOBITS, -1}, { -1,VLC_NOBITS,-1},
194   { -1,VLC_NOBITS,-1}, { -1,VLC_NOBITS, -1}, { -1,VLC_NOBITS,-1},
195   { -1,VLC_NOBITS,-1}, { -1,VLC_NOBITS, -1},
196 }; /* dv_vlc_lookup1 */
197 #endif /* ! __GNUC__ */
198 
199 dv_vlc_tab_t dv_vlc_class1_shortcut[128];
200 
201 #ifdef __GNUC__
202 const dv_vlc_tab_t dv_vlc_lookup2[128] = {
203   /* prefix 110 */
204   [0x00 ... 0x07] = {run:  3, amp:  1, len:  1+6}, /* 110000s */
205   [0x08 ... 0x0f] = {run:  4, amp:  1, len:  1+6}, /* 110001s */
206   [0x10 ... 0x17] = {run:  0, amp:  7, len:  1+6}, /* 110010s */
207   [0x18 ... 0x1f] = {run:  0, amp:  8, len:  1+6}, /* 110011s */
208   /* prefix 1101 */
209   [0x20 ... 0x23] = {run:  5, amp:  1, len:  1+7}, /* 1101000s */
210   [0x24 ... 0x27] = {run:  6, amp:  1, len:  1+7}, /* 1101001s */
211   [0x28 ... 0x2b] = {run:  2, amp:  2, len:  1+7}, /* 1101010s */
212   [0x2c ... 0x2f] = {run:  1, amp:  3, len:  1+7}, /* 1101011s */
213   [0x30 ... 0x33] = {run:  1, amp:  4, len:  1+7}, /* 1101100s */
214   [0x34 ... 0x37] = {run:  0, amp:  9, len:  1+7}, /* 1101101s */
215   [0x38 ... 0x3b] = {run:  0, amp: 10, len:  1+7}, /* 1101110s */
216   [0x3c ... 0x3f] = {run:  0, amp: 11, len:  1+7}, /* 1101111s */
217   /* prefix 1110 */
218   [0x40 ... 0x41] = {run:  7, amp:  1, len:  1+8}, /* 11100000s */
219   [0x42 ... 0x43] = {run:  8, amp:  1, len:  1+8}, /* 11100001s */
220   [0x44 ... 0x45] = {run:  9, amp:  1, len:  1+8}, /* 11100010s */
221   [0x46 ... 0x47] = {run: 10, amp:  1, len:  1+8}, /* 11100011s */
222   [0x48 ... 0x49] = {run:  3, amp:  2, len:  1+8}, /* 11100100s */
223   [0x4a ... 0x4b] = {run:  4, amp:  2, len:  1+8}, /* 11100101s */
224   [0x4c ... 0x4d] = {run:  2, amp:  3, len:  1+8}, /* 11100110s */
225   [0x4e ... 0x4f] = {run:  1, amp:  5, len:  1+8}, /* 11100111s */
226   [0x50 ... 0x51] = {run:  1, amp:  6, len:  1+8}, /* 11101000s */
227   [0x52 ... 0x53] = {run:  1, amp:  7, len:  1+8}, /* 11101001s */
228   [0x54 ... 0x55] = {run:  0, amp: 12, len:  1+8}, /* 11101010s */
229   [0x56 ... 0x57] = {run:  0, amp: 13, len:  1+8}, /* 11101011s */
230   [0x58 ... 0x59] = {run:  0, amp: 14, len:  1+8}, /* 11101100s */
231   [0x5a ... 0x5b] = {run:  0, amp: 15, len:  1+8}, /* 11101101s */
232   [0x5c ... 0x5d] = {run:  0, amp: 16, len:  1+8}, /* 11101110s */
233   [0x5e ... 0x5f] = {run:  0, amp: 17, len:  1+8}, /* 11101111s */
234   /* prefix 1111 0 */
235   [0x60         ] = {run: 11, amp:  1, len:  1+9}, /* 1111 0000 0s */
236   [0x61         ] = {run: 12, amp:  1, len:  1+9}, /* 1111 0000 1s */
237   [0x62         ] = {run: 13, amp:  1, len:  1+9}, /* 1111 0001 0s */
238   [0x63         ] = {run: 14, amp:  1, len:  1+9}, /* 1111 0001 1s */
239   [0x64         ] = {run: 5,  amp:  2, len:  1+9}, /* 1111 0010 0s */
240   [0x65         ] = {run: 6,  amp:  2, len:  1+9}, /* 1111 0010 1s */
241   [0x66         ] = {run: 3,  amp:  3, len:  1+9}, /* 1111 0011 0s */
242   [0x67         ] = {run: 4,  amp:  3, len:  1+9}, /* 1111 0011 1s */
243   [0x68         ] = {run: 2,  amp:  4, len:  1+9}, /* 1111 0100 0s */
244   [0x69         ] = {run: 2,  amp:  5, len:  1+9}, /* 1111 0100 1s */
245   [0x6a         ] = {run: 1,  amp:  8, len:  1+9}, /* 1111 0101 0s */
246   [0x6b         ] = {run: 0,  amp: 18, len:  1+9}, /* 1111 0101 1s */
247   [0x6c         ] = {run: 0,  amp: 19, len:  1+9}, /* 1111 0110 0s */
248   [0x6d         ] = {run: 0,  amp: 20, len:  1+9}, /* 1111 0110 1s */
249   [0x6e         ] = {run: 0,  amp: 21, len:  1+9}, /* 1111 0111 0s */
250   [0x6f         ] = {run: 0,  amp: 22, len:  1+9}, /* 1111 0111 1s */
251   /* prefix 1111 1 */
252   [0x70 ... 0x7f] = {run: -1, amp: -1,  len: VLC_NOBITS},
253 }; /* dv_vlc_lookup2 */
254 #else /* ! __GNUC__ */
255 const dv_vlc_tab_t dv_vlc_lookup2[128] = {
256   /* prefix 110 */
257   {3, 1+6, 1}, {3, 1+6, 1}, {3, 1+6, 1}, {3, 1+6, 1},
258   {3, 1+6, 1}, {3, 1+6, 1}, {3, 1+6, 1}, {3, 1+6, 1},
259   {4, 1+6, 1}, {4, 1+6, 1}, {4, 1+6, 1}, {4, 1+6, 1},
260   {4, 1+6, 1}, {4, 1+6, 1}, {4, 1+6, 1}, {4, 1+6, 1},
261   {0, 1+6, 7}, {0, 1+6, 7}, {0, 1+6, 7}, {0, 1+6, 7},
262   {0, 1+6, 7}, {0, 1+6, 7}, {0, 1+6, 7}, {0, 1+6, 7},
263   {0, 1+6, 8}, {0, 1+6, 8}, {0, 1+6, 8}, {0, 1+6, 8},
264   {0, 1+6, 8}, {0, 1+6, 8}, {0, 1+6, 8}, {0, 1+6, 8},
265 
266   /* prefix 1101 */
267   {5, 1+7, 1}, {5, 1+7, 1}, {5, 1+7, 1}, {5, 1+7, 1},
268   {6, 1+7, 1}, {6, 1+7, 1}, {6, 1+7, 1}, {6, 1+7, 1},
269   {2, 1+7, 2}, {2, 1+7, 2}, {2, 1+7, 2}, {2, 1+7, 2},
270   {1, 1+7, 3}, {1, 1+7, 3}, {1, 1+7, 3}, {1, 1+7, 3},
271   {1, 1+7, 4}, {1, 1+7, 4}, {1, 1+7, 4}, {1, 1+7, 4},
272   {0, 1+7, 9}, {0, 1+7, 9}, {0, 1+7, 9}, {0, 1+7, 9},
273   {0, 1+7, 10}, {0, 1+7, 10}, {0, 1+7, 10}, {0, 1+7, 10},
274   {0, 1+7, 11}, {0, 1+7, 11}, {0, 1+7, 11}, {0, 1+7, 11},
275 
276   /* prefix 1110 */
277   {7, 1+8, 1}, {7, 1+8, 1},
278   {8, 1+8, 1}, {8, 1+8, 1},
279   {9, 1+8, 1}, {9, 1+8, 1},
280   {10, 1+8, 1}, {10, 1+8, 1},
281   {3, 1+8, 2}, {3, 1+8, 2},
282   {4, 1+8, 2}, {4, 1+8, 2},
283   {2, 1+8, 3}, {2, 1+8, 3},
284   {1, 1+8, 5}, {1, 1+8, 5},
285   {1, 1+8, 6}, {1, 1+8, 6},
286   {1, 1+8, 7}, {1, 1+8, 7},
287   {0, 1+8, 12}, {0, 1+8, 12},
288   {0, 1+8, 13}, {0, 1+8, 13},
289   {0, 1+8, 14}, {0, 1+8, 14},
290   {0, 1+8, 15}, {0, 1+8, 15},
291   {0, 1+8, 16}, {0, 1+8, 16},
292   {0, 1+8, 17}, {0, 1+8, 17},
293 
294   /* prefix 1111 0 */
295   {11, 1+9,  1}, /* 1111 0000 0s */
296   {12, 1+9,  1}, /* 1111 0000 1s */
297   {13, 1+9,  1}, /* 1111 0001 0s */
298   {14, 1+9,  1}, /* 1111 0001 1s */
299   {5,  1+9,  2}, /* 1111 0010 0s */
300   {6,  1+9,  2}, /* 1111 0010 1s */
301   {3,  1+9,  3}, /* 1111 0011 0s */
302   {4,  1+9,  3}, /* 1111 0011 1s */
303   {2,  1+9,  4}, /* 1111 0100 0s */
304   {2,  1+9,  5}, /* 1111 0100 1s */
305   {1,  1+9,  8}, /* 1111 0101 0s */
306   {0,  1+9, 18}, /* 1111 0101 1s */
307   {0,  1+9, 19}, /* 1111 0110 0s */
308   {0,  1+9, 20}, /* 1111 0110 1s */
309   {0,  1+9, 21}, /* 1111 0111 0s */
310   {0,  1+9, 22}, /* 1111 0111 1s */
311 
312   /* prefix 1111 1 */
313   {-1, VLC_NOBITS, -1},
314   {-1, VLC_NOBITS, -1},
315   {-1, VLC_NOBITS, -1},
316   {-1, VLC_NOBITS, -1},
317   {-1, VLC_NOBITS, -1},
318   {-1, VLC_NOBITS, -1},
319   {-1, VLC_NOBITS, -1},
320   {-1, VLC_NOBITS, -1},
321   {-1, VLC_NOBITS, -1},
322   {-1, VLC_NOBITS, -1},
323   {-1, VLC_NOBITS, -1},
324   {-1, VLC_NOBITS, -1},
325   {-1, VLC_NOBITS, -1},
326   {-1, VLC_NOBITS, -1},
327   {-1, VLC_NOBITS, -1},
328   {-1, VLC_NOBITS, -1},
329 }; /* dv_vlc_lookup2 */
330 #endif /* ! __GNUC__ */
331 
332 #ifdef __GNUC__
333 const dv_vlc_tab_t dv_vlc_lookup3[64] = {
334   /* len 10+1/prefix 1111 1000 */
335   [0x00 ... 0x03] = {run:  5,  amp:  3, len: 1+10}, /* 1111 1000 00s */
336   [0x04 ... 0x07] = {run:  3,  amp:  4, len: 1+10}, /* 1111 1000 01s */
337   [0x08 ... 0x0b] = {run:  3,  amp:  5, len: 1+10}, /* 1111 1000 10s */
338   [0x0c ... 0x0f] = {run:  2,  amp:  6, len: 1+10}, /* 1111 1000 11s */
339   /* len 10+1/prefix 1111 1001 0 */
340   [0x10 ... 0x13] = {run:  1,  amp:  9, len: 1+10}, /* 1111 1001 00s */
341   [0x14 ... 0x17] = {run:  1,  amp: 10, len: 1+10}, /* 1111 1001 01s */
342   /* len 10+1/prefix 1111 1001 10 */
343   [0x18 ... 0x1b] = {run:  1,  amp: 11, len: 1+10}, /* 1111 1001 10s */
344   /* len 11/prefix 1111 1001 11 */
345   [0x1c ... 0x1d] = {run:  0,  amp:  0, len: 11}, /* 1111 1001 110s */
346   [0x1e ... 0x1f] = {run:  1,  amp:  0, len: 11}, /* 1111 1001 111s */
347   /* len 11+1/prefix 1111 1010 0 */
348   [0x20 ... 0x21] = {run:  6,  amp:  3, len: 1+11}, /* 1111 1010 000s */
349   [0x22 ... 0x23] = {run:  4,  amp:  4, len: 1+11}, /* 1111 1010 001s */
350   [0x24 ... 0x25] = {run:  3,  amp:  6, len: 1+11}, /* 1111 1010 010s */
351   [0x26 ... 0x27] = {run:  1,  amp: 12, len: 1+11}, /* 1111 1010 011s */
352   /* len 11+1/prefix 1111 1010 10 */
353   [0x28 ... 0x29] = {run:  1,  amp: 13, len: 1+11}, /* 1111 1010 100s */
354   [0x2a ... 0x2b] = {run:  1,  amp: 14, len: 1+11}, /* 1111 1010 101s */
355   /* len 12/prefix 1111 1010 11 */
356   [0x2c         ] = {run:  2,  amp:  0, len: 12}, /* 1111 1010 1100 */
357   [0x2d         ] = {run:  3,  amp:  0, len: 12}, /* 1111 1010 1101 */
358   [0x2e         ] = {run:  4,  amp:  0, len: 12}, /* 1111 1010 1110 */
359   [0x2f         ] = {run:  5,  amp:  0, len: 12}, /* 1111 1010 1111 */
360   /* len 12+1/prefix 1111 1011 */
361   [0x30         ] = {run: 7, amp:  2, len: 1+12}, /* 1111 1011 0000s */
362   [0x31         ] = {run: 8, amp:  2, len: 1+12}, /* 1111 1011 0001s */
363   [0x32         ] = {run: 9, amp:  2, len: 1+12}, /* 1111 1011 0010s */
364   [0x33         ] = {run: 10,amp:  2, len: 1+12}, /* 1111 1011 0011s */
365   [0x34         ] = {run: 7, amp:  3, len: 1+12}, /* 1111 1011 0100s */
366   [0x35         ] = {run: 8, amp:  3, len: 1+12}, /* 1111 1011 0101s */
367   [0x36         ] = {run: 4, amp:  5, len: 1+12}, /* 1111 1011 0110s */
368   [0x37         ] = {run: 3, amp:  7, len: 1+12}, /* 1111 1011 0111s */
369   [0x38         ] = {run: 2, amp:  7, len: 1+12}, /* 1111 1011 1000s */
370   [0x39         ] = {run: 2, amp:  8, len: 1+12}, /* 1111 1011 1001s */
371   [0x3a         ] = {run: 2, amp:  9, len: 1+12}, /* 1111 1011 1010s */
372   [0x3b         ] = {run: 2, amp: 10, len: 1+12}, /* 1111 1011 1011s */
373   [0x3c         ] = {run: 2, amp: 11, len: 1+12}, /* 1111 1011 1100s */
374   [0x3d         ] = {run: 1, amp: 15, len: 1+12}, /* 1111 1011 1101s */
375   [0x3e         ] = {run: 1, amp: 16, len: 1+12}, /* 1111 1011 1110s */
376   [0x3f         ] = {run: 1, amp: 17, len: 1+12}, /* 1111 1011 1111s */
377 }; /* dv_vlc_lookup3 */
378 #else /* ! __GNUC__ */
379 const dv_vlc_tab_t dv_vlc_lookup3[64] = {
380   /* len 10+1/prefix 1111 1000 */
381   {5,  1+10,  3}, /* 1111 1000 00s */
382   {5,  1+10,  3}, /* 1111 1000 00s */
383   {5,  1+10,  3}, /* 1111 1000 00s */
384   {5,  1+10,  3}, /* 1111 1000 00s */
385 
386   {3,  1+10,  4}, /* 1111 1000 01s */
387   {3,  1+10,  4}, /* 1111 1000 01s */
388   {3,  1+10,  4}, /* 1111 1000 01s */
389   {3,  1+10,  4}, /* 1111 1000 01s */
390 
391   {3,  1+10,  5}, /* 1111 1000 10s */
392   {3,  1+10,  5}, /* 1111 1000 10s */
393   {3,  1+10,  5}, /* 1111 1000 10s */
394   {3,  1+10,  5}, /* 1111 1000 10s */
395 
396   {2,  1+10,  6}, /* 1111 1000 11s */
397   {2,  1+10,  6}, /* 1111 1000 11s */
398   {2,  1+10,  6}, /* 1111 1000 11s */
399   {2,  1+10,  6}, /* 1111 1000 11s */
400 
401   /* len 10+1/prefix 1111 1001 0 */
402   {1,  1+10,  9}, /* 1111 1001 00s */
403   {1,  1+10,  9}, /* 1111 1001 00s */
404   {1,  1+10,  9}, /* 1111 1001 00s */
405   {1,  1+10,  9}, /* 1111 1001 00s */
406 
407   {1,  1+10, 10}, /* 1111 1001 01s */
408   {1,  1+10, 10}, /* 1111 1001 01s */
409   {1,  1+10, 10}, /* 1111 1001 01s */
410   {1,  1+10, 10}, /* 1111 1001 01s */
411   /* len 10+1/prefix 1111 1001 10 */
412   {1,  1+10, 11}, /* 1111 1001 10s */
413   {1,  1+10, 11}, /* 1111 1001 10s */
414   {1,  1+10, 11}, /* 1111 1001 10s */
415   {1,  1+10, 11}, /* 1111 1001 10s */
416   /* len 11/prefix 1111 1001 11 */
417   {0,  11,  0}, /* 1111 1001 110s */
418   {0,  11,  0}, /* 1111 1001 110s */
419 
420   {1,  11,  0}, /* 1111 1001 111s */
421   {1,  11,  0}, /* 1111 1001 111s */
422   /* len 11+1/prefix 1111 1010 0 */
423   {6,  1+11,  3}, /* 1111 1010 000s */
424   {6,  1+11,  3}, /* 1111 1010 000s */
425   {4,  1+11,  4}, /* 1111 1010 001s */
426   {4,  1+11,  4}, /* 1111 1010 001s */
427   {3,  1+11,  6}, /* 1111 1010 010s */
428   {3,  1+11,  6}, /* 1111 1010 010s */
429   {1,  1+11, 12}, /* 1111 1010 011s */
430   {1,  1+11, 12}, /* 1111 1010 011s */
431   /* len 11+1/prefix 1111 1010 10 */
432   {1,  1+11, 13}, /* 1111 1010 100s */
433   {1,  1+11, 13}, /* 1111 1010 100s */
434   {1,  1+11, 14}, /* 1111 1010 101s */
435   {1,  1+11, 14}, /* 1111 1010 101s */
436   /* len 12/prefix 1111 1010 11 */
437   {2,  12,  0}, /* 1111 1010 1100 */
438   {3,  12,  0}, /* 1111 1010 1101 */
439   {4,  12,  0}, /* 1111 1010 1110 */
440   {5,  12,  0}, /* 1111 1010 1111 */
441   /* len 12+1/prefix 1111 1011 */
442   {7, 1+12,  2}, /* 1111 1011 0000s */
443   {8, 1+12,  2}, /* 1111 1011 0001s */
444   {9, 1+12,  2}, /* 1111 1011 0010s */
445   {10,1+12,  2}, /* 1111 1011 0011s */
446   {7, 1+12,  3}, /* 1111 1011 0100s */
447   {8, 1+12,  3}, /* 1111 1011 0101s */
448   {4, 1+12,  5}, /* 1111 1011 0110s */
449   {3, 1+12,  7}, /* 1111 1011 0111s */
450   {2, 1+12,  7}, /* 1111 1011 1000s */
451   {2, 1+12,  8}, /* 1111 1011 1001s */
452   {2, 1+12,  9}, /* 1111 1011 1010s */
453   {2, 1+12, 10}, /* 1111 1011 1011s */
454   {2, 1+12, 11}, /* 1111 1011 1100s */
455   {1, 1+12, 15}, /* 1111 1011 1101s */
456   {1, 1+12, 16}, /* 1111 1011 1110s */
457   {1, 1+12, 17}, /* 1111 1011 1111s */
458 }; /* dv_vlc_lookup3 */
459 #endif /* ! __GNUC__ */
460 
461 #ifdef __GNUC__
462 dv_vlc_tab_t dv_vlc_lookup4[64] = {  /* len 13/prefix 1111 110 */
463   [0 ... 63]   = {run: 0, amp: -1, len: VLC_ERROR},
464 }; /* dv_vlc_lookup4 */
465 #else /* ! __GNUC__ */
466 dv_vlc_tab_t dv_vlc_lookup4[64] = {  /* len 13/prefix 1111 110 */
467   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
468   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
469   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
470   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
471   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
472   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
473   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
474   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
475   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
476   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
477   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
478   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
479   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
480   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
481   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
482   {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0,VLC_ERROR, -1}, {0, VLC_ERROR, -1},
483   /* [0 ... 63]   = {run: 0, amp: -1, len: VLC_ERROR}, */
484 }; /* dv_vlc_lookup4 */
485 #endif /* ! __GNUC__ */
486 
487 #ifdef __GNUC__
488 dv_vlc_tab_t dv_vlc_lookup5[256] = { /* len 15+1/prefix 1111 111 */
489   [0 ... 255] = {run: 0, amp: -1, len: VLC_ERROR},
490 }; /* dv_vlc_lookup6 */
491 #else /* ! __GNUC__ */
492 dv_vlc_tab_t dv_vlc_lookup5[256] = { /* len 15+1/prefix 1111 111 */
493   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
494   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
495   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
496   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
497   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
498   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
499   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
500   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
501   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
502   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
503   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
504   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
505   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
506   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
507   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
508   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
509   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
510   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
511   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
512   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
513   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
514   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
515   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
516   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
517   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
518   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
519   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
520   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
521   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
522   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
523   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
524   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
525   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
526   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
527   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
528   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
529   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
530   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
531   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
532   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
533   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
534   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
535   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
536   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
537   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
538   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
539   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
540   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
541   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
542   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
543   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
544   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
545   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
546   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
547   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
548   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
549   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
550   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
551   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
552   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
553   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
554   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
555   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
556   {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1}, {0,VLC_ERROR,-1},
557 }; /* dv_vlc_lookup5 */
558 #endif /* ! __GNUC__ */
559 
560 
561 const dv_vlc_tab_t *dv_vlc_lookups[6] = {
562   dv_vlc_broken,
563   dv_vlc_lookup1,
564   dv_vlc_lookup2,
565   dv_vlc_lookup3,
566   dv_vlc_lookup4,
567   dv_vlc_lookup5,
568 }; /* dv_vlc_lookups */
569 
570 #ifdef __GNUC__
571 const int dv_vlc_index_mask[6] = {
572   [0] = 0x0000,  /* no choice */
573   [1] = 0xf800,  /* 5 bit selector [0:4] */
574   [2] = 0x3f80,  /* 7 bit selector [2:8] */
575   [3] = 0x03f0,  /* 6 bit selector [6:11]	   */
576   [4] = 0x01f8,  /* 6 bit selector [7:12]	   */
577   [5] = 0x01fe,  /* 8 bit selector [7:14] */
578 }; /* dv_vlc_index_mask */
579 #else /* ! __GNUC__ */
580 const int dv_vlc_index_mask[6] = {
581   0x0000,  /* no choice */
582   0xf800,  /* 5 bit selector [0:4] */
583   0x3f80,  /* 7 bit selector [2:8] */
584   0x03f0,  /* 6 bit selector [6:11]	   */
585   0x01f8,  /* 6 bit selector [7:12]	   */
586   0x01fe,  /* 8 bit selector [7:14] */
587 }; /* dv_vlc_index_mask */
588 #endif /* ! __GNUC__ */
589 
590 #ifdef __GNUC__
591 const int dv_vlc_index_rshift[6] = {
592   [0] = 0,
593   [1] = 11,
594   [2] = 7,
595   [3] = 4,
596   [4] = 3,
597   [5] = 1,
598 }; /*  */
599 #else /* ! __GNUC__ */
600 const int dv_vlc_index_rshift[6] = {
601   0,
602   11,
603   7,
604   4,
605   3,
606   1,
607 }; /*  */
608 #endif /* ! __GNUC__ */
609 
610 #ifdef __GNUC__
611 const int sign_mask[17] = {
612   [1] = 0x1 << 15,
613   [2] = 0x1 << 14,
614   [3] = 0x1 << 13,
615   [4] = 0x1 << 12,
616   [5] = 0x1 << 11,
617   [6] = 0x1 << 10,
618   [7] = 0x1 << 9,
619   [8] = 0x1 << 8,
620   [9] = 0x1 << 7,
621   [10] = 0x1 << 6,
622   [11] = 0x1 << 5,
623   [12] = 0x1 << 4,
624   [13] = 0x1 << 3,
625   [14] = 0x1 << 2,
626   [15] = 0x1 << 1,
627   [16] = 0x1,
628 };
629 #else /* ! __GNUC__ */
630 const int sign_mask[17] = {
631   0x0,
632   0x1 << 15,
633   0x1 << 14,
634   0x1 << 13,
635   0x1 << 12,
636   0x1 << 11,
637   0x1 << 10,
638   0x1 << 9,
639   0x1 << 8,
640   0x1 << 7,
641   0x1 << 6,
642   0x1 << 5,
643   0x1 << 4,
644   0x1 << 3,
645   0x1 << 2,
646   0x1 << 1,
647   0x1,
648 };
649 #endif /* ! __GNUC__ */
650 
651 
652 #ifdef __GNUC__
653 const int sign_rshift[17] = {
654   [1] = 15,
655   [2] = 14,
656   [3] = 13,
657   [4] = 12,
658   [5] = 11,
659   [6] = 10,
660   [7] = 9,
661   [8] = 8,
662   [9] = 7,
663   [10] = 6,
664   [11] = 5,
665   [12] = 4,
666   [13] = 3,
667   [14] = 2,
668   [15] = 1,
669 };
670 #else /* ! __GNUC__ */
671 const int sign_rshift[17] = {
672   0,
673   15,
674   14,
675   13,
676   12,
677   11,
678   10,
679   9,
680   8,
681   7,
682   6,
683   5,
684   4,
685   3,
686   2,
687   1,
688 };
689 #endif /* ! __GNUC__ */
690 
dv_construct_vlc_table()691 void dv_construct_vlc_table() {
692   int i;
693 
694   /* -------------------------------------------------------------------------
695    * converted some static initialisations to run time, BUG #231580 STL
696    */
697   /* Indexed by number of bits available */
698   for (i = 0; i <= 2; ++i)
699     dv_vlc_classes [i] = &dv_vlc_class_broken [0];
700   for (i = 3; i <= 6; ++i)
701     dv_vlc_classes [i] = &dv_vlc_class_lookup1 [0];
702   for (i = 7; i <= 10; ++i)
703     dv_vlc_classes [i] = &dv_vlc_class_lookup2 [0];
704   for (i = 11; i <= 12; ++i)
705     dv_vlc_classes [i] = &dv_vlc_class_lookup3 [0];
706   for (i = 13; i <= 15; ++i)
707     dv_vlc_classes [i] = &dv_vlc_class_lookup4 [0];
708   for (i = 16; i <= 63; ++i)
709     dv_vlc_classes [i] = &dv_vlc_class_lookup5 [0];
710 
711   /* -------------------------------------------------------------------------
712    * bitmask to extract class index, given x bits of left-aligned input
713    * the class index is derived from y prefix bits
714    */
715   for (i = 0; i <= 6; i++) {
716     dv_vlc_class_index_mask [i] = 0x0000;
717     dv_vlc_class_index_rshift [i] = 0;
718   }
719   for (i = 7; i <= 10; i++) {
720     dv_vlc_class_index_mask [i] = 0xC000;
721     dv_vlc_class_index_rshift [i] = 14;
722   }
723   for (i = 11; i <= 63; i++) {
724     dv_vlc_class_index_mask [i] = 0xFE00;
725     dv_vlc_class_index_rshift [i] = 9;
726   }
727 
728 
729   for(i=6; i<62; i++) {
730     dv_vlc_lookup4[i].run = i;
731     dv_vlc_lookup4[i].amp = 0;
732     dv_vlc_lookup4[i].len = 13;
733   } /* for */
734   for(i=23; i<256; i++) {
735     dv_vlc_lookup5[i].run = 0;
736     dv_vlc_lookup5[i].amp = i;
737     dv_vlc_lookup5[i].len = 1 + 15;
738   } /* for */
739 
740   /* Build dv_vlc_class1_shortcut[] by attempting to match class 1 and
741      class 2 vlcs. */
742   for (i = 0; i < 128; i++) {
743     unsigned int bits = i << 9;
744     unsigned int ms7 = ((bits & 0xfe00) >> 9);
745     const dv_vlc_t *result;
746 
747     if (ms7 <= 0x5f) {
748       /* class 1 */
749       result = &dv_vlc_lookup1[i >> 2];
750     } else if (ms7 <= 0x7b) {
751       /* class 2 */
752       result = &dv_vlc_lookup2[(bits & dv_vlc_index_mask[2]) >> dv_vlc_index_rshift[2]];
753       if (result->len > 7)
754 	result = NULL;
755     } else {
756       result = NULL;
757     }
758 
759     /* result is non-NULL if a vlc matched. */
760     if (result) {
761       dv_vlc_class1_shortcut[i] = *result;
762       if ((result->amp > 0) && ((bits >> sign_rshift[result->len]) & 1))
763 	dv_vlc_class1_shortcut[i].amp *= -1;
764     } else {
765       dv_vlc_class1_shortcut[i] = dv_vlc_lookup1[0x1f];
766     }
767   }
768 } /* dv_construct_vlc_table */
769 
770 /* Note we assume bits is right (lsb) aligned, and that (0 < maxbits <
771  * 17).  This may look crazy, but there are no branches here. */
772 
773 #if (!ARCH_X86) && (!ARCH_X86_64)
dv_decode_vlc(int bits,int maxbits,dv_vlc_t * result)774 void dv_decode_vlc(int bits,int maxbits, dv_vlc_t *result) {
775 #ifdef __GNUC__
776   static dv_vlc_t vlc_broken = {run: -1, amp: -1, len: VLC_NOBITS};
777 #else /* ! __GNUC__ */
778   static dv_vlc_t vlc_broken = {-1, VLC_NOBITS, -1};
779 #endif /* ! __GNUC__ */
780   dv_vlc_t *results[2] = { &vlc_broken, result };
781   int klass, has_sign, amps[2];
782 
783   /* note that BITS is left aligned */
784   klass = dv_vlc_classes[maxbits][(bits & (dv_vlc_class_index_mask[maxbits])) >> (dv_vlc_class_index_rshift[maxbits])];
785   *result = dv_vlc_lookups[klass][(bits & (dv_vlc_index_mask[klass])) >> (dv_vlc_index_rshift[klass])];
786   amps[1] = -(amps[0] = result->amp);
787   has_sign = amps[0] > 0;
788   result->amp = amps[has_sign &  /* or vlc not valid */
789 		       (bits >> sign_rshift[result->len])];
790   *result = *results[maxbits >= result->len];
791 } /* dv_decode_vlc */
792 
793 /* Fastpath version of previous function; assumes full 16bits are
794    available, which eleminates left align of input, check for enough
795    bits at end, and hardcodes lookups on maxbits. */
796 
__dv_decode_vlc(int bits,dv_vlc_t * result)797 void __dv_decode_vlc(int bits, dv_vlc_t *result) {
798   int klass, has_sign, amps[2];
799 
800   klass = dv_vlc_classes[16][(bits & (dv_vlc_class_index_mask[16])) >> (dv_vlc_class_index_rshift[16])];
801   *result = dv_vlc_lookups[klass][(bits & (dv_vlc_index_mask[klass])) >> (dv_vlc_index_rshift[klass])];
802   amps[1] = -(amps[0] = result->amp);
803   has_sign = amps[0] > 0;
804   result->amp = amps[has_sign &  /* or vlc not valid */
805 		    (bits >> sign_rshift[result->len])];
806 } /* __dv_decode_vlc */
807 #endif /* (! ARCH_X86) && (!ARCH_X86_64) */
808