Mercurial > libavutil.hg
annotate intreadwrite.h @ 735:92180cbccda6 libavutil
Move ALIGN macro to libavutil/common.h and use it in various places
author | conrad |
---|---|
date | Fri, 22 May 2009 21:32:13 +0000 |
parents | 753953ed8ff0 |
children | 03f6641ce9e5 |
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" | |
729 | 34 #elif ARCH_PPC |
35 # include "ppc/intreadwrite.h" | |
728 | 36 #endif |
727 | 37 |
38 /* | |
39 * Define AV_[RW]N helper macros to simplify definitions not provided | |
40 * by per-arch headers. | |
41 */ | |
42 | |
43 #if defined(__GNUC__) | |
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
44 |
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
45 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
|
46 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
|
47 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
|
48 |
727 | 49 # define AV_RN(s, p) (((const struct unaligned_##s *) (p))->l) |
50 # 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
|
51 |
525
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
52 #elif defined(__DECC) |
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
53 |
727 | 54 # define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) |
55 # 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
|
56 |
727 | 57 #elif HAVE_FAST_UNALIGNED |
58 | |
59 # define AV_RN(s, p) (*((const uint##s##_t*)(p))) | |
60 # 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
|
61 |
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
62 #else |
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
63 |
727 | 64 #ifndef AV_RB16 |
65 #define AV_RB16(x) ((((const uint8_t*)(x))[0] << 8) | \ | |
66 ((const uint8_t*)(x))[1]) | |
67 #endif | |
68 #ifndef AV_WB16 | |
336 | 69 #define AV_WB16(p, d) do { \ |
235 | 70 ((uint8_t*)(p))[1] = (d); \ |
336 | 71 ((uint8_t*)(p))[0] = (d)>>8; } while(0) |
727 | 72 #endif |
232
9845a508ffbd
add AV_WB/WL for lswriting, similar to AV_RB/RL (also increment version)
alex
parents:
231
diff
changeset
|
73 |
727 | 74 #ifndef AV_RL16 |
444 | 75 #define AV_RL16(x) ((((const uint8_t*)(x))[1] << 8) | \ |
76 ((const uint8_t*)(x))[0]) | |
727 | 77 #endif |
78 #ifndef AV_WL16 | |
336 | 79 #define AV_WL16(p, d) do { \ |
326
46b4da5bf9ed
cosmetics: Reorder endianness macros by bit depth, alignment prettyprinting.
diego
parents:
282
diff
changeset
|
80 ((uint8_t*)(p))[0] = (d); \ |
336 | 81 ((uint8_t*)(p))[1] = (d)>>8; } while(0) |
727 | 82 #endif |
326
46b4da5bf9ed
cosmetics: Reorder endianness macros by bit depth, alignment prettyprinting.
diego
parents:
282
diff
changeset
|
83 |
727 | 84 #ifndef AV_RB32 |
444 | 85 #define AV_RB32(x) ((((const uint8_t*)(x))[0] << 24) | \ |
86 (((const uint8_t*)(x))[1] << 16) | \ | |
87 (((const uint8_t*)(x))[2] << 8) | \ | |
88 ((const uint8_t*)(x))[3]) | |
727 | 89 #endif |
90 #ifndef AV_WB32 | |
336 | 91 #define AV_WB32(p, d) do { \ |
235 | 92 ((uint8_t*)(p))[3] = (d); \ |
93 ((uint8_t*)(p))[2] = (d)>>8; \ | |
94 ((uint8_t*)(p))[1] = (d)>>16; \ | |
336 | 95 ((uint8_t*)(p))[0] = (d)>>24; } while(0) |
727 | 96 #endif |
232
9845a508ffbd
add AV_WB/WL for lswriting, similar to AV_RB/RL (also increment version)
alex
parents:
231
diff
changeset
|
97 |
727 | 98 #ifndef AV_RL32 |
444 | 99 #define AV_RL32(x) ((((const uint8_t*)(x))[3] << 24) | \ |
100 (((const uint8_t*)(x))[2] << 16) | \ | |
101 (((const uint8_t*)(x))[1] << 8) | \ | |
102 ((const uint8_t*)(x))[0]) | |
727 | 103 #endif |
104 #ifndef AV_WL32 | |
336 | 105 #define AV_WL32(p, d) do { \ |
235 | 106 ((uint8_t*)(p))[0] = (d); \ |
107 ((uint8_t*)(p))[1] = (d)>>8; \ | |
108 ((uint8_t*)(p))[2] = (d)>>16; \ | |
336 | 109 ((uint8_t*)(p))[3] = (d)>>24; } while(0) |
727 | 110 #endif |
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
111 |
727 | 112 #ifndef AV_RB64 |
444 | 113 #define AV_RB64(x) (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ |
114 ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ | |
115 ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ | |
116 ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ | |
117 ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ | |
118 ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ | |
119 ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ | |
120 (uint64_t)((const uint8_t*)(x))[7]) | |
727 | 121 #endif |
122 #ifndef AV_WB64 | |
336 | 123 #define AV_WB64(p, d) do { \ |
335 | 124 ((uint8_t*)(p))[7] = (d); \ |
125 ((uint8_t*)(p))[6] = (d)>>8; \ | |
126 ((uint8_t*)(p))[5] = (d)>>16; \ | |
127 ((uint8_t*)(p))[4] = (d)>>24; \ | |
128 ((uint8_t*)(p))[3] = (d)>>32; \ | |
129 ((uint8_t*)(p))[2] = (d)>>40; \ | |
130 ((uint8_t*)(p))[1] = (d)>>48; \ | |
336 | 131 ((uint8_t*)(p))[0] = (d)>>56; } while(0) |
727 | 132 #endif |
335 | 133 |
727 | 134 #ifndef AV_RL64 |
444 | 135 #define AV_RL64(x) (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ |
136 ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ | |
137 ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ | |
138 ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ | |
139 ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ | |
140 ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ | |
141 ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ | |
142 (uint64_t)((const uint8_t*)(x))[0]) | |
727 | 143 #endif |
144 #ifndef AV_WL64 | |
336 | 145 #define AV_WL64(p, d) do { \ |
335 | 146 ((uint8_t*)(p))[0] = (d); \ |
147 ((uint8_t*)(p))[1] = (d)>>8; \ | |
148 ((uint8_t*)(p))[2] = (d)>>16; \ | |
149 ((uint8_t*)(p))[3] = (d)>>24; \ | |
150 ((uint8_t*)(p))[4] = (d)>>32; \ | |
151 ((uint8_t*)(p))[5] = (d)>>40; \ | |
152 ((uint8_t*)(p))[6] = (d)>>48; \ | |
336 | 153 ((uint8_t*)(p))[7] = (d)>>56; } while(0) |
727 | 154 #endif |
155 | |
156 #ifdef WORDS_BIGENDIAN | |
157 # define AV_RN(s, p) AV_RB##s(p) | |
158 # define AV_WN(s, p, v) AV_WB##s(p, v) | |
159 #else | |
160 # define AV_RN(s, p) AV_RL##s(p) | |
161 # define AV_WN(s, p, v) AV_WL##s(p, v) | |
162 #endif | |
163 | |
164 #endif /* HAVE_FAST_UNALIGNED */ | |
165 | |
166 #ifndef AV_RN16 | |
167 # define AV_RN16(p) AV_RN(16, p) | |
168 #endif | |
169 | |
170 #ifndef AV_RN32 | |
171 # define AV_RN32(p) AV_RN(32, p) | |
172 #endif | |
173 | |
174 #ifndef AV_RN64 | |
175 # define AV_RN64(p) AV_RN(64, p) | |
176 #endif | |
177 | |
178 #ifndef AV_WN16 | |
179 # define AV_WN16(p, v) AV_WN(16, p, v) | |
180 #endif | |
181 | |
182 #ifndef AV_WN32 | |
183 # define AV_WN32(p, v) AV_WN(32, p, v) | |
184 #endif | |
185 | |
186 #ifndef AV_WN64 | |
187 # define AV_WN64(p, v) AV_WN(64, p, v) | |
188 #endif | |
189 | |
190 #ifdef WORDS_BIGENDIAN | |
191 # define AV_RB(s, p) AV_RN(s, p) | |
192 # define AV_WB(s, p, v) AV_WN(s, p, v) | |
193 # define AV_RL(s, p) bswap_##s(AV_RN(s, p)) | |
194 # define AV_WL(s, p, v) AV_WN(s, p, bswap_##s(v)) | |
195 #else | |
196 # define AV_RB(s, p) bswap_##s(AV_RN(s, p)) | |
197 # define AV_WB(s, p, v) AV_WN(s, p, bswap_##s(v)) | |
198 # define AV_RL(s, p) AV_RN(s, p) | |
199 # define AV_WL(s, p, v) AV_WN(s, p, v) | |
200 #endif | |
201 | |
202 #define AV_RB8(x) (((const uint8_t*)(x))[0]) | |
203 #define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) | |
204 | |
205 #define AV_RL8(x) AV_RB8(x) | |
206 #define AV_WL8(p, d) AV_WB8(p, d) | |
207 | |
208 #ifndef AV_RB16 | |
209 # define AV_RB16(p) AV_RB(16, p) | |
210 #endif | |
211 #ifndef AV_WB16 | |
212 # define AV_WB16(p, v) AV_WB(16, p, v) | |
213 #endif | |
214 | |
215 #ifndef AV_RL16 | |
216 # define AV_RL16(p) AV_RL(16, p) | |
217 #endif | |
218 #ifndef AV_WL16 | |
219 # define AV_WL16(p, v) AV_WL(16, p, v) | |
220 #endif | |
221 | |
222 #ifndef AV_RB32 | |
223 # define AV_RB32(p) AV_RB(32, p) | |
224 #endif | |
225 #ifndef AV_WB32 | |
226 # define AV_WB32(p, v) AV_WB(32, p, v) | |
227 #endif | |
228 | |
229 #ifndef AV_RL32 | |
230 # define AV_RL32(p) AV_RL(32, p) | |
231 #endif | |
232 #ifndef AV_WL32 | |
233 # define AV_WL32(p, v) AV_WL(32, p, v) | |
234 #endif | |
235 | |
236 #ifndef AV_RB64 | |
237 # define AV_RB64(p) AV_RB(64, p) | |
238 #endif | |
239 #ifndef AV_WB64 | |
240 # define AV_WB64(p, v) AV_WB(64, p, v) | |
241 #endif | |
242 | |
243 #ifndef AV_RL64 | |
244 # define AV_RL64(p) AV_RL(64, p) | |
245 #endif | |
246 #ifndef AV_WL64 | |
247 # define AV_WL64(p, v) AV_WL(64, p, v) | |
248 #endif | |
524 | 249 |
250 #define AV_RB24(x) ((((const uint8_t*)(x))[0] << 16) | \ | |
251 (((const uint8_t*)(x))[1] << 8) | \ | |
252 ((const uint8_t*)(x))[2]) | |
253 #define AV_WB24(p, d) do { \ | |
254 ((uint8_t*)(p))[2] = (d); \ | |
255 ((uint8_t*)(p))[1] = (d)>>8; \ | |
256 ((uint8_t*)(p))[0] = (d)>>16; } while(0) | |
257 | |
258 #define AV_RL24(x) ((((const uint8_t*)(x))[2] << 16) | \ | |
259 (((const uint8_t*)(x))[1] << 8) | \ | |
260 ((const uint8_t*)(x))[0]) | |
261 #define AV_WL24(p, d) do { \ | |
262 ((uint8_t*)(p))[0] = (d); \ | |
263 ((uint8_t*)(p))[1] = (d)>>8; \ | |
264 ((uint8_t*)(p))[2] = (d)>>16; } while(0) | |
335 | 265 |
567 | 266 #endif /* AVUTIL_INTREADWRITE_H */ |