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