1 /*
2 * h263-huff.h --
3 *
4 * H.263 Huffman tables.
5 *
6 * Copyright (c) 1993-2002 The Regents of the University of California.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 * A. Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
14 * B. Redistributions in binary form must reproduce the above copyright notice,
15 * this list of conditions and the following disclaimer in the documentation
16 * and/or other materials provided with the distribution.
17 * C. Neither the names of the copyright holders nor the names of its
18 * contributors may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
22 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 *
33 * @(#) $Header: /usr/mash/src/repository/mash/mash-1/codec/h263/h263-huff.h,v 1.2 2003/06/14 19:11:49 larry Exp $
34 */
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40 #define SYM_ILLEGAL -1
41 #define SYM_STUFFING -2
42 #define SYM_ESCAPE -3
43
44 #define SYM_STARTCODE -4
45 #define SYM_EOB -5
46
47 /*
48 * Flags that indicate which macroblock data elements are present.
49 *
50 * MT_INTRA INTRA macroblock
51 * MT_CBPC5 non-INTRADC coefficient(s) present for U
52 * MT_CBPC6 non-INTRADC coefficient(s) present for V
53 * MT_DQUANT differential quantization value
54 * MT_MVD motion vector data
55 * MT_MVD234 more motion vector data
56 */
57 #define MT_CBPC6 0x01
58 #define MT_CBPC5 0x02
59 #define MT_CBPC56 (MT_CBPC5 | MT_CBPC6)
60 #define MT_DQUANT 0x04
61 #define MT_MVD 0x08
62 #define MT_MVD234 0x10
63 #define MT_INTRA 0x20
64
65 #ifndef HUFFSTRINGS
66
67 struct huffent {
68 int val;
69 int nb;
70 };
71
72 extern const unsigned char skiptab[];
73
74 /*
75 * Lookup tables that map an encoded prefix of the bit string,
76 * into the next symbol (for decoding).
77 */
78 extern const short h263_htd_mtype_i[];
79 extern const short h263_htd_mtype_p[];
80 extern const short h263_htd_cbpy_i[];
81 extern const short h263_htd_cbpy_p[];
82 extern const short h263_htd_mvd[];
83 extern const short h263_htd_tcoeff[];
84 extern const short h263_htd_mba[];
85
86 extern const int h263_htd_mtype_i_width;
87 extern const int h263_htd_mtype_p_width;
88 extern const int h263_htd_cbpy_i_width;
89 extern const int h263_htd_cbpy_p_width;
90 extern const int h263_htd_mvd_width;
91 extern const int h263_htd_tcoeff_width;
92 extern const int h263_htd_mba_width;
93
94 /*
95 * Look up tables that produce a huffman encoding string
96 * from a symbol or group of symbols (for encoding).
97 */
98 extern struct huffent h263_hte_mba[];
99 extern struct huffent h263_hte_tc[];
100
101 #else
102 struct huffcode {
103 int val;
104 char* str;
105 };
106
107 static const struct huffcode h263_hc_mtype_i[] = {
108 { MT_INTRA, "1" },
109 { MT_INTRA | MT_CBPC6, "001" },
110 { MT_INTRA | MT_CBPC5, "010" },
111 { MT_INTRA | MT_CBPC56, "011" },
112 { MT_INTRA | MT_DQUANT, "0001" },
113 { MT_INTRA | MT_DQUANT | MT_CBPC6, "000001" },
114 { MT_INTRA | MT_DQUANT | MT_CBPC5, "000010" },
115 { MT_INTRA | MT_DQUANT | MT_CBPC56, "000011" },
116 { SYM_STUFFING, "000000001" },
117 { 0, 0 }
118 };
119
120 static const struct huffcode h263_hc_mtype_p[] = {
121 { MT_MVD, "1" },
122 { MT_MVD | MT_CBPC6, "0011" },
123 { MT_MVD | MT_CBPC5, "0010" },
124 { MT_MVD | MT_CBPC56, "000101" },
125 { MT_DQUANT | MT_MVD, "011" },
126 { MT_DQUANT | MT_MVD | MT_CBPC6, "0000111" },
127 { MT_DQUANT | MT_MVD | MT_CBPC5, "0000110" },
128 { MT_DQUANT | MT_MVD | MT_CBPC56, "000000101" },
129 { MT_MVD | MT_MVD234, "010" },
130 { MT_MVD | MT_MVD234 | MT_CBPC6, "0000101" },
131 { MT_MVD | MT_MVD234 | MT_CBPC5, "0000100" },
132 { MT_MVD | MT_MVD234 | MT_CBPC56, "00000101" },
133 { MT_INTRA, "00011" },
134 { MT_INTRA | MT_CBPC6, "00000100" },
135 { MT_INTRA | MT_CBPC5, "00000011" },
136 { MT_INTRA | MT_CBPC56, "0000011" },
137 { MT_INTRA | MT_DQUANT, "000100" },
138 { MT_INTRA | MT_DQUANT | MT_CBPC6, "000000100" },
139 { MT_INTRA | MT_DQUANT | MT_CBPC5, "000000011" },
140 { MT_INTRA | MT_DQUANT | MT_CBPC56, "000000010" },
141 { SYM_STUFFING, "000000001" },
142 { MT_DQUANT | MT_MVD | MT_MVD234, "00000000010" },
143 { MT_DQUANT | MT_MVD | MT_MVD234 | MT_CBPC6, "0000000001100" },
144 { MT_DQUANT | MT_MVD | MT_MVD234 | MT_CBPC5, "0000000001110" },
145 { MT_DQUANT | MT_MVD | MT_MVD234 | MT_CBPC56, "0000000001111" },
146 { 0, 0 }
147 };
148
149 static const struct huffcode h263_hc_mba[] = {
150 { SYM_STUFFING, "00000001111" },
151 { SYM_STARTCODE, "0000000000000001" },
152 { 1, "1" },
153 { 2, "011" },
154 { 3, "010" },
155 { 4, "0011" },
156 { 5, "0010" },
157 { 6, "00011" },
158 { 7, "00010" },
159 { 8, "0000111" },
160 { 9, "0000110" },
161 { 10, "00001011" },
162 { 11, "00001010" },
163 { 12, "00001001" },
164 { 13, "00001000" },
165 { 14, "00000111" },
166 { 15, "00000110" },
167 { 16, "0000010111" },
168 { 17, "0000010110" },
169 { 18, "0000010101" },
170 { 19, "0000010100" },
171 { 20, "0000010011" },
172 { 21, "0000010010" },
173 { 22, "00000100011" },
174 { 23, "00000100010" },
175 { 24, "00000100001" },
176 { 25, "00000100000" },
177 { 26, "00000011111" },
178 { 27, "00000011110" },
179 { 28, "00000011101" },
180 { 29, "00000011100" },
181 { 30, "00000011011" },
182 { 31, "00000011010" },
183 { 32, "00000011001" },
184 { 33, "00000011000" },
185 { 0, 0 }
186 };
187
188 static const huffcode h263_hc_cbpy_i[] = {
189 { 0, "0011" },
190 { 1, "00101" },
191 { 2, "00100" },
192 { 3, "1001" },
193 { 4, "00011" },
194 { 5, "0111" },
195 { 6, "000010" },
196 { 7, "1011" },
197 { 8, "00010" },
198 { 9, "000011" },
199 { 10, "0101" },
200 { 11, "1010" },
201 { 12, "0100" },
202 { 13, "1000" },
203 { 14, "0110" },
204 { 15, "11" },
205 { 0, 0 }
206 };
207
208 static const huffcode h263_hc_cbpy_p[] = {
209 { 15, "0011" },
210 { 14, "00101" },
211 { 13, "00100" },
212 { 12, "1001" },
213 { 11, "00011" },
214 { 10, "0111" },
215 { 9, "000010" },
216 { 8, "1011" },
217 { 7, "00010" },
218 { 6, "000011" },
219 { 5, "0101" },
220 { 4, "1010" },
221 { 3, "0100" },
222 { 2, "1000" },
223 { 1, "0110" },
224 { 0, "11" },
225 { 0, 0 }
226 };
227
228 static const struct huffcode h263_hc_mvd[] = {
229 { -32, "0000000000101" },
230 { -31, "0000000000111" },
231 { -30, "000000000101" },
232 { -29, "000000000111" },
233 { -28, "000000001001" },
234 { -27, "000000001011" },
235 { -26, "000000001101" },
236 { -25, "000000001111" },
237 { -24, "00000001001" },
238 { -23, "00000001011" },
239 { -22, "00000001101" },
240 { -21, "00000001111" },
241 { -20, "00000010001" },
242 { -19, "00000010011" },
243 { -18, "00000010101" },
244 { -17, "00000010111" },
245 { -16, "00000011001" },
246 { -15, "00000011011" },
247 { -14, "00000011101" },
248 { -13, "00000011111" },
249 { -12, "00000100001" },
250 { -11, "00000100011" },
251 { -10, "0000010011" },
252 { -9, "0000010101" },
253 { -8, "0000010111" },
254 { -7, "00000111" },
255 { -6, "00001001" },
256 { -5, "00001011" },
257 { -4, "0000111" },
258 { -3, "00011" },
259 { -2, "0011" },
260 { -1, "011" },
261 { 0, "1" },
262 { 1, "010" },
263 { 2, "0010" },
264 { 3, "00010" },
265 { 4, "0000110" },
266 { 5, "00001010" },
267 { 6, "00001000" },
268 { 7, "00000110" },
269 { 8, "0000010110" },
270 { 9, "0000010100" },
271 { 10, "0000010010" },
272 { 11, "00000100010" },
273 { 12, "00000100000" },
274 { 13, "00000011110" },
275 { 14, "00000011100" },
276 { 15, "00000011010" },
277 { 16, "00000011000" },
278 { 17, "00000010110" },
279 { 18, "00000010100" },
280 { 19, "00000010010" },
281 { 20, "00000010000" },
282 { 21, "00000001110" },
283 { 22, "00000001100" },
284 { 23, "00000001010" },
285 { 24, "00000001000" },
286 { 25, "000000001110" },
287 { 26, "000000001100" },
288 { 27, "000000001010" },
289 { 28, "000000001000" },
290 { 29, "000000000110" },
291 { 30, "000000000100" },
292 { 31, "0000000000110" },
293 { 0, 0 }
294 };
295
296 /*
297 * The signs of the values below are determined by the last
298 * bit in the huffman code.
299 * (Note that we have to be careful that SYM_ILLEGAL = -1
300 * or SYM_ESCAPE = -3 don't crop up here -- they don't.)
301 */
302
303 #define TC_LAST(x) ((x) << 10)
304 #define TC_RUN(x) ((x) << 4)
305 #define TC_LEVEL(x) ((x) & 0xF)
306
307 static const struct huffcode h263_hc_tcoeff[] = {
308 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(1), "10" },
309 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(2), "1111" },
310 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(3), "010101" },
311 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(4), "0010111" },
312 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(5), "00011111" },
313 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(6), "000100101" },
314 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(7), "000100100" },
315 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(8), "0000100001" },
316 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(9), "0000100000" },
317 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(10), "00000000111" },
318 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(11), "00000000110" },
319 { TC_LAST(0) | TC_RUN(0) | TC_LEVEL(12), "00000100000" },
320 { TC_LAST(0) | TC_RUN(1) | TC_LEVEL(1), "110" },
321 { TC_LAST(0) | TC_RUN(1) | TC_LEVEL(2), "010100" },
322 { TC_LAST(0) | TC_RUN(1) | TC_LEVEL(3), "00011110" },
323 { TC_LAST(0) | TC_RUN(1) | TC_LEVEL(4), "0000001111" },
324 { TC_LAST(0) | TC_RUN(1) | TC_LEVEL(5), "00000100001" },
325 { TC_LAST(0) | TC_RUN(1) | TC_LEVEL(6), "000001010000" },
326 { TC_LAST(0) | TC_RUN(2) | TC_LEVEL(1), "1110" },
327 { TC_LAST(0) | TC_RUN(2) | TC_LEVEL(2), "00011101" },
328 { TC_LAST(0) | TC_RUN(2) | TC_LEVEL(3), "0000001110" },
329 { TC_LAST(0) | TC_RUN(2) | TC_LEVEL(4), "000001010001" },
330 { TC_LAST(0) | TC_RUN(3) | TC_LEVEL(1), "01101" },
331 { TC_LAST(0) | TC_RUN(3) | TC_LEVEL(2), "000100011" },
332 { TC_LAST(0) | TC_RUN(3) | TC_LEVEL(3), "0000001101" },
333 { TC_LAST(0) | TC_RUN(4) | TC_LEVEL(1), "01100" },
334 { TC_LAST(0) | TC_RUN(4) | TC_LEVEL(2), "000100010" },
335 { TC_LAST(0) | TC_RUN(4) | TC_LEVEL(3), "000001010010" },
336 { TC_LAST(0) | TC_RUN(5) | TC_LEVEL(1), "01011" },
337 { TC_LAST(0) | TC_RUN(5) | TC_LEVEL(2), "0000001100" },
338 { TC_LAST(0) | TC_RUN(5) | TC_LEVEL(3), "000001010011" },
339 { TC_LAST(0) | TC_RUN(6) | TC_LEVEL(1), "010011" },
340 { TC_LAST(0) | TC_RUN(6) | TC_LEVEL(2), "0000001011" },
341 { TC_LAST(0) | TC_RUN(6) | TC_LEVEL(3), "000001010100" },
342 { TC_LAST(0) | TC_RUN(7) | TC_LEVEL(1), "010010" },
343 { TC_LAST(0) | TC_RUN(7) | TC_LEVEL(2), "0000001010" },
344 { TC_LAST(0) | TC_RUN(8) | TC_LEVEL(1), "010001" },
345 { TC_LAST(0) | TC_RUN(8) | TC_LEVEL(2), "0000001001" },
346 { TC_LAST(0) | TC_RUN(9) | TC_LEVEL(1), "010000" },
347 { TC_LAST(0) | TC_RUN(9) | TC_LEVEL(2), "0000001000" },
348 { TC_LAST(0) | TC_RUN(10) | TC_LEVEL(1), "0010110" },
349 { TC_LAST(0) | TC_RUN(10) | TC_LEVEL(2), "000001010101" },
350 { TC_LAST(0) | TC_RUN(11) | TC_LEVEL(1), "0010101" },
351 { TC_LAST(0) | TC_RUN(12) | TC_LEVEL(1), "0010100" },
352 { TC_LAST(0) | TC_RUN(13) | TC_LEVEL(1), "00011100" },
353 { TC_LAST(0) | TC_RUN(14) | TC_LEVEL(1), "00011011" },
354 { TC_LAST(0) | TC_RUN(15) | TC_LEVEL(1), "000100001" },
355 { TC_LAST(0) | TC_RUN(16) | TC_LEVEL(1), "000100000" },
356 { TC_LAST(0) | TC_RUN(17) | TC_LEVEL(1), "000011111" },
357 { TC_LAST(0) | TC_RUN(18) | TC_LEVEL(1), "000011110" },
358 { TC_LAST(0) | TC_RUN(19) | TC_LEVEL(1), "000011101" },
359 { TC_LAST(0) | TC_RUN(20) | TC_LEVEL(1), "000011100" },
360 { TC_LAST(0) | TC_RUN(21) | TC_LEVEL(1), "000011011" },
361 { TC_LAST(0) | TC_RUN(22) | TC_LEVEL(1), "000011010" },
362 { TC_LAST(0) | TC_RUN(23) | TC_LEVEL(1), "00000100010" },
363 { TC_LAST(0) | TC_RUN(24) | TC_LEVEL(1), "00000100011" },
364 { TC_LAST(0) | TC_RUN(25) | TC_LEVEL(1), "000001010110" },
365 { TC_LAST(0) | TC_RUN(26) | TC_LEVEL(1), "000001010111" },
366 { TC_LAST(1) | TC_RUN(0) | TC_LEVEL(1), "0111" },
367 { TC_LAST(1) | TC_RUN(0) | TC_LEVEL(2), "000011001" },
368 { TC_LAST(1) | TC_RUN(0) | TC_LEVEL(3), "00000000101" },
369 { TC_LAST(1) | TC_RUN(1) | TC_LEVEL(1), "001111" },
370 { TC_LAST(1) | TC_RUN(1) | TC_LEVEL(2), "00000000100" },
371 { TC_LAST(1) | TC_RUN(2) | TC_LEVEL(1), "001110" },
372 { TC_LAST(1) | TC_RUN(3) | TC_LEVEL(1), "001101" },
373 { TC_LAST(1) | TC_RUN(4) | TC_LEVEL(1), "001100" },
374 { TC_LAST(1) | TC_RUN(5) | TC_LEVEL(1), "0010011" },
375 { TC_LAST(1) | TC_RUN(6) | TC_LEVEL(1), "0010010" },
376 { TC_LAST(1) | TC_RUN(7) | TC_LEVEL(1), "0010001" },
377 { TC_LAST(1) | TC_RUN(8) | TC_LEVEL(1), "0010000" },
378 { TC_LAST(1) | TC_RUN(9) | TC_LEVEL(1), "00011010" },
379 { TC_LAST(1) | TC_RUN(10) | TC_LEVEL(1), "00011001" },
380 { TC_LAST(1) | TC_RUN(11) | TC_LEVEL(1), "00011000" },
381 { TC_LAST(1) | TC_RUN(12) | TC_LEVEL(1), "00010111" },
382 { TC_LAST(1) | TC_RUN(13) | TC_LEVEL(1), "00010110" },
383 { TC_LAST(1) | TC_RUN(14) | TC_LEVEL(1), "00010101" },
384 { TC_LAST(1) | TC_RUN(15) | TC_LEVEL(1), "00010100" },
385 { TC_LAST(1) | TC_RUN(16) | TC_LEVEL(1), "00010011" },
386 { TC_LAST(1) | TC_RUN(17) | TC_LEVEL(1), "000011000" },
387 { TC_LAST(1) | TC_RUN(18) | TC_LEVEL(1), "000010111" },
388 { TC_LAST(1) | TC_RUN(19) | TC_LEVEL(1), "000010110" },
389 { TC_LAST(1) | TC_RUN(20) | TC_LEVEL(1), "000010101" },
390 { TC_LAST(1) | TC_RUN(21) | TC_LEVEL(1), "000010100" },
391 { TC_LAST(1) | TC_RUN(22) | TC_LEVEL(1), "000010011" },
392 { TC_LAST(1) | TC_RUN(23) | TC_LEVEL(1), "000010010" },
393 { TC_LAST(1) | TC_RUN(24) | TC_LEVEL(1), "000010001" },
394 { TC_LAST(1) | TC_RUN(25) | TC_LEVEL(1), "0000000111" },
395 { TC_LAST(1) | TC_RUN(26) | TC_LEVEL(1), "0000000110" },
396 { TC_LAST(1) | TC_RUN(27) | TC_LEVEL(1), "0000000101" },
397 { TC_LAST(1) | TC_RUN(28) | TC_LEVEL(1), "0000000100" },
398 { TC_LAST(1) | TC_RUN(29) | TC_LEVEL(1), "00000100100" },
399 { TC_LAST(1) | TC_RUN(30) | TC_LEVEL(1), "00000100101" },
400 { TC_LAST(1) | TC_RUN(31) | TC_LEVEL(1), "00000100110" },
401 { TC_LAST(1) | TC_RUN(32) | TC_LEVEL(1), "00000100111" },
402 { TC_LAST(1) | TC_RUN(33) | TC_LEVEL(1), "000001011000" },
403 { TC_LAST(1) | TC_RUN(34) | TC_LEVEL(1), "000001011001" },
404 { TC_LAST(1) | TC_RUN(35) | TC_LEVEL(1), "000001011010" },
405 { TC_LAST(1) | TC_RUN(36) | TC_LEVEL(1), "000001011011" },
406 { TC_LAST(1) | TC_RUN(37) | TC_LEVEL(1), "000001011100" },
407 { TC_LAST(1) | TC_RUN(38) | TC_LEVEL(1), "000001011101" },
408 { TC_LAST(1) | TC_RUN(39) | TC_LEVEL(1), "000001011110" },
409 { TC_LAST(1) | TC_RUN(40) | TC_LEVEL(1), "000001011111" },
410 { SYM_ESCAPE, "0000011" },
411 { 0, 0 }
412 };
413
414 #endif /* #ifndef HUFFSTRINGS */
415
416 #ifdef __cplusplus
417 }
418 #endif
419
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.