annotate liba52/bitstream.h @ 11810:8cce53dd235f

Have the MOV demuxer recognize and display (via MPINFO) registered ISO and other major brands instead of the usual "Unknown major brand" from only having "isom" defined. patch by Shan <sweber@slingshot.co.nz>, approved by Alex
author diego
date Tue, 20 Jan 2004 04:59:48 +0000
parents b7a6edb6100e
children 07f1e7669772
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
10489
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
24 /* code from ffmpeg/libavcodec */
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
25 #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC_ == 3 && __GNUC_MINOR__ > 0)
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
26 # define always_inline __attribute__((always_inline)) inline
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
27 #else
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
28 # define always_inline inline
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
29 #endif
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
30
10067
f9eac474eb74 this is a important patch for hpux 11.00, because it avoid the
diego
parents: 7255
diff changeset
31 #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
32 /*
34b5a0b12558 The ALT_BITSTREAM_READER code does not work on SPARC, because the code accesses
jkeil
parents: 4053
diff changeset
33 * 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
34 * 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
35 */
34b5a0b12558 The ALT_BITSTREAM_READER code does not work on SPARC, because the code accesses
jkeil
parents: 4053
diff changeset
36 #undef ALT_BITSTREAM_READER
34b5a0b12558 The ALT_BITSTREAM_READER code does not work on SPARC, because the code accesses
jkeil
parents: 4053
diff changeset
37 #else
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
38 // 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
39 #define ALT_BITSTREAM_READER
10082
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
40
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
41 /* used to avoid missaligned exceptions on some archs (alpha, ...) */
10313
b479b224d435 arm support by armin.gerritsen@philips.com (also seen a patch like this on openzaurus' mplayer port)
alex
parents: 10082
diff changeset
42 #if defined (ARCH_X86) || defined(ARCH_ARMV4L)
10082
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
43 # define unaligned32(a) (*(uint32_t*)(a))
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
44 #else
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
45 # ifdef __GNUC__
10489
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
46 static always_inline uint32_t unaligned32(const void *v) {
10082
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
47 struct Unaligned {
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
48 uint32_t i;
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
49 } __attribute__((packed));
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
50
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
51 return ((const struct Unaligned *) v)->i;
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
52 }
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
53 # elif defined(__DECC)
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
54 static inline uint32_t unaligned32(const void *v) {
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
55 return *(const __unaligned uint32_t *) v;
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
56 }
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
57 # else
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
58 static inline uint32_t unaligned32(const void *v) {
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
59 return *(const uint32_t *) v;
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
60 }
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
61 # endif
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
62 #endif //!ARCH_X86
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
63
7255
34b5a0b12558 The ALT_BITSTREAM_READER code does not work on SPARC, because the code accesses
jkeil
parents: 4053
diff changeset
64 #endif
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
65
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
66 /* (stolen from the kernel) */
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
67 #ifdef WORDS_BIGENDIAN
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
68
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
69 # define swab32(x) (x)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
70
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
71 #else
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
72
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
73 # if defined (__i386__)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
74
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
75 # define swab32(x) __i386_swab32(x)
10489
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
76 static always_inline const uint32_t __i386_swab32(uint32_t x)
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
77 {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
78 __asm__("bswap %0" : "=r" (x) : "0" (x));
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
79 return x;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
80 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
81
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
82 # else
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
83
10489
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
84 # define swab32(x) __generic_swab32(x)
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
85 static always_inline const uint32_t __generic_swab32(uint32_t x)
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
86 {
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
87 return ((((uint8_t*)&x)[0] << 24) | (((uint8_t*)&x)[1] << 16) |
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
88 (((uint8_t*)&x)[2] << 8) | (((uint8_t*)&x)[3]));
b7a6edb6100e Changed swab32 from macro to inline function, this fixes compilation on alpha (with gcc2.95). Based on patch by KotH
alex
parents: 10313
diff changeset
89 }
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
90 # endif
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
91 #endif
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
92
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
93 #ifdef ALT_BITSTREAM_READER
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
94 extern uint32_t *buffer_start;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
95 extern int indx;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
96 #else
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
97 extern uint32_t bits_left;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
98 extern uint32_t current_word;
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
99 #endif
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
100
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
101 void bitstream_set_ptr (uint8_t * buf);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
102 uint32_t bitstream_get_bh(uint32_t num_bits);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
103 int32_t bitstream_get_bh_2(uint32_t num_bits);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
104
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
105
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
106 static inline uint32_t
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
107 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
108 {
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
109 #ifdef ALT_BITSTREAM_READER
10082
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
110 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
111
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
112 result<<= (indx&0x07);
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
113 result>>= 32 - num_bits;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
114 indx+= num_bits;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
115
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
116 return result;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
117 #else
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
118 uint32_t result;
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
119
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
120 if(num_bits < bits_left) {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
121 result = (current_word << (32 - bits_left)) >> (32 - num_bits);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
122 bits_left -= num_bits;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
123 return result;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
124 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
125
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
126 return bitstream_get_bh(num_bits);
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
127 #endif
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
128 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
129
4053
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
130 static inline void bitstream_skip(int num_bits)
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
131 {
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
132 #ifdef ALT_BITSTREAM_READER
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
133 indx+= num_bits;
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
134 #else
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
135 bitstream_get(num_bits);
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
136 #endif
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
137 }
75415651e3b9 bitstream_skip() instead of bitstream_get() if possible
michael
parents: 3570
diff changeset
138
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
139 static inline int32_t
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
140 bitstream_get_2(uint32_t num_bits)
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
141 {
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
142 #ifdef ALT_BITSTREAM_READER
10082
1c95e3d5888a fixed alignment bug
michael
parents: 10067
diff changeset
143 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
144
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
145 result<<= (indx&0x07);
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
146 result>>= 32 - num_bits;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
147 indx+= num_bits;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
148
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
149 return result;
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
150 #else
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
151 int32_t result;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
152
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
153 if(num_bits < bits_left) {
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
154 result = (((int32_t)current_word) << (32 - bits_left)) >> (32 - num_bits);
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
155 bits_left -= num_bits;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
156 return result;
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
157 }
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
158
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
159 return bitstream_get_bh_2(num_bits);
3570
c03e0bb35c16 faster (and simpler) bitstream reader (in C)
michael
parents: 3394
diff changeset
160 #endif
3394
35b18ed357c2 imported from liba52 CVS
arpi
parents:
diff changeset
161 }