Mercurial > audlegacy-plugins
comparison src/ffmpeg/libffwma/bswap.h @ 806:74abcb9cafae trunk
[svn] - fork wma plugin
author | nenolod |
---|---|
date | Mon, 12 Mar 2007 10:59:21 -0700 |
parents | src/wma/libffwma/bswap.h@3da1b8942b8b |
children |
comparison
equal
deleted
inserted
replaced
805:1ba5f86aeac9 | 806:74abcb9cafae |
---|---|
1 /** | |
2 * @file bswap.h | |
3 * byte swap. | |
4 */ | |
5 | |
6 #ifndef __BSWAP_H__ | |
7 #define __BSWAP_H__ | |
8 | |
9 #ifdef HAVE_BYTESWAP_H | |
10 #include <byteswap.h> | |
11 #else | |
12 | |
13 #ifdef ARCH_X86 | |
14 static inline unsigned short ByteSwap16(unsigned short x) | |
15 { | |
16 __asm("xchgb %b0,%h0" : | |
17 "=q" (x) : | |
18 "0" (x)); | |
19 return x; | |
20 } | |
21 #define bswap_16(x) ByteSwap16(x) | |
22 | |
23 static inline unsigned int ByteSwap32(unsigned int x) | |
24 { | |
25 #if __CPU__ > 386 | |
26 __asm("bswap %0": | |
27 "=r" (x) : | |
28 #else | |
29 __asm("xchgb %b0,%h0\n" | |
30 " rorl $16,%0\n" | |
31 " xchgb %b0,%h0": | |
32 "=q" (x) : | |
33 #endif | |
34 "0" (x)); | |
35 return x; | |
36 } | |
37 #define bswap_32(x) ByteSwap32(x) | |
38 | |
39 static inline unsigned long long int ByteSwap64(unsigned long long int x) | |
40 { | |
41 register union { __extension__ uint64_t __ll; | |
42 uint32_t __l[2]; } __x; | |
43 asm("xchgl %0,%1": | |
44 "=r"(__x.__l[0]),"=r"(__x.__l[1]): | |
45 "0"(bswap_32((unsigned long)x)),"1"(bswap_32((unsigned long)(x>>32)))); | |
46 return __x.__ll; | |
47 } | |
48 #define bswap_64(x) ByteSwap64(x) | |
49 | |
50 #elif defined(ARCH_SH4) | |
51 | |
52 static inline uint16_t ByteSwap16(uint16_t x) { | |
53 __asm__("swap.b %0,%0":"=r"(x):"0"(x)); | |
54 return x; | |
55 } | |
56 | |
57 static inline uint32_t ByteSwap32(uint32_t x) { | |
58 __asm__( | |
59 "swap.b %0,%0\n" | |
60 "swap.w %0,%0\n" | |
61 "swap.b %0,%0\n" | |
62 :"=r"(x):"0"(x)); | |
63 return x; | |
64 } | |
65 | |
66 #define bswap_16(x) ByteSwap16(x) | |
67 #define bswap_32(x) ByteSwap32(x) | |
68 | |
69 static inline uint64_t ByteSwap64(uint64_t x) | |
70 { | |
71 union { | |
72 uint64_t ll; | |
73 struct { | |
74 uint32_t l,h; | |
75 } l; | |
76 } r; | |
77 r.l.l = bswap_32 (x); | |
78 r.l.h = bswap_32 (x>>32); | |
79 return r.ll; | |
80 } | |
81 #define bswap_64(x) ByteSwap64(x) | |
82 | |
83 #else | |
84 | |
85 #define bswap_16(x) (((x) & 0x00ff) << 8 | ((x) & 0xff00) >> 8) | |
86 | |
87 | |
88 // code from bits/byteswap.h (C) 1997, 1998 Free Software Foundation, Inc. | |
89 #define bswap_32(x) \ | |
90 ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \ | |
91 (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)) | |
92 | |
93 static inline uint64_t ByteSwap64(uint64_t x) | |
94 { | |
95 union { | |
96 uint64_t ll; | |
97 uint32_t l[2]; | |
98 } w, r; | |
99 w.ll = x; | |
100 r.l[0] = bswap_32 (w.l[1]); | |
101 r.l[1] = bswap_32 (w.l[0]); | |
102 return r.ll; | |
103 } | |
104 #define bswap_64(x) ByteSwap64(x) | |
105 | |
106 #endif /* !ARCH_X86 */ | |
107 | |
108 #endif /* !HAVE_BYTESWAP_H */ | |
109 | |
110 // be2me ... BigEndian to MachineEndian | |
111 // le2me ... LittleEndian to MachineEndian | |
112 | |
113 #ifdef WORDS_BIGENDIAN | |
114 #define be2me_16(x) (x) | |
115 #define be2me_32(x) (x) | |
116 #define be2me_64(x) (x) | |
117 #define le2me_16(x) bswap_16(x) | |
118 #define le2me_32(x) bswap_32(x) | |
119 #define le2me_64(x) bswap_64(x) | |
120 #else | |
121 #define be2me_16(x) bswap_16(x) | |
122 #define be2me_32(x) bswap_32(x) | |
123 #define be2me_64(x) bswap_64(x) | |
124 #define le2me_16(x) (x) | |
125 #define le2me_32(x) (x) | |
126 #define le2me_64(x) (x) | |
127 #endif | |
128 | |
129 #endif /* __BSWAP_H__ */ | |
130 | |
131 #ifndef BSWAP_H_INCLUDED | |
132 #define BSWAP_H_INCLUDED | |
133 | |
134 /* | |
135 * Copyright (C) 2004 Maciej Katafiasz <mathrick@users.sourceforge.net> | |
136 * | |
137 * | |
138 * This program is free software; you can redistribute it and/or modify | |
139 * it under the terms of the GNU Library General Public License as published by | |
140 * the Free Software Foundation; either version 2 of the License, or | |
141 * (at your option) any later version. | |
142 * | |
143 * This program is distributed in the hope that it will be useful, | |
144 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
145 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
146 * GNU General Public License for more details. | |
147 * | |
148 * You should have received a copy of the GNU General Public License | |
149 * along with this program; if not, write to the Free Software | |
150 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
151 */ | |
152 | |
153 | |
154 /* Go cheap now, will rip out glib later. *Sigh* */ | |
155 #include <glib.h> | |
156 | |
157 /* NOTE: | |
158 * Now, to clear up confusion: LE_XX means "from LE to native, XX bits wide" | |
159 * I know it's not very clear naming (tell me about it, I | |
160 * misinterpreted in first version and caused bad nasty bug, *sigh*), | |
161 * but that's inherited code, will clean up as things go | |
162 * Oh, and one more thing -- they take *pointers*, not actual ints | |
163 */ | |
164 | |
165 #define LE_16(val) (GINT16_FROM_LE (*((u_int16_t*)(val)))) | |
166 #define BE_16(val) (GINT16_FROM_BE (*((u_int16_t*)(val)))) | |
167 #define LE_32(val) (GINT32_FROM_LE (*((u_int32_t*)(val)))) | |
168 #define BE_32(val) (GINT32_FROM_BE (*((u_int32_t*)(val)))) | |
169 | |
170 #define LE_64(val) (GINT64_FROM_LE (*((u_int64_t*)(val)))) | |
171 #define BE_64(val) (GINT64_FROM_BE (*((u_int64_t*)(val)))) | |
172 | |
173 #endif /* BSWAP_H_INCLUDED */ |