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