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 | ||
cf1e119b RD |
19 | #ifndef INTREADWRITE_H |
20 | #define INTREADWRITE_H | |
21 | ||
22 | #ifdef __GNUC__ | |
23 | ||
24 | struct unaligned_64 { uint64_t l; } __attribute__((packed)); | |
25 | struct unaligned_32 { uint32_t l; } __attribute__((packed)); | |
26 | struct unaligned_16 { uint16_t l; } __attribute__((packed)); | |
27 | ||
28 | #define LD16(a) (((const struct unaligned_16 *) (a))->l) | |
29 | #define LD32(a) (((const struct unaligned_32 *) (a))->l) | |
30 | #define LD64(a) (((const struct unaligned_64 *) (a))->l) | |
31 | ||
32 | #define ST16(a, b) (((struct unaligned_16 *) (a))->l) = (b) | |
33 | #define ST32(a, b) (((struct unaligned_32 *) (a))->l) = (b) | |
34 | ||
35 | #else /* __GNUC__ */ | |
36 | ||
37 | #define LD16(a) (*((uint16_t*)(a))) | |
38 | #define LD32(a) (*((uint32_t*)(a))) | |
39 | #define LD64(a) (*((uint64_t*)(a))) | |
40 | ||
41 | #define ST16(a, b) *((uint16_t*)(a)) = (b) | |
42 | #define ST32(a, b) *((uint32_t*)(a)) = (b) | |
43 | ||
44 | #endif /* !__GNUC__ */ | |
45 | ||
46 | /* endian macros */ | |
85b1a722 | 47 | #define AV_RB8(x) (((uint8_t*)(x))[0]) |
7d4495da | 48 | #define AV_WB8(p, d) { ((uint8_t*)(p))[0] = (d); } |
a3550abd | 49 | |
85b1a722 DB |
50 | #define AV_RL8(x) AV_RB8(x) |
51 | #define AV_WL8(p, d) AV_WB8(p, d) | |
52 | ||
7b829d2a RP |
53 | #ifdef HAVE_FAST_UNALIGNED |
54 | # ifdef WORDS_BIGENDIAN | |
55 | # define AV_RB16(x) LD16(x) | |
56 | # define AV_WB16(p, d) ST16(p, d) | |
57 | ||
58 | # define AV_RL16(x) bswap_16(LD16(x)) | |
59 | # define AV_WL16(p, d) ST16(p, bswap_16(d)) | |
60 | # else /* WORDS_BIGENDIAN */ | |
61 | # define AV_RB16(x) bswap_16(LD16(x)) | |
62 | # define AV_WB16(p, d) ST16(p, bswap_16(d)) | |
63 | ||
64 | # define AV_RL16(x) LD16(x) | |
65 | # define AV_WL16(p, d) ST16(p, d) | |
66 | # endif | |
67 | #else /* HAVE_FAST_UNALIGNED */ | |
85b1a722 | 68 | #define AV_RB16(x) ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1]) |
7d4495da MN |
69 | #define AV_WB16(p, d) { \ |
70 | ((uint8_t*)(p))[1] = (d); \ | |
71 | ((uint8_t*)(p))[0] = (d)>>8; } | |
a3550abd | 72 | |
85b1a722 DB |
73 | #define AV_RL16(x) ((((uint8_t*)(x))[1] << 8) | \ |
74 | ((uint8_t*)(x))[0]) | |
75 | #define AV_WL16(p, d) { \ | |
76 | ((uint8_t*)(p))[0] = (d); \ | |
77 | ((uint8_t*)(p))[1] = (d)>>8; } | |
7b829d2a | 78 | #endif |
85b1a722 DB |
79 | |
80 | #define AV_RB24(x) ((((uint8_t*)(x))[0] << 16) | \ | |
81 | (((uint8_t*)(x))[1] << 8) | \ | |
82 | ((uint8_t*)(x))[2]) | |
626b7c0f BC |
83 | #define AV_WB24(p, d) { \ |
84 | ((uint8_t*)(p))[2] = (d); \ | |
85 | ((uint8_t*)(p))[1] = (d)>>8; \ | |
86 | ((uint8_t*)(p))[0] = (d)>>16; } | |
87 | ||
85b1a722 DB |
88 | #define AV_RL24(x) ((((uint8_t*)(x))[2] << 16) | \ |
89 | (((uint8_t*)(x))[1] << 8) | \ | |
90 | ((uint8_t*)(x))[0]) | |
91 | #define AV_WL24(p, d) { \ | |
92 | ((uint8_t*)(p))[0] = (d); \ | |
93 | ((uint8_t*)(p))[1] = (d)>>8; \ | |
94 | ((uint8_t*)(p))[2] = (d)>>16; } | |
95 | ||
7b829d2a RP |
96 | #ifdef HAVE_FAST_UNALIGNED |
97 | # ifdef WORDS_BIGENDIAN | |
98 | # define AV_RB32(x) LD32(x) | |
99 | # define AV_WB32(p, d) ST32(p, d) | |
100 | ||
101 | # define AV_RL32(x) bswap_32(LD32(x)) | |
102 | # define AV_WL32(p, d) ST32(p, bswap_32(d)) | |
103 | # else /* WORDS_BIGENDIAN */ | |
104 | # define AV_RB32(x) bswap_32(LD32(x)) | |
105 | # define AV_WB32(p, d) ST32(p, bswap_32(d)) | |
106 | ||
107 | # define AV_RL32(x) LD32(x) | |
108 | # define AV_WL32(p, d) ST32(p, d) | |
109 | # endif | |
110 | #else /* HAVE_FAST_UNALIGNED */ | |
85b1a722 DB |
111 | #define AV_RB32(x) ((((uint8_t*)(x))[0] << 24) | \ |
112 | (((uint8_t*)(x))[1] << 16) | \ | |
113 | (((uint8_t*)(x))[2] << 8) | \ | |
114 | ((uint8_t*)(x))[3]) | |
7d4495da MN |
115 | #define AV_WB32(p, d) { \ |
116 | ((uint8_t*)(p))[3] = (d); \ | |
117 | ((uint8_t*)(p))[2] = (d)>>8; \ | |
118 | ((uint8_t*)(p))[1] = (d)>>16; \ | |
119 | ((uint8_t*)(p))[0] = (d)>>24; } | |
a3550abd | 120 | |
a3550abd | 121 | #define AV_RL32(x) ((((uint8_t*)(x))[3] << 24) | \ |
85b1a722 DB |
122 | (((uint8_t*)(x))[2] << 16) | \ |
123 | (((uint8_t*)(x))[1] << 8) | \ | |
124 | ((uint8_t*)(x))[0]) | |
7d4495da MN |
125 | #define AV_WL32(p, d) { \ |
126 | ((uint8_t*)(p))[0] = (d); \ | |
127 | ((uint8_t*)(p))[1] = (d)>>8; \ | |
128 | ((uint8_t*)(p))[2] = (d)>>16; \ | |
129 | ((uint8_t*)(p))[3] = (d)>>24; } | |
7b829d2a | 130 | #endif |
cf1e119b RD |
131 | |
132 | #endif /* INTREADWRITE_H */ |