comparison intreadwrite.h @ 727:98b64f65be0d libavutil

Reorganise intreadwrite.h This changes intreadwrite.h to support per-arch implementations of the various macros allowing us to take advantage of special instructions or other properties the compiler does not know about.
author mru
date Sat, 18 Apr 2009 00:00:22 +0000
parents 880c6441f56a
children 1fa3820b1a84
comparison
equal deleted inserted replaced
726:5d344280a1f8 727:98b64f65be0d
21 21
22 #include <stdint.h> 22 #include <stdint.h>
23 #include "config.h" 23 #include "config.h"
24 #include "bswap.h" 24 #include "bswap.h"
25 25
26 #ifdef __GNUC__ 26 /*
27 * Arch-specific headers can provide any combination of
28 * AV_[RW][BLN](16|32|64) macros. Preprocessor symbols must be
29 * defined, even if these are implemented as inline functions.
30 */
31
32
33 /*
34 * Define AV_[RW]N helper macros to simplify definitions not provided
35 * by per-arch headers.
36 */
37
38 #if defined(__GNUC__)
27 39
28 struct unaligned_64 { uint64_t l; } __attribute__((packed)); 40 struct unaligned_64 { uint64_t l; } __attribute__((packed));
29 struct unaligned_32 { uint32_t l; } __attribute__((packed)); 41 struct unaligned_32 { uint32_t l; } __attribute__((packed));
30 struct unaligned_16 { uint16_t l; } __attribute__((packed)); 42 struct unaligned_16 { uint16_t l; } __attribute__((packed));
31 43
32 #define AV_RN16(a) (((const struct unaligned_16 *) (a))->l) 44 # define AV_RN(s, p) (((const struct unaligned_##s *) (p))->l)
33 #define AV_RN32(a) (((const struct unaligned_32 *) (a))->l) 45 # define AV_WN(s, p, v) (((struct unaligned_##s *) (p))->l) = (v)
34 #define AV_RN64(a) (((const struct unaligned_64 *) (a))->l)
35
36 #define AV_WN16(a, b) (((struct unaligned_16 *) (a))->l) = (b)
37 #define AV_WN32(a, b) (((struct unaligned_32 *) (a))->l) = (b)
38 #define AV_WN64(a, b) (((struct unaligned_64 *) (a))->l) = (b)
39 46
40 #elif defined(__DECC) 47 #elif defined(__DECC)
41 48
42 #define AV_RN16(a) (*((const __unaligned uint16_t*)(a))) 49 # define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p)))
43 #define AV_RN32(a) (*((const __unaligned uint32_t*)(a))) 50 # define AV_WN(s, p, v) *((__unaligned uint##s##_t*)(p)) = (v)
44 #define AV_RN64(a) (*((const __unaligned uint64_t*)(a))) 51
45 52 #elif HAVE_FAST_UNALIGNED
46 #define AV_WN16(a, b) *((__unaligned uint16_t*)(a)) = (b) 53
47 #define AV_WN32(a, b) *((__unaligned uint32_t*)(a)) = (b) 54 # define AV_RN(s, p) (*((const uint##s##_t*)(p)))
48 #define AV_WN64(a, b) *((__unaligned uint64_t*)(a)) = (b) 55 # define AV_WN(s, p, v) *((uint##s##_t*)(p)) = (v)
49 56
50 #else 57 #else
51 58
52 #define AV_RN16(a) (*((const uint16_t*)(a))) 59 #ifndef AV_RB16
53 #define AV_RN32(a) (*((const uint32_t*)(a))) 60 #define AV_RB16(x) ((((const uint8_t*)(x))[0] << 8) | \
54 #define AV_RN64(a) (*((const uint64_t*)(a))) 61 ((const uint8_t*)(x))[1])
55 62 #endif
56 #define AV_WN16(a, b) *((uint16_t*)(a)) = (b) 63 #ifndef AV_WB16
57 #define AV_WN32(a, b) *((uint32_t*)(a)) = (b)
58 #define AV_WN64(a, b) *((uint64_t*)(a)) = (b)
59
60 #endif /* !__GNUC__ */
61
62 /* endian macros */
63 #define AV_RB8(x) (((const uint8_t*)(x))[0])
64 #define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0)
65
66 #define AV_RL8(x) AV_RB8(x)
67 #define AV_WL8(p, d) AV_WB8(p, d)
68
69 #if HAVE_FAST_UNALIGNED
70 # ifdef WORDS_BIGENDIAN
71 # define AV_RB16(x) AV_RN16(x)
72 # define AV_WB16(p, d) AV_WN16(p, d)
73
74 # define AV_RL16(x) bswap_16(AV_RN16(x))
75 # define AV_WL16(p, d) AV_WN16(p, bswap_16(d))
76
77 # define AV_RB32(x) AV_RN32(x)
78 # define AV_WB32(p, d) AV_WN32(p, d)
79
80 # define AV_RL32(x) bswap_32(AV_RN32(x))
81 # define AV_WL32(p, d) AV_WN32(p, bswap_32(d))
82
83 # define AV_RB64(x) AV_RN64(x)
84 # define AV_WB64(p, d) AV_WN64(p, d)
85
86 # define AV_RL64(x) bswap_64(AV_RN64(x))
87 # define AV_WL64(p, d) AV_WN64(p, bswap_64(d))
88 # else /* WORDS_BIGENDIAN */
89 # define AV_RB16(x) bswap_16(AV_RN16(x))
90 # define AV_WB16(p, d) AV_WN16(p, bswap_16(d))
91
92 # define AV_RL16(x) AV_RN16(x)
93 # define AV_WL16(p, d) AV_WN16(p, d)
94
95 # define AV_RB32(x) bswap_32(AV_RN32(x))
96 # define AV_WB32(p, d) AV_WN32(p, bswap_32(d))
97
98 # define AV_RL32(x) AV_RN32(x)
99 # define AV_WL32(p, d) AV_WN32(p, d)
100
101 # define AV_RB64(x) bswap_64(AV_RN64(x))
102 # define AV_WB64(p, d) AV_WN64(p, bswap_64(d))
103
104 # define AV_RL64(x) AV_RN64(x)
105 # define AV_WL64(p, d) AV_WN64(p, d)
106 # endif
107 #else /* HAVE_FAST_UNALIGNED */
108 #define AV_RB16(x) ((((const uint8_t*)(x))[0] << 8) | ((const uint8_t*)(x))[1])
109 #define AV_WB16(p, d) do { \ 64 #define AV_WB16(p, d) do { \
110 ((uint8_t*)(p))[1] = (d); \ 65 ((uint8_t*)(p))[1] = (d); \
111 ((uint8_t*)(p))[0] = (d)>>8; } while(0) 66 ((uint8_t*)(p))[0] = (d)>>8; } while(0)
112 67 #endif
68
69 #ifndef AV_RL16
113 #define AV_RL16(x) ((((const uint8_t*)(x))[1] << 8) | \ 70 #define AV_RL16(x) ((((const uint8_t*)(x))[1] << 8) | \
114 ((const uint8_t*)(x))[0]) 71 ((const uint8_t*)(x))[0])
72 #endif
73 #ifndef AV_WL16
115 #define AV_WL16(p, d) do { \ 74 #define AV_WL16(p, d) do { \
116 ((uint8_t*)(p))[0] = (d); \ 75 ((uint8_t*)(p))[0] = (d); \
117 ((uint8_t*)(p))[1] = (d)>>8; } while(0) 76 ((uint8_t*)(p))[1] = (d)>>8; } while(0)
118 77 #endif
78
79 #ifndef AV_RB32
119 #define AV_RB32(x) ((((const uint8_t*)(x))[0] << 24) | \ 80 #define AV_RB32(x) ((((const uint8_t*)(x))[0] << 24) | \
120 (((const uint8_t*)(x))[1] << 16) | \ 81 (((const uint8_t*)(x))[1] << 16) | \
121 (((const uint8_t*)(x))[2] << 8) | \ 82 (((const uint8_t*)(x))[2] << 8) | \
122 ((const uint8_t*)(x))[3]) 83 ((const uint8_t*)(x))[3])
84 #endif
85 #ifndef AV_WB32
123 #define AV_WB32(p, d) do { \ 86 #define AV_WB32(p, d) do { \
124 ((uint8_t*)(p))[3] = (d); \ 87 ((uint8_t*)(p))[3] = (d); \
125 ((uint8_t*)(p))[2] = (d)>>8; \ 88 ((uint8_t*)(p))[2] = (d)>>8; \
126 ((uint8_t*)(p))[1] = (d)>>16; \ 89 ((uint8_t*)(p))[1] = (d)>>16; \
127 ((uint8_t*)(p))[0] = (d)>>24; } while(0) 90 ((uint8_t*)(p))[0] = (d)>>24; } while(0)
128 91 #endif
92
93 #ifndef AV_RL32
129 #define AV_RL32(x) ((((const uint8_t*)(x))[3] << 24) | \ 94 #define AV_RL32(x) ((((const uint8_t*)(x))[3] << 24) | \
130 (((const uint8_t*)(x))[2] << 16) | \ 95 (((const uint8_t*)(x))[2] << 16) | \
131 (((const uint8_t*)(x))[1] << 8) | \ 96 (((const uint8_t*)(x))[1] << 8) | \
132 ((const uint8_t*)(x))[0]) 97 ((const uint8_t*)(x))[0])
98 #endif
99 #ifndef AV_WL32
133 #define AV_WL32(p, d) do { \ 100 #define AV_WL32(p, d) do { \
134 ((uint8_t*)(p))[0] = (d); \ 101 ((uint8_t*)(p))[0] = (d); \
135 ((uint8_t*)(p))[1] = (d)>>8; \ 102 ((uint8_t*)(p))[1] = (d)>>8; \
136 ((uint8_t*)(p))[2] = (d)>>16; \ 103 ((uint8_t*)(p))[2] = (d)>>16; \
137 ((uint8_t*)(p))[3] = (d)>>24; } while(0) 104 ((uint8_t*)(p))[3] = (d)>>24; } while(0)
138 105 #endif
106
107 #ifndef AV_RB64
139 #define AV_RB64(x) (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ 108 #define AV_RB64(x) (((uint64_t)((const uint8_t*)(x))[0] << 56) | \
140 ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ 109 ((uint64_t)((const uint8_t*)(x))[1] << 48) | \
141 ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ 110 ((uint64_t)((const uint8_t*)(x))[2] << 40) | \
142 ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ 111 ((uint64_t)((const uint8_t*)(x))[3] << 32) | \
143 ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ 112 ((uint64_t)((const uint8_t*)(x))[4] << 24) | \
144 ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ 113 ((uint64_t)((const uint8_t*)(x))[5] << 16) | \
145 ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ 114 ((uint64_t)((const uint8_t*)(x))[6] << 8) | \
146 (uint64_t)((const uint8_t*)(x))[7]) 115 (uint64_t)((const uint8_t*)(x))[7])
116 #endif
117 #ifndef AV_WB64
147 #define AV_WB64(p, d) do { \ 118 #define AV_WB64(p, d) do { \
148 ((uint8_t*)(p))[7] = (d); \ 119 ((uint8_t*)(p))[7] = (d); \
149 ((uint8_t*)(p))[6] = (d)>>8; \ 120 ((uint8_t*)(p))[6] = (d)>>8; \
150 ((uint8_t*)(p))[5] = (d)>>16; \ 121 ((uint8_t*)(p))[5] = (d)>>16; \
151 ((uint8_t*)(p))[4] = (d)>>24; \ 122 ((uint8_t*)(p))[4] = (d)>>24; \
152 ((uint8_t*)(p))[3] = (d)>>32; \ 123 ((uint8_t*)(p))[3] = (d)>>32; \
153 ((uint8_t*)(p))[2] = (d)>>40; \ 124 ((uint8_t*)(p))[2] = (d)>>40; \
154 ((uint8_t*)(p))[1] = (d)>>48; \ 125 ((uint8_t*)(p))[1] = (d)>>48; \
155 ((uint8_t*)(p))[0] = (d)>>56; } while(0) 126 ((uint8_t*)(p))[0] = (d)>>56; } while(0)
156 127 #endif
128
129 #ifndef AV_RL64
157 #define AV_RL64(x) (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ 130 #define AV_RL64(x) (((uint64_t)((const uint8_t*)(x))[7] << 56) | \
158 ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ 131 ((uint64_t)((const uint8_t*)(x))[6] << 48) | \
159 ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ 132 ((uint64_t)((const uint8_t*)(x))[5] << 40) | \
160 ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ 133 ((uint64_t)((const uint8_t*)(x))[4] << 32) | \
161 ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ 134 ((uint64_t)((const uint8_t*)(x))[3] << 24) | \
162 ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ 135 ((uint64_t)((const uint8_t*)(x))[2] << 16) | \
163 ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ 136 ((uint64_t)((const uint8_t*)(x))[1] << 8) | \
164 (uint64_t)((const uint8_t*)(x))[0]) 137 (uint64_t)((const uint8_t*)(x))[0])
138 #endif
139 #ifndef AV_WL64
165 #define AV_WL64(p, d) do { \ 140 #define AV_WL64(p, d) do { \
166 ((uint8_t*)(p))[0] = (d); \ 141 ((uint8_t*)(p))[0] = (d); \
167 ((uint8_t*)(p))[1] = (d)>>8; \ 142 ((uint8_t*)(p))[1] = (d)>>8; \
168 ((uint8_t*)(p))[2] = (d)>>16; \ 143 ((uint8_t*)(p))[2] = (d)>>16; \
169 ((uint8_t*)(p))[3] = (d)>>24; \ 144 ((uint8_t*)(p))[3] = (d)>>24; \
170 ((uint8_t*)(p))[4] = (d)>>32; \ 145 ((uint8_t*)(p))[4] = (d)>>32; \
171 ((uint8_t*)(p))[5] = (d)>>40; \ 146 ((uint8_t*)(p))[5] = (d)>>40; \
172 ((uint8_t*)(p))[6] = (d)>>48; \ 147 ((uint8_t*)(p))[6] = (d)>>48; \
173 ((uint8_t*)(p))[7] = (d)>>56; } while(0) 148 ((uint8_t*)(p))[7] = (d)>>56; } while(0)
174 #endif /* HAVE_FAST_UNALIGNED */ 149 #endif
150
151 #ifdef WORDS_BIGENDIAN
152 # define AV_RN(s, p) AV_RB##s(p)
153 # define AV_WN(s, p, v) AV_WB##s(p, v)
154 #else
155 # define AV_RN(s, p) AV_RL##s(p)
156 # define AV_WN(s, p, v) AV_WL##s(p, v)
157 #endif
158
159 #endif /* HAVE_FAST_UNALIGNED */
160
161 #ifndef AV_RN16
162 # define AV_RN16(p) AV_RN(16, p)
163 #endif
164
165 #ifndef AV_RN32
166 # define AV_RN32(p) AV_RN(32, p)
167 #endif
168
169 #ifndef AV_RN64
170 # define AV_RN64(p) AV_RN(64, p)
171 #endif
172
173 #ifndef AV_WN16
174 # define AV_WN16(p, v) AV_WN(16, p, v)
175 #endif
176
177 #ifndef AV_WN32
178 # define AV_WN32(p, v) AV_WN(32, p, v)
179 #endif
180
181 #ifndef AV_WN64
182 # define AV_WN64(p, v) AV_WN(64, p, v)
183 #endif
184
185 #ifdef WORDS_BIGENDIAN
186 # define AV_RB(s, p) AV_RN(s, p)
187 # define AV_WB(s, p, v) AV_WN(s, p, v)
188 # define AV_RL(s, p) bswap_##s(AV_RN(s, p))
189 # define AV_WL(s, p, v) AV_WN(s, p, bswap_##s(v))
190 #else
191 # define AV_RB(s, p) bswap_##s(AV_RN(s, p))
192 # define AV_WB(s, p, v) AV_WN(s, p, bswap_##s(v))
193 # define AV_RL(s, p) AV_RN(s, p)
194 # define AV_WL(s, p, v) AV_WN(s, p, v)
195 #endif
196
197 #define AV_RB8(x) (((const uint8_t*)(x))[0])
198 #define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0)
199
200 #define AV_RL8(x) AV_RB8(x)
201 #define AV_WL8(p, d) AV_WB8(p, d)
202
203 #ifndef AV_RB16
204 # define AV_RB16(p) AV_RB(16, p)
205 #endif
206 #ifndef AV_WB16
207 # define AV_WB16(p, v) AV_WB(16, p, v)
208 #endif
209
210 #ifndef AV_RL16
211 # define AV_RL16(p) AV_RL(16, p)
212 #endif
213 #ifndef AV_WL16
214 # define AV_WL16(p, v) AV_WL(16, p, v)
215 #endif
216
217 #ifndef AV_RB32
218 # define AV_RB32(p) AV_RB(32, p)
219 #endif
220 #ifndef AV_WB32
221 # define AV_WB32(p, v) AV_WB(32, p, v)
222 #endif
223
224 #ifndef AV_RL32
225 # define AV_RL32(p) AV_RL(32, p)
226 #endif
227 #ifndef AV_WL32
228 # define AV_WL32(p, v) AV_WL(32, p, v)
229 #endif
230
231 #ifndef AV_RB64
232 # define AV_RB64(p) AV_RB(64, p)
233 #endif
234 #ifndef AV_WB64
235 # define AV_WB64(p, v) AV_WB(64, p, v)
236 #endif
237
238 #ifndef AV_RL64
239 # define AV_RL64(p) AV_RL(64, p)
240 #endif
241 #ifndef AV_WL64
242 # define AV_WL64(p, v) AV_WL(64, p, v)
243 #endif
175 244
176 #define AV_RB24(x) ((((const uint8_t*)(x))[0] << 16) | \ 245 #define AV_RB24(x) ((((const uint8_t*)(x))[0] << 16) | \
177 (((const uint8_t*)(x))[1] << 8) | \ 246 (((const uint8_t*)(x))[1] << 8) | \
178 ((const uint8_t*)(x))[2]) 247 ((const uint8_t*)(x))[2])
179 #define AV_WB24(p, d) do { \ 248 #define AV_WB24(p, d) do { \