consts
[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
5b21bdab
DB
19#ifndef FFMPEG_INTREADWRITE_H
20#define FFMPEG_INTREADWRITE_H
cf1e119b 21
99545457 22#include <stdint.h>
c08be350 23#include "bswap.h"
99545457 24
cf1e119b
RD
25#ifdef __GNUC__
26
27struct unaligned_64 { uint64_t l; } __attribute__((packed));
28struct unaligned_32 { uint32_t l; } __attribute__((packed));
29struct unaligned_16 { uint16_t l; } __attribute__((packed));
30
905694d9
RS
31#define AV_RN16(a) (((const struct unaligned_16 *) (a))->l)
32#define AV_RN32(a) (((const struct unaligned_32 *) (a))->l)
33#define AV_RN64(a) (((const struct unaligned_64 *) (a))->l)
cf1e119b 34
905694d9
RS
35#define AV_WN16(a, b) (((struct unaligned_16 *) (a))->l) = (b)
36#define AV_WN32(a, b) (((struct unaligned_32 *) (a))->l) = (b)
37#define AV_WN64(a, b) (((struct unaligned_64 *) (a))->l) = (b)
cf1e119b
RD
38
39#else /* __GNUC__ */
40
905694d9
RS
41#define AV_RN16(a) (*((uint16_t*)(a)))
42#define AV_RN32(a) (*((uint32_t*)(a)))
43#define AV_RN64(a) (*((uint64_t*)(a)))
cf1e119b 44
905694d9
RS
45#define AV_WN16(a, b) *((uint16_t*)(a)) = (b)
46#define AV_WN32(a, b) *((uint32_t*)(a)) = (b)
47#define AV_WN64(a, b) *((uint64_t*)(a)) = (b)
cf1e119b
RD
48
49#endif /* !__GNUC__ */
50
51/* endian macros */
85b1a722 52#define AV_RB8(x) (((uint8_t*)(x))[0])
803ca89c 53#define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0)
a3550abd 54
85b1a722
DB
55#define AV_RL8(x) AV_RB8(x)
56#define AV_WL8(p, d) AV_WB8(p, d)
57
7b829d2a
RP
58#ifdef HAVE_FAST_UNALIGNED
59# ifdef WORDS_BIGENDIAN
905694d9
RS
60# define AV_RB16(x) AV_RN16(x)
61# define AV_WB16(p, d) AV_WN16(p, d)
7b829d2a 62
905694d9
RS
63# define AV_RL16(x) bswap_16(AV_RN16(x))
64# define AV_WL16(p, d) AV_WN16(p, bswap_16(d))
7b829d2a 65# else /* WORDS_BIGENDIAN */
905694d9
RS
66# define AV_RB16(x) bswap_16(AV_RN16(x))
67# define AV_WB16(p, d) AV_WN16(p, bswap_16(d))
7b829d2a 68
905694d9
RS
69# define AV_RL16(x) AV_RN16(x)
70# define AV_WL16(p, d) AV_WN16(p, d)
7b829d2a
RP
71# endif
72#else /* HAVE_FAST_UNALIGNED */
85b1a722 73#define AV_RB16(x) ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1])
803ca89c 74#define AV_WB16(p, d) do { \
7d4495da 75 ((uint8_t*)(p))[1] = (d); \
803ca89c 76 ((uint8_t*)(p))[0] = (d)>>8; } while(0)
a3550abd 77
85b1a722
DB
78#define AV_RL16(x) ((((uint8_t*)(x))[1] << 8) | \
79 ((uint8_t*)(x))[0])
803ca89c 80#define AV_WL16(p, d) do { \
85b1a722 81 ((uint8_t*)(p))[0] = (d); \
803ca89c 82 ((uint8_t*)(p))[1] = (d)>>8; } while(0)
7b829d2a 83#endif
85b1a722
DB
84
85#define AV_RB24(x) ((((uint8_t*)(x))[0] << 16) | \
86 (((uint8_t*)(x))[1] << 8) | \
87 ((uint8_t*)(x))[2])
803ca89c 88#define AV_WB24(p, d) do { \
626b7c0f
BC
89 ((uint8_t*)(p))[2] = (d); \
90 ((uint8_t*)(p))[1] = (d)>>8; \
803ca89c 91 ((uint8_t*)(p))[0] = (d)>>16; } while(0)
626b7c0f 92
85b1a722
DB
93#define AV_RL24(x) ((((uint8_t*)(x))[2] << 16) | \
94 (((uint8_t*)(x))[1] << 8) | \
95 ((uint8_t*)(x))[0])
803ca89c 96#define AV_WL24(p, d) do { \
85b1a722
DB
97 ((uint8_t*)(p))[0] = (d); \
98 ((uint8_t*)(p))[1] = (d)>>8; \
803ca89c 99 ((uint8_t*)(p))[2] = (d)>>16; } while(0)
85b1a722 100
7b829d2a
RP
101#ifdef HAVE_FAST_UNALIGNED
102# ifdef WORDS_BIGENDIAN
905694d9
RS
103# define AV_RB32(x) AV_RN32(x)
104# define AV_WB32(p, d) AV_WN32(p, d)
7b829d2a 105
905694d9
RS
106# define AV_RL32(x) bswap_32(AV_RN32(x))
107# define AV_WL32(p, d) AV_WN32(p, bswap_32(d))
7b829d2a 108# else /* WORDS_BIGENDIAN */
905694d9
RS
109# define AV_RB32(x) bswap_32(AV_RN32(x))
110# define AV_WB32(p, d) AV_WN32(p, bswap_32(d))
7b829d2a 111
905694d9
RS
112# define AV_RL32(x) AV_RN32(x)
113# define AV_WL32(p, d) AV_WN32(p, d)
7b829d2a
RP
114# endif
115#else /* HAVE_FAST_UNALIGNED */
85b1a722
DB
116#define AV_RB32(x) ((((uint8_t*)(x))[0] << 24) | \
117 (((uint8_t*)(x))[1] << 16) | \
118 (((uint8_t*)(x))[2] << 8) | \
119 ((uint8_t*)(x))[3])
803ca89c 120#define AV_WB32(p, d) do { \
7d4495da
MN
121 ((uint8_t*)(p))[3] = (d); \
122 ((uint8_t*)(p))[2] = (d)>>8; \
123 ((uint8_t*)(p))[1] = (d)>>16; \
803ca89c 124 ((uint8_t*)(p))[0] = (d)>>24; } while(0)
a3550abd 125
a3550abd 126#define AV_RL32(x) ((((uint8_t*)(x))[3] << 24) | \
85b1a722
DB
127 (((uint8_t*)(x))[2] << 16) | \
128 (((uint8_t*)(x))[1] << 8) | \
129 ((uint8_t*)(x))[0])
803ca89c 130#define AV_WL32(p, d) do { \
7d4495da
MN
131 ((uint8_t*)(p))[0] = (d); \
132 ((uint8_t*)(p))[1] = (d)>>8; \
133 ((uint8_t*)(p))[2] = (d)>>16; \
803ca89c 134 ((uint8_t*)(p))[3] = (d)>>24; } while(0)
7b829d2a 135#endif
cf1e119b 136
9e010b41
IP
137#ifdef HAVE_FAST_UNALIGNED
138# ifdef WORDS_BIGENDIAN
905694d9
RS
139# define AV_RB64(x) AV_RN64(x)
140# define AV_WB64(p, d) AV_WN64(p, d)
9e010b41 141
905694d9
RS
142# define AV_RL64(x) bswap_64(AV_RN64(x))
143# define AV_WL64(p, d) AV_WN64(p, bswap_64(d))
9e010b41 144# else /* WORDS_BIGENDIAN */
905694d9
RS
145# define AV_RB64(x) bswap_64(AV_RN64(x))
146# define AV_WB64(p, d) AV_WN64(p, bswap_64(d))
9e010b41 147
905694d9
RS
148# define AV_RL64(x) AV_RN64(x)
149# define AV_WL64(p, d) AV_WN64(p, d)
9e010b41
IP
150# endif
151#else /* HAVE_FAST_UNALIGNED */
152#define AV_RB64(x) (((uint64_t)((uint8_t*)(x))[0] << 56) | \
153 ((uint64_t)((uint8_t*)(x))[1] << 48) | \
154 ((uint64_t)((uint8_t*)(x))[2] << 40) | \
155 ((uint64_t)((uint8_t*)(x))[3] << 32) | \
156 ((uint64_t)((uint8_t*)(x))[4] << 24) | \
157 ((uint64_t)((uint8_t*)(x))[5] << 16) | \
158 ((uint64_t)((uint8_t*)(x))[6] << 8) | \
159 (uint64_t)((uint8_t*)(x))[7])
803ca89c 160#define AV_WB64(p, d) do { \
9e010b41
IP
161 ((uint8_t*)(p))[7] = (d); \
162 ((uint8_t*)(p))[6] = (d)>>8; \
163 ((uint8_t*)(p))[5] = (d)>>16; \
164 ((uint8_t*)(p))[4] = (d)>>24; \
165 ((uint8_t*)(p))[3] = (d)>>32; \
166 ((uint8_t*)(p))[2] = (d)>>40; \
167 ((uint8_t*)(p))[1] = (d)>>48; \
803ca89c 168 ((uint8_t*)(p))[0] = (d)>>56; } while(0)
9e010b41
IP
169
170#define AV_RL64(x) (((uint64_t)((uint8_t*)(x))[7] << 56) | \
171 ((uint64_t)((uint8_t*)(x))[6] << 48) | \
172 ((uint64_t)((uint8_t*)(x))[5] << 40) | \
173 ((uint64_t)((uint8_t*)(x))[4] << 32) | \
174 ((uint64_t)((uint8_t*)(x))[3] << 24) | \
175 ((uint64_t)((uint8_t*)(x))[2] << 16) | \
176 ((uint64_t)((uint8_t*)(x))[1] << 8) | \
177 (uint64_t)((uint8_t*)(x))[0])
803ca89c 178#define AV_WL64(p, d) do { \
9e010b41
IP
179 ((uint8_t*)(p))[0] = (d); \
180 ((uint8_t*)(p))[1] = (d)>>8; \
181 ((uint8_t*)(p))[2] = (d)>>16; \
182 ((uint8_t*)(p))[3] = (d)>>24; \
183 ((uint8_t*)(p))[4] = (d)>>32; \
184 ((uint8_t*)(p))[5] = (d)>>40; \
185 ((uint8_t*)(p))[6] = (d)>>48; \
803ca89c 186 ((uint8_t*)(p))[7] = (d)>>56; } while(0)
9e010b41
IP
187#endif
188
5b21bdab 189#endif /* FFMPEG_INTREADWRITE_H */