Commit | Line | Data |
---|---|---|
f5a90186 DB |
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 | ||
98790382 SS |
19 | #ifndef AVUTIL_INTREADWRITE_H |
20 | #define AVUTIL_INTREADWRITE_H | |
cf1e119b | 21 | |
99545457 | 22 | #include <stdint.h> |
a087028a | 23 | #include "config.h" |
c08be350 | 24 | #include "bswap.h" |
99545457 | 25 | |
a6783b89 MR |
26 | /* |
27 | * Arch-specific headers can provide any combination of | |
57c36bdc | 28 | * AV_[RW][BLN](16|24|32|64) macros. Preprocessor symbols must be |
a6783b89 MR |
29 | * defined, even if these are implemented as inline functions. |
30 | */ | |
31 | ||
3c55ce03 MR |
32 | #if ARCH_ARM |
33 | # include "arm/intreadwrite.h" | |
d691da95 MR |
34 | #elif ARCH_AVR32 |
35 | # include "avr32/intreadwrite.h" | |
530456bf MR |
36 | #elif ARCH_MIPS |
37 | # include "mips/intreadwrite.h" | |
9f5ff83f MR |
38 | #elif ARCH_PPC |
39 | # include "ppc/intreadwrite.h" | |
3c55ce03 | 40 | #endif |
a6783b89 MR |
41 | |
42 | /* | |
63826ceb MR |
43 | * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers. |
44 | */ | |
45 | ||
46 | #if HAVE_BIGENDIAN | |
47 | ||
48 | # if defined(AV_RN16) && !defined(AV_RB16) | |
49 | # define AV_RB16(p) AV_RN16(p) | |
50 | # elif !defined(AV_RN16) && defined(AV_RB16) | |
51 | # define AV_RN16(p) AV_RB16(p) | |
52 | # endif | |
53 | ||
54 | # if defined(AV_WN16) && !defined(AV_WB16) | |
55 | # define AV_WB16(p, v) AV_WN16(p, v) | |
56 | # elif !defined(AV_WN16) && defined(AV_WB16) | |
57 | # define AV_WN16(p, v) AV_WB16(p, v) | |
58 | # endif | |
59 | ||
63826ceb MR |
60 | # if defined(AV_RN24) && !defined(AV_RB24) |
61 | # define AV_RB24(p) AV_RN24(p) | |
62 | # elif !defined(AV_RN24) && defined(AV_RB24) | |
63 | # define AV_RN24(p) AV_RB24(p) | |
64 | # endif | |
65 | ||
66 | # if defined(AV_WN24) && !defined(AV_WB24) | |
67 | # define AV_WB24(p, v) AV_WN24(p, v) | |
68 | # elif !defined(AV_WN24) && defined(AV_WB24) | |
69 | # define AV_WN24(p, v) AV_WB24(p, v) | |
70 | # endif | |
71 | ||
4a051891 MR |
72 | # if defined(AV_RN32) && !defined(AV_RB32) |
73 | # define AV_RB32(p) AV_RN32(p) | |
74 | # elif !defined(AV_RN32) && defined(AV_RB32) | |
75 | # define AV_RN32(p) AV_RB32(p) | |
76 | # endif | |
77 | ||
63826ceb MR |
78 | # if defined(AV_WN32) && !defined(AV_WB32) |
79 | # define AV_WB32(p, v) AV_WN32(p, v) | |
80 | # elif !defined(AV_WN32) && defined(AV_WB32) | |
81 | # define AV_WN32(p, v) AV_WB32(p, v) | |
82 | # endif | |
83 | ||
84 | # if defined(AV_RN64) && !defined(AV_RB64) | |
85 | # define AV_RB64(p) AV_RN64(p) | |
86 | # elif !defined(AV_RN64) && defined(AV_RB64) | |
87 | # define AV_RN64(p) AV_RB64(p) | |
88 | # endif | |
89 | ||
90 | # if defined(AV_WN64) && !defined(AV_WB64) | |
91 | # define AV_WB64(p, v) AV_WN64(p, v) | |
92 | # elif !defined(AV_WN64) && defined(AV_WB64) | |
93 | # define AV_WN64(p, v) AV_WB64(p, v) | |
94 | # endif | |
95 | ||
96 | #else /* HAVE_BIGENDIAN */ | |
97 | ||
98 | # if defined(AV_RN16) && !defined(AV_RL16) | |
99 | # define AV_RL16(p) AV_RN16(p) | |
100 | # elif !defined(AV_RN16) && defined(AV_RL16) | |
101 | # define AV_RN16(p) AV_RL16(p) | |
102 | # endif | |
103 | ||
104 | # if defined(AV_WN16) && !defined(AV_WL16) | |
105 | # define AV_WL16(p, v) AV_WN16(p, v) | |
106 | # elif !defined(AV_WN16) && defined(AV_WL16) | |
107 | # define AV_WN16(p, v) AV_WL16(p, v) | |
108 | # endif | |
109 | ||
63826ceb MR |
110 | # if defined(AV_RN24) && !defined(AV_RL24) |
111 | # define AV_RL24(p) AV_RN24(p) | |
112 | # elif !defined(AV_RN24) && defined(AV_RL24) | |
113 | # define AV_RN24(p) AV_RL24(p) | |
114 | # endif | |
115 | ||
116 | # if defined(AV_WN24) && !defined(AV_WL24) | |
117 | # define AV_WL24(p, v) AV_WN24(p, v) | |
118 | # elif !defined(AV_WN24) && defined(AV_WL24) | |
119 | # define AV_WN24(p, v) AV_WL24(p, v) | |
120 | # endif | |
121 | ||
4a051891 MR |
122 | # if defined(AV_RN32) && !defined(AV_RL32) |
123 | # define AV_RL32(p) AV_RN32(p) | |
124 | # elif !defined(AV_RN32) && defined(AV_RL32) | |
125 | # define AV_RN32(p) AV_RL32(p) | |
126 | # endif | |
127 | ||
63826ceb MR |
128 | # if defined(AV_WN32) && !defined(AV_WL32) |
129 | # define AV_WL32(p, v) AV_WN32(p, v) | |
130 | # elif !defined(AV_WN32) && defined(AV_WL32) | |
131 | # define AV_WN32(p, v) AV_WL32(p, v) | |
132 | # endif | |
133 | ||
134 | # if defined(AV_RN64) && !defined(AV_RL64) | |
135 | # define AV_RL64(p) AV_RN64(p) | |
136 | # elif !defined(AV_RN64) && defined(AV_RL64) | |
137 | # define AV_RN64(p) AV_RL64(p) | |
138 | # endif | |
139 | ||
140 | # if defined(AV_WN64) && !defined(AV_WL64) | |
141 | # define AV_WL64(p, v) AV_WN64(p, v) | |
142 | # elif !defined(AV_WN64) && defined(AV_WL64) | |
143 | # define AV_WN64(p, v) AV_WL64(p, v) | |
144 | # endif | |
145 | ||
146 | #endif /* !HAVE_BIGENDIAN */ | |
147 | ||
148 | /* | |
a6783b89 MR |
149 | * Define AV_[RW]N helper macros to simplify definitions not provided |
150 | * by per-arch headers. | |
151 | */ | |
152 | ||
e7ea5e3d | 153 | #if HAVE_ATTRIBUTE_PACKED |
cf1e119b RD |
154 | |
155 | struct unaligned_64 { uint64_t l; } __attribute__((packed)); | |
156 | struct unaligned_32 { uint32_t l; } __attribute__((packed)); | |
157 | struct unaligned_16 { uint16_t l; } __attribute__((packed)); | |
158 | ||
a6783b89 | 159 | # define AV_RN(s, p) (((const struct unaligned_##s *) (p))->l) |
c2521027 | 160 | # define AV_WN(s, p, v) ((((struct unaligned_##s *) (p))->l) = (v)) |
cf1e119b | 161 | |
b7b38fb2 MR |
162 | #elif defined(__DECC) |
163 | ||
a6783b89 | 164 | # define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) |
c2521027 | 165 | # define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v)) |
fbbea48e | 166 | |
a6783b89 | 167 | #elif HAVE_FAST_UNALIGNED |
fbbea48e | 168 | |
a6783b89 | 169 | # define AV_RN(s, p) (*((const uint##s##_t*)(p))) |
c2521027 | 170 | # define AV_WN(s, p, v) (*((uint##s##_t*)(p)) = (v)) |
fbbea48e | 171 | |
a6783b89 | 172 | #else |
fbbea48e | 173 | |
a6783b89 | 174 | #ifndef AV_RB16 |
4a051891 MR |
175 | # define AV_RB16(x) \ |
176 | ((((const uint8_t*)(x))[0] << 8) | \ | |
177 | ((const uint8_t*)(x))[1]) | |
a6783b89 MR |
178 | #endif |
179 | #ifndef AV_WB16 | |
4a051891 MR |
180 | # define AV_WB16(p, d) do { \ |
181 | ((uint8_t*)(p))[1] = (d); \ | |
182 | ((uint8_t*)(p))[0] = (d)>>8; \ | |
183 | } while(0) | |
a6783b89 | 184 | #endif |
a3550abd | 185 | |
a6783b89 | 186 | #ifndef AV_RL16 |
4a051891 MR |
187 | # define AV_RL16(x) \ |
188 | ((((const uint8_t*)(x))[1] << 8) | \ | |
189 | ((const uint8_t*)(x))[0]) | |
a6783b89 MR |
190 | #endif |
191 | #ifndef AV_WL16 | |
4a051891 MR |
192 | # define AV_WL16(p, d) do { \ |
193 | ((uint8_t*)(p))[0] = (d); \ | |
194 | ((uint8_t*)(p))[1] = (d)>>8; \ | |
195 | } while(0) | |
a6783b89 | 196 | #endif |
7b829d2a | 197 | |
a6783b89 | 198 | #ifndef AV_RB32 |
4a051891 MR |
199 | # define AV_RB32(x) \ |
200 | ((((const uint8_t*)(x))[0] << 24) | \ | |
201 | (((const uint8_t*)(x))[1] << 16) | \ | |
202 | (((const uint8_t*)(x))[2] << 8) | \ | |
203 | ((const uint8_t*)(x))[3]) | |
a6783b89 MR |
204 | #endif |
205 | #ifndef AV_WB32 | |
4a051891 MR |
206 | # define AV_WB32(p, d) do { \ |
207 | ((uint8_t*)(p))[3] = (d); \ | |
208 | ((uint8_t*)(p))[2] = (d)>>8; \ | |
209 | ((uint8_t*)(p))[1] = (d)>>16; \ | |
210 | ((uint8_t*)(p))[0] = (d)>>24; \ | |
211 | } while(0) | |
a6783b89 | 212 | #endif |
a3550abd | 213 | |
a6783b89 | 214 | #ifndef AV_RL32 |
4a051891 MR |
215 | # define AV_RL32(x) \ |
216 | ((((const uint8_t*)(x))[3] << 24) | \ | |
217 | (((const uint8_t*)(x))[2] << 16) | \ | |
218 | (((const uint8_t*)(x))[1] << 8) | \ | |
219 | ((const uint8_t*)(x))[0]) | |
a6783b89 MR |
220 | #endif |
221 | #ifndef AV_WL32 | |
4a051891 MR |
222 | # define AV_WL32(p, d) do { \ |
223 | ((uint8_t*)(p))[0] = (d); \ | |
224 | ((uint8_t*)(p))[1] = (d)>>8; \ | |
225 | ((uint8_t*)(p))[2] = (d)>>16; \ | |
226 | ((uint8_t*)(p))[3] = (d)>>24; \ | |
227 | } while(0) | |
a6783b89 | 228 | #endif |
9e010b41 | 229 | |
a6783b89 | 230 | #ifndef AV_RB64 |
4a051891 MR |
231 | # define AV_RB64(x) \ |
232 | (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ | |
233 | ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ | |
234 | ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ | |
235 | ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ | |
236 | ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ | |
237 | ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ | |
238 | ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ | |
239 | (uint64_t)((const uint8_t*)(x))[7]) | |
a6783b89 MR |
240 | #endif |
241 | #ifndef AV_WB64 | |
4a051891 MR |
242 | # define AV_WB64(p, d) do { \ |
243 | ((uint8_t*)(p))[7] = (d); \ | |
244 | ((uint8_t*)(p))[6] = (d)>>8; \ | |
245 | ((uint8_t*)(p))[5] = (d)>>16; \ | |
246 | ((uint8_t*)(p))[4] = (d)>>24; \ | |
247 | ((uint8_t*)(p))[3] = (d)>>32; \ | |
248 | ((uint8_t*)(p))[2] = (d)>>40; \ | |
249 | ((uint8_t*)(p))[1] = (d)>>48; \ | |
250 | ((uint8_t*)(p))[0] = (d)>>56; \ | |
251 | } while(0) | |
a6783b89 | 252 | #endif |
9e010b41 | 253 | |
a6783b89 | 254 | #ifndef AV_RL64 |
4a051891 MR |
255 | # define AV_RL64(x) \ |
256 | (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ | |
257 | ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ | |
258 | ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ | |
259 | ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ | |
260 | ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ | |
261 | ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ | |
262 | ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ | |
263 | (uint64_t)((const uint8_t*)(x))[0]) | |
a6783b89 MR |
264 | #endif |
265 | #ifndef AV_WL64 | |
4a051891 MR |
266 | # define AV_WL64(p, d) do { \ |
267 | ((uint8_t*)(p))[0] = (d); \ | |
268 | ((uint8_t*)(p))[1] = (d)>>8; \ | |
269 | ((uint8_t*)(p))[2] = (d)>>16; \ | |
270 | ((uint8_t*)(p))[3] = (d)>>24; \ | |
271 | ((uint8_t*)(p))[4] = (d)>>32; \ | |
272 | ((uint8_t*)(p))[5] = (d)>>40; \ | |
273 | ((uint8_t*)(p))[6] = (d)>>48; \ | |
274 | ((uint8_t*)(p))[7] = (d)>>56; \ | |
275 | } while(0) | |
a6783b89 MR |
276 | #endif |
277 | ||
63613fe6 | 278 | #if HAVE_BIGENDIAN |
a6783b89 MR |
279 | # define AV_RN(s, p) AV_RB##s(p) |
280 | # define AV_WN(s, p, v) AV_WB##s(p, v) | |
281 | #else | |
282 | # define AV_RN(s, p) AV_RL##s(p) | |
283 | # define AV_WN(s, p, v) AV_WL##s(p, v) | |
284 | #endif | |
285 | ||
286 | #endif /* HAVE_FAST_UNALIGNED */ | |
287 | ||
288 | #ifndef AV_RN16 | |
289 | # define AV_RN16(p) AV_RN(16, p) | |
290 | #endif | |
291 | ||
292 | #ifndef AV_RN32 | |
293 | # define AV_RN32(p) AV_RN(32, p) | |
294 | #endif | |
295 | ||
296 | #ifndef AV_RN64 | |
297 | # define AV_RN64(p) AV_RN(64, p) | |
298 | #endif | |
299 | ||
300 | #ifndef AV_WN16 | |
301 | # define AV_WN16(p, v) AV_WN(16, p, v) | |
302 | #endif | |
303 | ||
304 | #ifndef AV_WN32 | |
305 | # define AV_WN32(p, v) AV_WN(32, p, v) | |
306 | #endif | |
307 | ||
308 | #ifndef AV_WN64 | |
309 | # define AV_WN64(p, v) AV_WN(64, p, v) | |
310 | #endif | |
311 | ||
63613fe6 | 312 | #if HAVE_BIGENDIAN |
63826ceb MR |
313 | # define AV_RB(s, p) AV_RN##s(p) |
314 | # define AV_WB(s, p, v) AV_WN##s(p, v) | |
315 | # define AV_RL(s, p) bswap_##s(AV_RN##s(p)) | |
316 | # define AV_WL(s, p, v) AV_WN##s(p, bswap_##s(v)) | |
a6783b89 | 317 | #else |
63826ceb MR |
318 | # define AV_RB(s, p) bswap_##s(AV_RN##s(p)) |
319 | # define AV_WB(s, p, v) AV_WN##s(p, bswap_##s(v)) | |
320 | # define AV_RL(s, p) AV_RN##s(p) | |
321 | # define AV_WL(s, p, v) AV_WN##s(p, v) | |
a6783b89 MR |
322 | #endif |
323 | ||
324 | #define AV_RB8(x) (((const uint8_t*)(x))[0]) | |
325 | #define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) | |
326 | ||
327 | #define AV_RL8(x) AV_RB8(x) | |
328 | #define AV_WL8(p, d) AV_WB8(p, d) | |
329 | ||
330 | #ifndef AV_RB16 | |
331 | # define AV_RB16(p) AV_RB(16, p) | |
332 | #endif | |
333 | #ifndef AV_WB16 | |
334 | # define AV_WB16(p, v) AV_WB(16, p, v) | |
335 | #endif | |
336 | ||
337 | #ifndef AV_RL16 | |
338 | # define AV_RL16(p) AV_RL(16, p) | |
339 | #endif | |
340 | #ifndef AV_WL16 | |
341 | # define AV_WL16(p, v) AV_WL(16, p, v) | |
342 | #endif | |
343 | ||
344 | #ifndef AV_RB32 | |
345 | # define AV_RB32(p) AV_RB(32, p) | |
346 | #endif | |
347 | #ifndef AV_WB32 | |
348 | # define AV_WB32(p, v) AV_WB(32, p, v) | |
349 | #endif | |
350 | ||
351 | #ifndef AV_RL32 | |
352 | # define AV_RL32(p) AV_RL(32, p) | |
353 | #endif | |
354 | #ifndef AV_WL32 | |
355 | # define AV_WL32(p, v) AV_WL(32, p, v) | |
356 | #endif | |
357 | ||
358 | #ifndef AV_RB64 | |
359 | # define AV_RB64(p) AV_RB(64, p) | |
360 | #endif | |
361 | #ifndef AV_WB64 | |
362 | # define AV_WB64(p, v) AV_WB(64, p, v) | |
363 | #endif | |
364 | ||
365 | #ifndef AV_RL64 | |
366 | # define AV_RL64(p) AV_RL(64, p) | |
367 | #endif | |
368 | #ifndef AV_WL64 | |
369 | # define AV_WL64(p, v) AV_WL(64, p, v) | |
370 | #endif | |
fbbea48e | 371 | |
57c36bdc | 372 | #ifndef AV_RB24 |
4a051891 MR |
373 | # define AV_RB24(x) \ |
374 | ((((const uint8_t*)(x))[0] << 16) | \ | |
375 | (((const uint8_t*)(x))[1] << 8) | \ | |
376 | ((const uint8_t*)(x))[2]) | |
57c36bdc MR |
377 | #endif |
378 | #ifndef AV_WB24 | |
4a051891 MR |
379 | # define AV_WB24(p, d) do { \ |
380 | ((uint8_t*)(p))[2] = (d); \ | |
381 | ((uint8_t*)(p))[1] = (d)>>8; \ | |
382 | ((uint8_t*)(p))[0] = (d)>>16; \ | |
383 | } while(0) | |
57c36bdc | 384 | #endif |
fbbea48e | 385 | |
57c36bdc | 386 | #ifndef AV_RL24 |
4a051891 MR |
387 | # define AV_RL24(x) \ |
388 | ((((const uint8_t*)(x))[2] << 16) | \ | |
389 | (((const uint8_t*)(x))[1] << 8) | \ | |
390 | ((const uint8_t*)(x))[0]) | |
57c36bdc MR |
391 | #endif |
392 | #ifndef AV_WL24 | |
4a051891 MR |
393 | # define AV_WL24(p, d) do { \ |
394 | ((uint8_t*)(p))[0] = (d); \ | |
395 | ((uint8_t*)(p))[1] = (d)>>8; \ | |
396 | ((uint8_t*)(p))[2] = (d)>>16; \ | |
397 | } while(0) | |
57c36bdc | 398 | #endif |
9e010b41 | 399 | |
98790382 | 400 | #endif /* AVUTIL_INTREADWRITE_H */ |