Mercurial > libavutil.hg
annotate 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 |
| rev | line source |
|---|---|
| 263 | 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 | |
| 567 | 19 #ifndef AVUTIL_INTREADWRITE_H |
| 20 #define AVUTIL_INTREADWRITE_H | |
|
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
21 |
| 343 | 22 #include <stdint.h> |
| 469 | 23 #include "config.h" |
|
350
c2034e89e9a2
intreadwrite.h needs bswap.h if HAVE_FAST_UNALIGNED is set, so include it.
reimar
parents:
343
diff
changeset
|
24 #include "bswap.h" |
| 343 | 25 |
| 727 | 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__) | |
|
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
39 |
|
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
40 struct unaligned_64 { uint64_t l; } __attribute__((packed)); |
|
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
41 struct unaligned_32 { uint32_t l; } __attribute__((packed)); |
|
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
42 struct unaligned_16 { uint16_t l; } __attribute__((packed)); |
|
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
43 |
| 727 | 44 # define AV_RN(s, p) (((const struct unaligned_##s *) (p))->l) |
| 45 # define AV_WN(s, p, v) (((struct unaligned_##s *) (p))->l) = (v) | |
|
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
46 |
|
525
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
47 #elif defined(__DECC) |
|
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
48 |
| 727 | 49 # define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) |
| 50 # define AV_WN(s, p, v) *((__unaligned uint##s##_t*)(p)) = (v) | |
|
525
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
51 |
| 727 | 52 #elif HAVE_FAST_UNALIGNED |
| 53 | |
| 54 # define AV_RN(s, p) (*((const uint##s##_t*)(p))) | |
| 55 # define AV_WN(s, p, v) *((uint##s##_t*)(p)) = (v) | |
|
525
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
56 |
|
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
57 #else |
|
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
58 |
| 727 | 59 #ifndef AV_RB16 |
| 60 #define AV_RB16(x) ((((const uint8_t*)(x))[0] << 8) | \ | |
| 61 ((const uint8_t*)(x))[1]) | |
| 62 #endif | |
| 63 #ifndef AV_WB16 | |
| 336 | 64 #define AV_WB16(p, d) do { \ |
| 235 | 65 ((uint8_t*)(p))[1] = (d); \ |
| 336 | 66 ((uint8_t*)(p))[0] = (d)>>8; } while(0) |
| 727 | 67 #endif |
|
232
9845a508ffbd
add AV_WB/WL for lswriting, similar to AV_RB/RL (also increment version)
alex
parents:
231
diff
changeset
|
68 |
| 727 | 69 #ifndef AV_RL16 |
| 444 | 70 #define AV_RL16(x) ((((const uint8_t*)(x))[1] << 8) | \ |
| 71 ((const uint8_t*)(x))[0]) | |
| 727 | 72 #endif |
| 73 #ifndef AV_WL16 | |
| 336 | 74 #define AV_WL16(p, d) do { \ |
|
326
46b4da5bf9ed
cosmetics: Reorder endianness macros by bit depth, alignment prettyprinting.
diego
parents:
282
diff
changeset
|
75 ((uint8_t*)(p))[0] = (d); \ |
| 336 | 76 ((uint8_t*)(p))[1] = (d)>>8; } while(0) |
| 727 | 77 #endif |
|
326
46b4da5bf9ed
cosmetics: Reorder endianness macros by bit depth, alignment prettyprinting.
diego
parents:
282
diff
changeset
|
78 |
| 727 | 79 #ifndef AV_RB32 |
| 444 | 80 #define AV_RB32(x) ((((const uint8_t*)(x))[0] << 24) | \ |
| 81 (((const uint8_t*)(x))[1] << 16) | \ | |
| 82 (((const uint8_t*)(x))[2] << 8) | \ | |
| 83 ((const uint8_t*)(x))[3]) | |
| 727 | 84 #endif |
| 85 #ifndef AV_WB32 | |
| 336 | 86 #define AV_WB32(p, d) do { \ |
| 235 | 87 ((uint8_t*)(p))[3] = (d); \ |
| 88 ((uint8_t*)(p))[2] = (d)>>8; \ | |
| 89 ((uint8_t*)(p))[1] = (d)>>16; \ | |
| 336 | 90 ((uint8_t*)(p))[0] = (d)>>24; } while(0) |
| 727 | 91 #endif |
|
232
9845a508ffbd
add AV_WB/WL for lswriting, similar to AV_RB/RL (also increment version)
alex
parents:
231
diff
changeset
|
92 |
| 727 | 93 #ifndef AV_RL32 |
| 444 | 94 #define AV_RL32(x) ((((const uint8_t*)(x))[3] << 24) | \ |
| 95 (((const uint8_t*)(x))[2] << 16) | \ | |
| 96 (((const uint8_t*)(x))[1] << 8) | \ | |
| 97 ((const uint8_t*)(x))[0]) | |
| 727 | 98 #endif |
| 99 #ifndef AV_WL32 | |
| 336 | 100 #define AV_WL32(p, d) do { \ |
| 235 | 101 ((uint8_t*)(p))[0] = (d); \ |
| 102 ((uint8_t*)(p))[1] = (d)>>8; \ | |
| 103 ((uint8_t*)(p))[2] = (d)>>16; \ | |
| 336 | 104 ((uint8_t*)(p))[3] = (d)>>24; } while(0) |
| 727 | 105 #endif |
|
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
106 |
| 727 | 107 #ifndef AV_RB64 |
| 444 | 108 #define AV_RB64(x) (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ |
| 109 ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ | |
| 110 ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ | |
| 111 ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ | |
| 112 ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ | |
| 113 ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ | |
| 114 ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ | |
| 115 (uint64_t)((const uint8_t*)(x))[7]) | |
| 727 | 116 #endif |
| 117 #ifndef AV_WB64 | |
| 336 | 118 #define AV_WB64(p, d) do { \ |
| 335 | 119 ((uint8_t*)(p))[7] = (d); \ |
| 120 ((uint8_t*)(p))[6] = (d)>>8; \ | |
| 121 ((uint8_t*)(p))[5] = (d)>>16; \ | |
| 122 ((uint8_t*)(p))[4] = (d)>>24; \ | |
| 123 ((uint8_t*)(p))[3] = (d)>>32; \ | |
| 124 ((uint8_t*)(p))[2] = (d)>>40; \ | |
| 125 ((uint8_t*)(p))[1] = (d)>>48; \ | |
| 336 | 126 ((uint8_t*)(p))[0] = (d)>>56; } while(0) |
| 727 | 127 #endif |
| 335 | 128 |
| 727 | 129 #ifndef AV_RL64 |
| 444 | 130 #define AV_RL64(x) (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ |
| 131 ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ | |
| 132 ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ | |
| 133 ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ | |
| 134 ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ | |
| 135 ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ | |
| 136 ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ | |
| 137 (uint64_t)((const uint8_t*)(x))[0]) | |
| 727 | 138 #endif |
| 139 #ifndef AV_WL64 | |
| 336 | 140 #define AV_WL64(p, d) do { \ |
| 335 | 141 ((uint8_t*)(p))[0] = (d); \ |
| 142 ((uint8_t*)(p))[1] = (d)>>8; \ | |
| 143 ((uint8_t*)(p))[2] = (d)>>16; \ | |
| 144 ((uint8_t*)(p))[3] = (d)>>24; \ | |
| 145 ((uint8_t*)(p))[4] = (d)>>32; \ | |
| 146 ((uint8_t*)(p))[5] = (d)>>40; \ | |
| 147 ((uint8_t*)(p))[6] = (d)>>48; \ | |
| 336 | 148 ((uint8_t*)(p))[7] = (d)>>56; } while(0) |
| 727 | 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 | |
| 524 | 244 |
| 245 #define AV_RB24(x) ((((const uint8_t*)(x))[0] << 16) | \ | |
| 246 (((const uint8_t*)(x))[1] << 8) | \ | |
| 247 ((const uint8_t*)(x))[2]) | |
| 248 #define AV_WB24(p, d) do { \ | |
| 249 ((uint8_t*)(p))[2] = (d); \ | |
| 250 ((uint8_t*)(p))[1] = (d)>>8; \ | |
| 251 ((uint8_t*)(p))[0] = (d)>>16; } while(0) | |
| 252 | |
| 253 #define AV_RL24(x) ((((const uint8_t*)(x))[2] << 16) | \ | |
| 254 (((const uint8_t*)(x))[1] << 8) | \ | |
| 255 ((const uint8_t*)(x))[0]) | |
| 256 #define AV_WL24(p, d) do { \ | |
| 257 ((uint8_t*)(p))[0] = (d); \ | |
| 258 ((uint8_t*)(p))[1] = (d)>>8; \ | |
| 259 ((uint8_t*)(p))[2] = (d)>>16; } while(0) | |
| 335 | 260 |
| 567 | 261 #endif /* AVUTIL_INTREADWRITE_H */ |
