Mercurial > libavutil.hg
annotate intreadwrite.h @ 762:839b4855bb03 libavutil
Define INFINITIY and NAN in mathematics.h if missing
author | mru |
---|---|
date | Mon, 10 Aug 2009 01:27:27 +0000 |
parents | 22a58fc2125d |
children | 2ddfead60392 |
rev | line source |
---|---|
263 | 1 /* |
2 * This file is part of FFmpeg. | |
3 * | |
4 * FFmpeg is free software; you can redistribute it and/or | |
5 * modify it under the terms of the GNU Lesser General Public | |
6 * License as published by the Free Software Foundation; either | |
7 * version 2.1 of the License, or (at your option) any later version. | |
8 * | |
9 * FFmpeg is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 * Lesser General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU Lesser General Public | |
15 * License along with FFmpeg; if not, write to the Free Software | |
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
17 */ | |
18 | |
567 | 19 #ifndef AVUTIL_INTREADWRITE_H |
20 #define AVUTIL_INTREADWRITE_H | |
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
21 |
343 | 22 #include <stdint.h> |
469 | 23 #include "config.h" |
350
c2034e89e9a2
intreadwrite.h needs bswap.h if HAVE_FAST_UNALIGNED is set, so include it.
reimar
parents:
343
diff
changeset
|
24 #include "bswap.h" |
343 | 25 |
727 | 26 /* |
27 * Arch-specific headers can provide any combination of | |
28 * AV_[RW][BLN](16|32|64) macros. Preprocessor symbols must be | |
29 * defined, even if these are implemented as inline functions. | |
30 */ | |
31 | |
728 | 32 #if ARCH_ARM |
33 # include "arm/intreadwrite.h" | |
737 | 34 #elif ARCH_MIPS |
35 # include "mips/intreadwrite.h" | |
729 | 36 #elif ARCH_PPC |
37 # include "ppc/intreadwrite.h" | |
728 | 38 #endif |
727 | 39 |
40 /* | |
41 * Define AV_[RW]N helper macros to simplify definitions not provided | |
42 * by per-arch headers. | |
43 */ | |
44 | |
757 | 45 #if HAVE_ATTRIBUTE_PACKED |
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
46 |
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
47 struct unaligned_64 { uint64_t l; } __attribute__((packed)); |
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
48 struct unaligned_32 { uint32_t l; } __attribute__((packed)); |
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
49 struct unaligned_16 { uint16_t l; } __attribute__((packed)); |
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
50 |
727 | 51 # define AV_RN(s, p) (((const struct unaligned_##s *) (p))->l) |
52 # define AV_WN(s, p, v) (((struct unaligned_##s *) (p))->l) = (v) | |
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
53 |
525
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
54 #elif defined(__DECC) |
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
55 |
727 | 56 # define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) |
57 # define AV_WN(s, p, v) *((__unaligned uint##s##_t*)(p)) = (v) | |
525
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
58 |
727 | 59 #elif HAVE_FAST_UNALIGNED |
60 | |
61 # define AV_RN(s, p) (*((const uint##s##_t*)(p))) | |
62 # define AV_WN(s, p, v) *((uint##s##_t*)(p)) = (v) | |
525
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
63 |
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
64 #else |
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
65 |
727 | 66 #ifndef AV_RB16 |
67 #define AV_RB16(x) ((((const uint8_t*)(x))[0] << 8) | \ | |
68 ((const uint8_t*)(x))[1]) | |
69 #endif | |
70 #ifndef AV_WB16 | |
336 | 71 #define AV_WB16(p, d) do { \ |
235 | 72 ((uint8_t*)(p))[1] = (d); \ |
336 | 73 ((uint8_t*)(p))[0] = (d)>>8; } while(0) |
727 | 74 #endif |
232
9845a508ffbd
add AV_WB/WL for lswriting, similar to AV_RB/RL (also increment version)
alex
parents:
231
diff
changeset
|
75 |
727 | 76 #ifndef AV_RL16 |
444 | 77 #define AV_RL16(x) ((((const uint8_t*)(x))[1] << 8) | \ |
78 ((const uint8_t*)(x))[0]) | |
727 | 79 #endif |
80 #ifndef AV_WL16 | |
336 | 81 #define AV_WL16(p, d) do { \ |
326
46b4da5bf9ed
cosmetics: Reorder endianness macros by bit depth, alignment prettyprinting.
diego
parents:
282
diff
changeset
|
82 ((uint8_t*)(p))[0] = (d); \ |
336 | 83 ((uint8_t*)(p))[1] = (d)>>8; } while(0) |
727 | 84 #endif |
326
46b4da5bf9ed
cosmetics: Reorder endianness macros by bit depth, alignment prettyprinting.
diego
parents:
282
diff
changeset
|
85 |
727 | 86 #ifndef AV_RB32 |
444 | 87 #define AV_RB32(x) ((((const uint8_t*)(x))[0] << 24) | \ |
88 (((const uint8_t*)(x))[1] << 16) | \ | |
89 (((const uint8_t*)(x))[2] << 8) | \ | |
90 ((const uint8_t*)(x))[3]) | |
727 | 91 #endif |
92 #ifndef AV_WB32 | |
336 | 93 #define AV_WB32(p, d) do { \ |
235 | 94 ((uint8_t*)(p))[3] = (d); \ |
95 ((uint8_t*)(p))[2] = (d)>>8; \ | |
96 ((uint8_t*)(p))[1] = (d)>>16; \ | |
336 | 97 ((uint8_t*)(p))[0] = (d)>>24; } while(0) |
727 | 98 #endif |
232
9845a508ffbd
add AV_WB/WL for lswriting, similar to AV_RB/RL (also increment version)
alex
parents:
231
diff
changeset
|
99 |
727 | 100 #ifndef AV_RL32 |
444 | 101 #define AV_RL32(x) ((((const uint8_t*)(x))[3] << 24) | \ |
102 (((const uint8_t*)(x))[2] << 16) | \ | |
103 (((const uint8_t*)(x))[1] << 8) | \ | |
104 ((const uint8_t*)(x))[0]) | |
727 | 105 #endif |
106 #ifndef AV_WL32 | |
336 | 107 #define AV_WL32(p, d) do { \ |
235 | 108 ((uint8_t*)(p))[0] = (d); \ |
109 ((uint8_t*)(p))[1] = (d)>>8; \ | |
110 ((uint8_t*)(p))[2] = (d)>>16; \ | |
336 | 111 ((uint8_t*)(p))[3] = (d)>>24; } while(0) |
727 | 112 #endif |
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
113 |
727 | 114 #ifndef AV_RB64 |
444 | 115 #define AV_RB64(x) (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ |
116 ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ | |
117 ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ | |
118 ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ | |
119 ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ | |
120 ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ | |
121 ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ | |
122 (uint64_t)((const uint8_t*)(x))[7]) | |
727 | 123 #endif |
124 #ifndef AV_WB64 | |
336 | 125 #define AV_WB64(p, d) do { \ |
335 | 126 ((uint8_t*)(p))[7] = (d); \ |
127 ((uint8_t*)(p))[6] = (d)>>8; \ | |
128 ((uint8_t*)(p))[5] = (d)>>16; \ | |
129 ((uint8_t*)(p))[4] = (d)>>24; \ | |
130 ((uint8_t*)(p))[3] = (d)>>32; \ | |
131 ((uint8_t*)(p))[2] = (d)>>40; \ | |
132 ((uint8_t*)(p))[1] = (d)>>48; \ | |
336 | 133 ((uint8_t*)(p))[0] = (d)>>56; } while(0) |
727 | 134 #endif |
335 | 135 |
727 | 136 #ifndef AV_RL64 |
444 | 137 #define AV_RL64(x) (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ |
138 ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ | |
139 ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ | |
140 ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ | |
141 ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ | |
142 ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ | |
143 ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ | |
144 (uint64_t)((const uint8_t*)(x))[0]) | |
727 | 145 #endif |
146 #ifndef AV_WL64 | |
336 | 147 #define AV_WL64(p, d) do { \ |
335 | 148 ((uint8_t*)(p))[0] = (d); \ |
149 ((uint8_t*)(p))[1] = (d)>>8; \ | |
150 ((uint8_t*)(p))[2] = (d)>>16; \ | |
151 ((uint8_t*)(p))[3] = (d)>>24; \ | |
152 ((uint8_t*)(p))[4] = (d)>>32; \ | |
153 ((uint8_t*)(p))[5] = (d)>>40; \ | |
154 ((uint8_t*)(p))[6] = (d)>>48; \ | |
336 | 155 ((uint8_t*)(p))[7] = (d)>>56; } while(0) |
727 | 156 #endif |
157 | |
758 | 158 #if HAVE_BIGENDIAN |
727 | 159 # define AV_RN(s, p) AV_RB##s(p) |
160 # define AV_WN(s, p, v) AV_WB##s(p, v) | |
161 #else | |
162 # define AV_RN(s, p) AV_RL##s(p) | |
163 # define AV_WN(s, p, v) AV_WL##s(p, v) | |
164 #endif | |
165 | |
166 #endif /* HAVE_FAST_UNALIGNED */ | |
167 | |
168 #ifndef AV_RN16 | |
169 # define AV_RN16(p) AV_RN(16, p) | |
170 #endif | |
171 | |
172 #ifndef AV_RN32 | |
173 # define AV_RN32(p) AV_RN(32, p) | |
174 #endif | |
175 | |
176 #ifndef AV_RN64 | |
177 # define AV_RN64(p) AV_RN(64, p) | |
178 #endif | |
179 | |
180 #ifndef AV_WN16 | |
181 # define AV_WN16(p, v) AV_WN(16, p, v) | |
182 #endif | |
183 | |
184 #ifndef AV_WN32 | |
185 # define AV_WN32(p, v) AV_WN(32, p, v) | |
186 #endif | |
187 | |
188 #ifndef AV_WN64 | |
189 # define AV_WN64(p, v) AV_WN(64, p, v) | |
190 #endif | |
191 | |
758 | 192 #if HAVE_BIGENDIAN |
727 | 193 # define AV_RB(s, p) AV_RN(s, p) |
194 # define AV_WB(s, p, v) AV_WN(s, p, v) | |
195 # define AV_RL(s, p) bswap_##s(AV_RN(s, p)) | |
196 # define AV_WL(s, p, v) AV_WN(s, p, bswap_##s(v)) | |
197 #else | |
198 # define AV_RB(s, p) bswap_##s(AV_RN(s, p)) | |
199 # define AV_WB(s, p, v) AV_WN(s, p, bswap_##s(v)) | |
200 # define AV_RL(s, p) AV_RN(s, p) | |
201 # define AV_WL(s, p, v) AV_WN(s, p, v) | |
202 #endif | |
203 | |
204 #define AV_RB8(x) (((const uint8_t*)(x))[0]) | |
205 #define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) | |
206 | |
207 #define AV_RL8(x) AV_RB8(x) | |
208 #define AV_WL8(p, d) AV_WB8(p, d) | |
209 | |
210 #ifndef AV_RB16 | |
211 # define AV_RB16(p) AV_RB(16, p) | |
212 #endif | |
213 #ifndef AV_WB16 | |
214 # define AV_WB16(p, v) AV_WB(16, p, v) | |
215 #endif | |
216 | |
217 #ifndef AV_RL16 | |
218 # define AV_RL16(p) AV_RL(16, p) | |
219 #endif | |
220 #ifndef AV_WL16 | |
221 # define AV_WL16(p, v) AV_WL(16, p, v) | |
222 #endif | |
223 | |
224 #ifndef AV_RB32 | |
225 # define AV_RB32(p) AV_RB(32, p) | |
226 #endif | |
227 #ifndef AV_WB32 | |
228 # define AV_WB32(p, v) AV_WB(32, p, v) | |
229 #endif | |
230 | |
231 #ifndef AV_RL32 | |
232 # define AV_RL32(p) AV_RL(32, p) | |
233 #endif | |
234 #ifndef AV_WL32 | |
235 # define AV_WL32(p, v) AV_WL(32, p, v) | |
236 #endif | |
237 | |
238 #ifndef AV_RB64 | |
239 # define AV_RB64(p) AV_RB(64, p) | |
240 #endif | |
241 #ifndef AV_WB64 | |
242 # define AV_WB64(p, v) AV_WB(64, p, v) | |
243 #endif | |
244 | |
245 #ifndef AV_RL64 | |
246 # define AV_RL64(p) AV_RL(64, p) | |
247 #endif | |
248 #ifndef AV_WL64 | |
249 # define AV_WL64(p, v) AV_WL(64, p, v) | |
250 #endif | |
524 | 251 |
252 #define AV_RB24(x) ((((const uint8_t*)(x))[0] << 16) | \ | |
253 (((const uint8_t*)(x))[1] << 8) | \ | |
254 ((const uint8_t*)(x))[2]) | |
255 #define AV_WB24(p, d) do { \ | |
256 ((uint8_t*)(p))[2] = (d); \ | |
257 ((uint8_t*)(p))[1] = (d)>>8; \ | |
258 ((uint8_t*)(p))[0] = (d)>>16; } while(0) | |
259 | |
260 #define AV_RL24(x) ((((const uint8_t*)(x))[2] << 16) | \ | |
261 (((const uint8_t*)(x))[1] << 8) | \ | |
262 ((const uint8_t*)(x))[0]) | |
263 #define AV_WL24(p, d) do { \ | |
264 ((uint8_t*)(p))[0] = (d); \ | |
265 ((uint8_t*)(p))[1] = (d)>>8; \ | |
266 ((uint8_t*)(p))[2] = (d)>>16; } while(0) | |
335 | 267 |
567 | 268 #endif /* AVUTIL_INTREADWRITE_H */ |