~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Open Mash Cross Reference
mash/codec/h263/h263-huff.h

Component: ~ [ mash ] ~ [ apps ] ~ [ gsm ] ~ [ lib ] ~ [ otcl ] ~ [ srm ] ~ [ tcl8.3 ] ~ [ tclcl ] ~ [ tk8.3 ] ~ [ tutorials ] ~

  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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.