annotate libfaad2/bits.h @ 29400:0446f018f9fc

Make diff apply cleanly to our tree again. The GPL modification notices were dropped, same as for the other diffs we store.
author diego
date Sun, 26 Jul 2009 19:38:22 +0000
parents 0783dd397f74
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
1 /*
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
14729
b4378a6f87a6 Sync missing cosmetics from the 2004-07-12 CVS snapshot.
diego
parents: 12625
diff changeset
4 **
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
5 ** This program is free software; you can redistribute it and/or modify
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
6 ** it under the terms of the GNU General Public License as published by
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
7 ** the Free Software Foundation; either version 2 of the License, or
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
8 ** (at your option) any later version.
14729
b4378a6f87a6 Sync missing cosmetics from the 2004-07-12 CVS snapshot.
diego
parents: 12625
diff changeset
9 **
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
10 ** This program is distributed in the hope that it will be useful,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
13 ** GNU General Public License for more details.
14729
b4378a6f87a6 Sync missing cosmetics from the 2004-07-12 CVS snapshot.
diego
parents: 12625
diff changeset
14 **
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
15 ** You should have received a copy of the GNU General Public License
14729
b4378a6f87a6 Sync missing cosmetics from the 2004-07-12 CVS snapshot.
diego
parents: 12625
diff changeset
16 ** along with this program; if not, write to the Free Software
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
18 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
19 ** Any non-GPL usage of this software or parts of this software is strictly
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
20 ** forbidden.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
21 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
22 ** Commercial non-GPL licensing of this software is possible.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
24 **
12625
d81145997036 More information about modifications to comply more closely with GPL 2a.
diego
parents: 12527
diff changeset
25 ** Initially modified for use with MPlayer by Arpad Gereöffy on 2003/08/30
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
26 ** $Id$
18783
0783dd397f74 CVS --> Subversion in copyright notices
diego
parents: 14731
diff changeset
27 ** detailed changelog at http://svn.mplayerhq.hu/mplayer/trunk/
14731
0cf5722252f8 Point to local_changes.diff.
diego
parents: 14729
diff changeset
28 ** local_changes.diff contains the exact changes to this file.
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
29 **/
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
30
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
31 #ifndef __BITS_H__
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
32 #define __BITS_H__
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
33
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
34 #ifdef __cplusplus
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
35 extern "C" {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
36 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
37
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
38 #include "analysis.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
39 #ifdef ANALYSIS
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
40 #include <stdio.h>
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
41 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
42
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
43 #define BYTE_NUMBIT 8
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
44 #define bit2byte(a) ((a+7)/BYTE_NUMBIT)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
45
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
46 typedef struct _bitfile
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
47 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
48 /* bit input */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
49 uint32_t bufa;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
50 uint32_t bufb;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
51 uint32_t bits_left;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
52 uint32_t buffer_size; /* size of the buffer in bytes */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
53 uint32_t bytes_used;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
54 uint8_t no_more_reading;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
55 uint8_t error;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
56 uint32_t *tail;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
57 uint32_t *start;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
58 void *buffer;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
59 } bitfile;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
60
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
61
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
62 #if defined (_WIN32) && !defined(_WIN32_WCE) && !defined(__MINGW32__)
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
63 #define BSWAP(a) __asm mov eax,a __asm bswap eax __asm mov a, eax
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
64 #elif defined(LINUX) || defined(DJGPP)
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
65 #define BSWAP(a) __asm__ ( "bswapl %0\n" : "=r" (a) : "0" (a) )
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
66 #else
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
67 #define BSWAP(a) \
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
68 ((a) = ( ((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)>>8)&0xff00) | (((a)>>24)&0xff))
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
69 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
70
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
71 static uint32_t bitmask[] = {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
72 0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
73 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
74 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
75 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
76 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
77 /* added bitmask 32, correct?!?!?! */
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
78 , 0xFFFFFFFF
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
79 };
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
80
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
81 void faad_initbits(bitfile *ld, const void *buffer, const uint32_t buffer_size);
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
82 void faad_endbits(bitfile *ld);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
83 void faad_initbits_rev(bitfile *ld, void *buffer,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
84 uint32_t bits_in_buffer);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
85 uint8_t faad_byte_align(bitfile *ld);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
86 uint32_t faad_get_processed_bits(bitfile *ld);
10989
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
87 void faad_flushbits_ex(bitfile *ld, uint32_t bits);
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
88 void faad_rewindbits(bitfile *ld);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
89 uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
90 DEBUGDEC);
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
91 #ifdef DRM
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
92 void *faad_origbitbuffer(bitfile *ld);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
93 uint32_t faad_origbitbuffer_size(bitfile *ld);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
94 #endif
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
95
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
96 /* circumvent memory alignment errors on ARM */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
97 static INLINE uint32_t getdword(void *mem)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
98 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
99 #ifdef ARM
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
100 uint32_t tmp;
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
101 #ifndef ARCH_IS_BIG_ENDIAN
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
102 ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[3];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
103 ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[2];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
104 ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[1];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
105 ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[0];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
106 #else
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
107 ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[0];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
108 ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[1];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
109 ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[2];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
110 ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[3];
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
111 #endif
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
112
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
113 return tmp;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
114 #else
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
115 uint32_t tmp;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
116 tmp = *(uint32_t*)mem;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
117 #ifndef ARCH_IS_BIG_ENDIAN
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
118 BSWAP(tmp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
119 #endif
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
120 return tmp;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
121 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
122 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
123
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
124 static INLINE uint32_t faad_showbits(bitfile *ld, uint32_t bits)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
125 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
126 if (bits <= ld->bits_left)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
127 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
128 return (ld->bufa >> (ld->bits_left - bits)) & bitmask[bits];
10989
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
129 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
130
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
131 bits -= ld->bits_left;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
132 return ((ld->bufa & bitmask[ld->bits_left]) << bits) | (ld->bufb >> (32 - bits));
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
133 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
134
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
135 static INLINE void faad_flushbits(bitfile *ld, uint32_t bits)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
136 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
137 /* do nothing if error */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
138 if (ld->error != 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
139 return;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
140
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
141 if (bits < ld->bits_left)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
142 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
143 ld->bits_left -= bits;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
144 } else {
10989
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
145 faad_flushbits_ex(ld, bits);
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
146 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
147 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
148
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
149 /* return next n bits (right adjusted) */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
150 static INLINE uint32_t faad_getbits(bitfile *ld, uint32_t n DEBUGDEC)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
151 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
152 uint32_t ret;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
153
10989
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
154 if (ld->no_more_reading || n == 0)
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
155 return 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
156
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
157 ret = faad_showbits(ld, n);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
158 faad_flushbits(ld, n);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
159
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
160 #ifdef ANALYSIS
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
161 if (print)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
162 fprintf(stdout, "%4d %2d bits, val: %4d, variable: %d %s\n", dbg_count++, n, ret, var, dbg);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
163 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
164
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
165 return ret;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
166 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
167
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
168 static INLINE uint8_t faad_get1bit(bitfile *ld DEBUGDEC)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
169 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
170 uint8_t r;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
171
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
172 if (ld->bits_left > 0)
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
173 {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
174 ld->bits_left--;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
175 r = (uint8_t)((ld->bufa >> ld->bits_left) & 1);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
176 return r;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
177 }
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
178
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
179 /* bits_left == 0 */
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
180 #if 0
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
181 r = (uint8_t)(ld->bufb >> 31);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
182 faad_flushbits_ex(ld, 1);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
183 #else
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
184 r = (uint8_t)faad_getbits(ld, 1);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
185 #endif
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
186 return r;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
187 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
188
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
189 /* reversed bitreading routines */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
190 static INLINE uint32_t faad_showbits_rev(bitfile *ld, uint32_t bits)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
191 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
192 uint8_t i;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
193 uint32_t B = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
194
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
195 if (bits <= ld->bits_left)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
196 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
197 for (i = 0; i < bits; i++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
198 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
199 if (ld->bufa & (1 << (i + (32 - ld->bits_left))))
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
200 B |= (1 << (bits - i - 1));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
201 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
202 return B;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
203 } else {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
204 for (i = 0; i < ld->bits_left; i++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
205 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
206 if (ld->bufa & (1 << (i + (32 - ld->bits_left))))
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
207 B |= (1 << (bits - i - 1));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
208 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
209 for (i = 0; i < bits - ld->bits_left; i++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
210 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
211 if (ld->bufb & (1 << (i + (32-ld->bits_left))))
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
212 B |= (1 << (bits - ld->bits_left - i - 1));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
213 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
214 return B;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
215 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
216 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
217
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
218 static INLINE void faad_flushbits_rev(bitfile *ld, uint32_t bits)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
219 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
220 /* do nothing if error */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
221 if (ld->error != 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
222 return;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
223
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
224 if (bits < ld->bits_left)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
225 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
226 ld->bits_left -= bits;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
227 } else {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
228 uint32_t tmp;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
229
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
230 ld->bufa = ld->bufb;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
231 tmp = getdword(ld->start);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
232 ld->bufb = tmp;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
233 ld->start--;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
234 ld->bits_left += (32 - bits);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
235
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
236 ld->bytes_used += 4;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
237 if (ld->bytes_used == ld->buffer_size)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
238 ld->no_more_reading = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
239 if (ld->bytes_used > ld->buffer_size)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
240 ld->error = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
241 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
242 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
243
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
244 static INLINE uint32_t faad_getbits_rev(bitfile *ld, uint32_t n
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
245 DEBUGDEC)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
246 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
247 uint32_t ret;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
248
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
249 if (ld->no_more_reading)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
250 return 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
251
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
252 if (n == 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
253 return 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
254
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
255 ret = faad_showbits_rev(ld, n);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
256 faad_flushbits_rev(ld, n);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
257
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
258 #ifdef ANALYSIS
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
259 if (print)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
260 fprintf(stdout, "%4d %2d bits, val: %4d, variable: %d %s\n", dbg_count++, n, ret, var, dbg);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
261 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
262
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
263 return ret;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
264 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
265
10989
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
266 #ifdef DRM
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
267 static uint8_t faad_check_CRC(bitfile *ld, uint16_t len)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
268 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
269 uint8_t CRC;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
270 uint16_t r=255; /* Initialize to all ones */
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
271
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
272 /* CRC polynome used x^8 + x^4 + x^3 + x^2 +1 */
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
273 #define GPOLY 0435
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
274
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
275 faad_rewindbits(ld);
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
276
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
277 CRC = (uint8_t) ~faad_getbits(ld, 8
10989
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
278 DEBUGVAR(1,999,"faad_check_CRC(): CRC")); /* CRC is stored inverted */
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
279
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
280 for (; len>0; len--)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
281 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
282 r = ( (r << 1) ^ (( ( faad_get1bit(ld
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
283 DEBUGVAR(1,998,"")) & 1) ^ ((r >> 7) & 1)) * GPOLY )) & 0xFF;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
284 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
285
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
286 if (r != CRC)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
287 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
288 return 8;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
289 } else {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
290 return 0;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
291 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
292 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
293
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
294 static uint8_t tabFlipbits[256] = {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
295 0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
296 8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
297 4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
298 12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
299 2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
300 10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
301 6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
302 14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
303 1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
304 9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
305 5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
306 13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
307 3,131,67,195,35,163,99,227,19,147,83,211,51,179,115,243,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
308 11,139,75,203,43,171,107,235,27,155,91,219,59,187,123,251,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
309 7,135,71,199,39,167,103,231,23,151,87,215,55,183,119,247,
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
310 15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
311 };
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
312 #endif
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
313
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
314 #ifdef ERROR_RESILIENCE
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
315
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
316 /* Modified bit reading functions for HCR */
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
317
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
318 typedef struct
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
319 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
320 /* bit input */
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
321 uint32_t bufa;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
322 uint32_t bufb;
14729
b4378a6f87a6 Sync missing cosmetics from the 2004-07-12 CVS snapshot.
diego
parents: 12625
diff changeset
323 int8_t len;
10989
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
324 } bits_t;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
325
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
326
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
327 static INLINE uint32_t showbits_hcr(bits_t *ld, uint8_t bits)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
328 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
329 if (bits == 0) return 0;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
330 if (ld->len <= 32)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
331 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
332 /* huffman_spectral_data_2 needs to read more than may be available, bits maybe
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
333 > ld->len, deliver 0 than */
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
334 if (ld->len >= bits)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
335 return ((ld->bufa >> (ld->len - bits)) & (0xFFFFFFFF >> (32 - bits)));
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
336 else
14729
b4378a6f87a6 Sync missing cosmetics from the 2004-07-12 CVS snapshot.
diego
parents: 12625
diff changeset
337 return ((ld->bufa << (bits - ld->len)) & (0xFFFFFFFF >> (32 - bits)));
10989
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
338 } else {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
339 if ((ld->len - bits) < 32)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
340 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
341 return ( (ld->bufb & (0xFFFFFFFF >> (64 - ld->len))) << (bits - ld->len + 32)) |
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
342 (ld->bufa >> (ld->len - bits));
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
343 } else {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
344 return ((ld->bufb >> (ld->len - bits - 32)) & (0xFFFFFFFF >> (32 - bits)));
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
345 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
346 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
347 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
348
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
349 /* return 1 if position is outside of buffer, 0 otherwise */
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
350 static INLINE int8_t flushbits_hcr( bits_t *ld, uint8_t bits)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
351 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
352 ld->len -= bits;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
353
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
354 if (ld->len <0)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
355 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
356 ld->len = 0;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
357 return 1;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
358 } else {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
359 return 0;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
360 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
361 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
362
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
363 static INLINE int8_t getbits_hcr(bits_t *ld, uint8_t n, uint32_t *result)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
364 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
365 *result = showbits_hcr(ld, n);
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
366 return flushbits_hcr(ld, n);
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
367 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
368
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
369 static INLINE int8_t get1bit_hcr(bits_t *ld, uint8_t *result)
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
370 {
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
371 uint32_t res;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
372 int8_t ret;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
373
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
374 ret = getbits_hcr(ld, 1, &res);
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
375 *result = (int8_t)(res & 1);
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
376 return ret;
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
377 }
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
378
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
379 #endif
3185f64f6350 synced with current cvs
alex
parents: 10805
diff changeset
380
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
381
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
382 #ifdef __cplusplus
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
383 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
384 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
385 #endif