intreadwrite: allow arch-specific 24-bit access macros
[libav.git] / libavutil / intreadwrite.h
CommitLineData
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"
530456bf
MR
34#elif ARCH_MIPS
35# include "mips/intreadwrite.h"
9f5ff83f
MR
36#elif ARCH_PPC
37# include "ppc/intreadwrite.h"
3c55ce03 38#endif
a6783b89
MR
39
40/*
41 * Define AV_[RW]N helper macros to simplify definitions not provided
42 * by per-arch headers.
43 */
44
e7ea5e3d 45#if HAVE_ATTRIBUTE_PACKED
cf1e119b
RD
46
47struct unaligned_64 { uint64_t l; } __attribute__((packed));
48struct unaligned_32 { uint32_t l; } __attribute__((packed));
49struct unaligned_16 { uint16_t l; } __attribute__((packed));
50
a6783b89
MR
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)
cf1e119b 53
b7b38fb2
MR
54#elif defined(__DECC)
55
a6783b89
MR
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)
fbbea48e 58
a6783b89 59#elif HAVE_FAST_UNALIGNED
fbbea48e 60
a6783b89
MR
61# define AV_RN(s, p) (*((const uint##s##_t*)(p)))
62# define AV_WN(s, p, v) *((uint##s##_t*)(p)) = (v)
fbbea48e 63
a6783b89 64#else
fbbea48e 65
a6783b89
MR
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
803ca89c 71#define AV_WB16(p, d) do { \
7d4495da 72 ((uint8_t*)(p))[1] = (d); \
803ca89c 73 ((uint8_t*)(p))[0] = (d)>>8; } while(0)
a6783b89 74#endif
a3550abd 75
a6783b89 76#ifndef AV_RL16
ff794171
MN
77#define AV_RL16(x) ((((const uint8_t*)(x))[1] << 8) | \
78 ((const uint8_t*)(x))[0])
a6783b89
MR
79#endif
80#ifndef AV_WL16
803ca89c 81#define AV_WL16(p, d) do { \
85b1a722 82 ((uint8_t*)(p))[0] = (d); \
803ca89c 83 ((uint8_t*)(p))[1] = (d)>>8; } while(0)
a6783b89 84#endif
7b829d2a 85
a6783b89 86#ifndef AV_RB32
ff794171
MN
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])
a6783b89
MR
91#endif
92#ifndef AV_WB32
803ca89c 93#define AV_WB32(p, d) do { \
7d4495da
MN
94 ((uint8_t*)(p))[3] = (d); \
95 ((uint8_t*)(p))[2] = (d)>>8; \
96 ((uint8_t*)(p))[1] = (d)>>16; \
803ca89c 97 ((uint8_t*)(p))[0] = (d)>>24; } while(0)
a6783b89 98#endif
a3550abd 99
a6783b89 100#ifndef AV_RL32
ff794171
MN
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])
a6783b89
MR
105#endif
106#ifndef AV_WL32
803ca89c 107#define AV_WL32(p, d) do { \
7d4495da
MN
108 ((uint8_t*)(p))[0] = (d); \
109 ((uint8_t*)(p))[1] = (d)>>8; \
110 ((uint8_t*)(p))[2] = (d)>>16; \
803ca89c 111 ((uint8_t*)(p))[3] = (d)>>24; } while(0)
a6783b89 112#endif
9e010b41 113
a6783b89 114#ifndef AV_RB64
ff794171
MN
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])
a6783b89
MR
123#endif
124#ifndef AV_WB64
803ca89c 125#define AV_WB64(p, d) do { \
9e010b41
IP
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; \
803ca89c 133 ((uint8_t*)(p))[0] = (d)>>56; } while(0)
a6783b89 134#endif
9e010b41 135
a6783b89 136#ifndef AV_RL64
ff794171
MN
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])
a6783b89
MR
145#endif
146#ifndef AV_WL64
803ca89c 147#define AV_WL64(p, d) do { \
9e010b41
IP
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; \
803ca89c 155 ((uint8_t*)(p))[7] = (d)>>56; } while(0)
a6783b89
MR
156#endif
157
63613fe6 158#if HAVE_BIGENDIAN
a6783b89
MR
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
63613fe6 192#if HAVE_BIGENDIAN
a6783b89
MR
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
fbbea48e 251
57c36bdc 252#ifndef AV_RB24
fbbea48e
MR
253#define AV_RB24(x) ((((const uint8_t*)(x))[0] << 16) | \
254 (((const uint8_t*)(x))[1] << 8) | \
255 ((const uint8_t*)(x))[2])
57c36bdc
MR
256#endif
257#ifndef AV_WB24
fbbea48e
MR
258#define AV_WB24(p, d) do { \
259 ((uint8_t*)(p))[2] = (d); \
260 ((uint8_t*)(p))[1] = (d)>>8; \
261 ((uint8_t*)(p))[0] = (d)>>16; } while(0)
57c36bdc 262#endif
fbbea48e 263
57c36bdc 264#ifndef AV_RL24
fbbea48e
MR
265#define AV_RL24(x) ((((const uint8_t*)(x))[2] << 16) | \
266 (((const uint8_t*)(x))[1] << 8) | \
267 ((const uint8_t*)(x))[0])
57c36bdc
MR
268#endif
269#ifndef AV_WL24
fbbea48e
MR
270#define AV_WL24(p, d) do { \
271 ((uint8_t*)(p))[0] = (d); \
272 ((uint8_t*)(p))[1] = (d)>>8; \
273 ((uint8_t*)(p))[2] = (d)>>16; } while(0)
57c36bdc 274#endif
9e010b41 275
98790382 276#endif /* AVUTIL_INTREADWRITE_H */