annotate liba52/bitstream.h @ 10218:f82646fc1431

Moved video filters to a separate section, moved slave mode section to the tech subdir, random improvements, default indentation reduced. Straight from the LUG camp Felsberg by Jonas and Diego.
author jonas
date Sat, 31 May 2003 16:41:41 +0000
parents 1c95e3d5888a
children b479b224d435
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
1 /*
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
2 * bitstream.h
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
3 * Copyright (C) 2000-2001 Michel Lespinasse <walken@zoy.org>
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
4 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
5 *
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
6 * This file is part of a52dec, a free ATSC A-52 stream decoder.
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
7 * See http://liba52.sourceforge.net/ for updates.
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
8 *
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
9 * a52dec is free software; you can redistribute it and/or modify
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
12 * (at your option) any later version.
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
13 *
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
14 * a52dec is distributed in the hope that it will be useful,
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
17 * GNU General Public License for more details.
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
18 *
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
20 * along with this program; if not, write to the Free Software
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
22 */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
23
10067
f9eac474eb74 this is a important patch for hpux 11.00, because it avoid the
diego
parents: 7255
diff changeset
24 #if defined(__sparc__) || defined(hpux)
7255
34b5a0b12558 The ALT_BITSTREAM_READER code does not work on SPARC, because the code accesses
jkeil
parents: 4053
diff changeset
25 /*
34b5a0b12558 The ALT_BITSTREAM_READER code does not work on SPARC, because the code accesses
jkeil
parents: 4053
diff changeset
26 * the alt bitstream reader performs unaligned memory accesses; that doesn't work
10067
f9eac474eb74 this is a important patch for hpux 11.00, because it avoid the
diego
parents: 7255
diff changeset
27 * on sparc/hpux. For now, disable ALT_BITSTREAM_READER.
7255
34b5a0b12558 The ALT_BITSTREAM_READER code does not work on SPARC, because the code accesses
jkeil
parents: 4053
diff changeset
28 */
34b5a0b12558 The ALT_BITSTREAM_READER code does not work on SPARC, because the code accesses
jkeil
parents: 4053
diff changeset
29 #undef ALT_BITSTREAM_READER
34b5a0b12558 The ALT_BITSTREAM_READER code does not work on SPARC, because the code accesses
jkeil
parents: 4053
diff changeset
30 #else
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
31 // alternative (faster) bitstram reader (reades upto 3 bytes over the end of the input)
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
32 #define ALT_BITSTREAM_READER
10082
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
33
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
34 /* used to avoid missaligned exceptions on some archs (alpha, ...) */
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
35 #ifdef ARCH_X86
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
36 # define unaligned32(a) (*(uint32_t*)(a))
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
37 #else
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
38 # ifdef __GNUC__
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
39 static inline uint32_t unaligned32(const void *v) {
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
40 struct Unaligned {
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
41 uint32_t i;
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
42 } __attribute__((packed));
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
43
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
44 return ((const struct Unaligned *) v)->i;
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
45 }
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
46 # elif defined(__DECC)
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
47 static inline uint32_t unaligned32(const void *v) {
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
48 return *(const __unaligned uint32_t *) v;
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
49 }
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
50 # else
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
51 static inline uint32_t unaligned32(const void *v) {
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
52 return *(const uint32_t *) v;
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
53 }
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
54 # endif
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
55 #endif //!ARCH_X86
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
56
7255
34b5a0b12558 The ALT_BITSTREAM_READER code does not work on SPARC, because the code accesses
jkeil
parents: 4053
diff changeset
57 #endif
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
58
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
59 /* (stolen from the kernel) */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
60 #ifdef WORDS_BIGENDIAN
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
61
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
62 # define swab32(x) (x)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
63
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
64 #else
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
65
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
66 # if defined (__i386__)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
67
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
68 # define swab32(x) __i386_swab32(x)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
69 static inline const uint32_t __i386_swab32(uint32_t x)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
70 {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
71 __asm__("bswap %0" : "=r" (x) : "0" (x));
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
72 return x;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
73 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
74
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
75 # else
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
76
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
77 # define swab32(x)\
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
78 ((((uint8_t*)&x)[0] << 24) | (((uint8_t*)&x)[1] << 16) | \
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
79 (((uint8_t*)&x)[2] << 8) | (((uint8_t*)&x)[3]))
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
80
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
81 # endif
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
82 #endif
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
83
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
84 #ifdef ALT_BITSTREAM_READER
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
85 extern uint32_t *buffer_start;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
86 extern int indx;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
87 #else
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
88 extern uint32_t bits_left;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
89 extern uint32_t current_word;
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
90 #endif
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
91
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
92 void bitstream_set_ptr (uint8_t * buf);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
93 uint32_t bitstream_get_bh(uint32_t num_bits);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
94 int32_t bitstream_get_bh_2(uint32_t num_bits);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
95
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
96
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
97 static inline uint32_t
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
98 bitstream_get(uint32_t num_bits) // note num_bits is practically a constant due to inlineing
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
99 {
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
100 #ifdef ALT_BITSTREAM_READER
10082
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
101 uint32_t result= swab32( unaligned32(((uint8_t *)buffer_start)+(indx>>3)) );
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
102
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
103 result<<= (indx&0x07);
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
104 result>>= 32 - num_bits;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
105 indx+= num_bits;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
106
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
107 return result;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
108 #else
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
109 uint32_t result;
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
110
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
111 if(num_bits < bits_left) {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
112 result = (current_word << (32 - bits_left)) >> (32 - num_bits);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
113 bits_left -= num_bits;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
114 return result;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
115 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
116
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
117 return bitstream_get_bh(num_bits);
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
118 #endif
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
119 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
120
4053
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
121 static inline void bitstream_skip(int num_bits)
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
122 {
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
123 #ifdef ALT_BITSTREAM_READER
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
124 indx+= num_bits;
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
125 #else
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
126 bitstream_get(num_bits);
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
127 #endif
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
128 }
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
129
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
130 static inline int32_t
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
131 bitstream_get_2(uint32_t num_bits)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
132 {
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
133 #ifdef ALT_BITSTREAM_READER
10082
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
134 int32_t result= swab32( unaligned32(((uint8_t *)buffer_start)+(indx>>3)) );
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
135
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
136 result<<= (indx&0x07);
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
137 result>>= 32 - num_bits;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
138 indx+= num_bits;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
139
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
140 return result;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
141 #else
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
142 int32_t result;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
143
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
144 if(num_bits < bits_left) {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
145 result = (((int32_t)current_word) << (32 - bits_left)) >> (32 - num_bits);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
146 bits_left -= num_bits;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
147 return result;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
148 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
149
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
150 return bitstream_get_bh_2(num_bits);
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
151 #endif
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
152 }