Mercurial > libavutil.hg
annotate intreadwrite.h @ 734:ac8ea47c8d7e libavutil
Add @code/@endcode commands to markup C code in av_tree_insert() doxy.
| author | stefano |
|---|---|
| date | Sat, 09 May 2009 23:02:20 +0000 |
| parents | 753953ed8ff0 |
| children | 03f6641ce9e5 |
| 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 | |
| 728 | 32 #if ARCH_ARM |
| 33 # include "arm/intreadwrite.h" | |
| 729 | 34 #elif ARCH_PPC |
| 35 # include "ppc/intreadwrite.h" | |
| 728 | 36 #endif |
| 727 | 37 |
| 38 /* | |
| 39 * Define AV_[RW]N helper macros to simplify definitions not provided | |
| 40 * by per-arch headers. | |
| 41 */ | |
| 42 | |
| 43 #if defined(__GNUC__) | |
|
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
44 |
|
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
45 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
|
46 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
|
47 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
|
48 |
| 727 | 49 # define AV_RN(s, p) (((const struct unaligned_##s *) (p))->l) |
| 50 # 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
|
51 |
|
525
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
52 #elif defined(__DECC) |
|
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
53 |
| 727 | 54 # define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p))) |
| 55 # 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
|
56 |
| 727 | 57 #elif HAVE_FAST_UNALIGNED |
| 58 | |
| 59 # define AV_RN(s, p) (*((const uint##s##_t*)(p))) | |
| 60 # 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
|
61 |
|
0d4beab5e3c9
intreadwrite: support DEC compiler __unaligned type qualifier
mru
parents:
524
diff
changeset
|
62 #else |
|
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
63 |
| 727 | 64 #ifndef AV_RB16 |
| 65 #define AV_RB16(x) ((((const uint8_t*)(x))[0] << 8) | \ | |
| 66 ((const uint8_t*)(x))[1]) | |
| 67 #endif | |
| 68 #ifndef AV_WB16 | |
| 336 | 69 #define AV_WB16(p, d) do { \ |
| 235 | 70 ((uint8_t*)(p))[1] = (d); \ |
| 336 | 71 ((uint8_t*)(p))[0] = (d)>>8; } while(0) |
| 727 | 72 #endif |
|
232
9845a508ffbd
add AV_WB/WL for lswriting, similar to AV_RB/RL (also increment version)
alex
parents:
231
diff
changeset
|
73 |
| 727 | 74 #ifndef AV_RL16 |
| 444 | 75 #define AV_RL16(x) ((((const uint8_t*)(x))[1] << 8) | \ |
| 76 ((const uint8_t*)(x))[0]) | |
| 727 | 77 #endif |
| 78 #ifndef AV_WL16 | |
| 336 | 79 #define AV_WL16(p, d) do { \ |
|
326
46b4da5bf9ed
cosmetics: Reorder endianness macros by bit depth, alignment prettyprinting.
diego
parents:
282
diff
changeset
|
80 ((uint8_t*)(p))[0] = (d); \ |
| 336 | 81 ((uint8_t*)(p))[1] = (d)>>8; } while(0) |
| 727 | 82 #endif |
|
326
46b4da5bf9ed
cosmetics: Reorder endianness macros by bit depth, alignment prettyprinting.
diego
parents:
282
diff
changeset
|
83 |
| 727 | 84 #ifndef AV_RB32 |
| 444 | 85 #define AV_RB32(x) ((((const uint8_t*)(x))[0] << 24) | \ |
| 86 (((const uint8_t*)(x))[1] << 16) | \ | |
| 87 (((const uint8_t*)(x))[2] << 8) | \ | |
| 88 ((const uint8_t*)(x))[3]) | |
| 727 | 89 #endif |
| 90 #ifndef AV_WB32 | |
| 336 | 91 #define AV_WB32(p, d) do { \ |
| 235 | 92 ((uint8_t*)(p))[3] = (d); \ |
| 93 ((uint8_t*)(p))[2] = (d)>>8; \ | |
| 94 ((uint8_t*)(p))[1] = (d)>>16; \ | |
| 336 | 95 ((uint8_t*)(p))[0] = (d)>>24; } while(0) |
| 727 | 96 #endif |
|
232
9845a508ffbd
add AV_WB/WL for lswriting, similar to AV_RB/RL (also increment version)
alex
parents:
231
diff
changeset
|
97 |
| 727 | 98 #ifndef AV_RL32 |
| 444 | 99 #define AV_RL32(x) ((((const uint8_t*)(x))[3] << 24) | \ |
| 100 (((const uint8_t*)(x))[2] << 16) | \ | |
| 101 (((const uint8_t*)(x))[1] << 8) | \ | |
| 102 ((const uint8_t*)(x))[0]) | |
| 727 | 103 #endif |
| 104 #ifndef AV_WL32 | |
| 336 | 105 #define AV_WL32(p, d) do { \ |
| 235 | 106 ((uint8_t*)(p))[0] = (d); \ |
| 107 ((uint8_t*)(p))[1] = (d)>>8; \ | |
| 108 ((uint8_t*)(p))[2] = (d)>>16; \ | |
| 336 | 109 ((uint8_t*)(p))[3] = (d)>>24; } while(0) |
| 727 | 110 #endif |
|
152
5b211d03227b
Move BE_*/LE_*/ST*/LD* macros to a common place. Some further
reimar
parents:
diff
changeset
|
111 |
| 727 | 112 #ifndef AV_RB64 |
| 444 | 113 #define AV_RB64(x) (((uint64_t)((const uint8_t*)(x))[0] << 56) | \ |
| 114 ((uint64_t)((const uint8_t*)(x))[1] << 48) | \ | |
| 115 ((uint64_t)((const uint8_t*)(x))[2] << 40) | \ | |
| 116 ((uint64_t)((const uint8_t*)(x))[3] << 32) | \ | |
| 117 ((uint64_t)((const uint8_t*)(x))[4] << 24) | \ | |
| 118 ((uint64_t)((const uint8_t*)(x))[5] << 16) | \ | |
| 119 ((uint64_t)((const uint8_t*)(x))[6] << 8) | \ | |
| 120 (uint64_t)((const uint8_t*)(x))[7]) | |
| 727 | 121 #endif |
| 122 #ifndef AV_WB64 | |
| 336 | 123 #define AV_WB64(p, d) do { \ |
| 335 | 124 ((uint8_t*)(p))[7] = (d); \ |
| 125 ((uint8_t*)(p))[6] = (d)>>8; \ | |
| 126 ((uint8_t*)(p))[5] = (d)>>16; \ | |
| 127 ((uint8_t*)(p))[4] = (d)>>24; \ | |
| 128 ((uint8_t*)(p))[3] = (d)>>32; \ | |
| 129 ((uint8_t*)(p))[2] = (d)>>40; \ | |
| 130 ((uint8_t*)(p))[1] = (d)>>48; \ | |
| 336 | 131 ((uint8_t*)(p))[0] = (d)>>56; } while(0) |
| 727 | 132 #endif |
| 335 | 133 |
| 727 | 134 #ifndef AV_RL64 |
| 444 | 135 #define AV_RL64(x) (((uint64_t)((const uint8_t*)(x))[7] << 56) | \ |
| 136 ((uint64_t)((const uint8_t*)(x))[6] << 48) | \ | |
| 137 ((uint64_t)((const uint8_t*)(x))[5] << 40) | \ | |
| 138 ((uint64_t)((const uint8_t*)(x))[4] << 32) | \ | |
| 139 ((uint64_t)((const uint8_t*)(x))[3] << 24) | \ | |
| 140 ((uint64_t)((const uint8_t*)(x))[2] << 16) | \ | |
| 141 ((uint64_t)((const uint8_t*)(x))[1] << 8) | \ | |
| 142 (uint64_t)((const uint8_t*)(x))[0]) | |
| 727 | 143 #endif |
| 144 #ifndef AV_WL64 | |
| 336 | 145 #define AV_WL64(p, d) do { \ |
| 335 | 146 ((uint8_t*)(p))[0] = (d); \ |
| 147 ((uint8_t*)(p))[1] = (d)>>8; \ | |
| 148 ((uint8_t*)(p))[2] = (d)>>16; \ | |
| 149 ((uint8_t*)(p))[3] = (d)>>24; \ | |
| 150 ((uint8_t*)(p))[4] = (d)>>32; \ | |
| 151 ((uint8_t*)(p))[5] = (d)>>40; \ | |
| 152 ((uint8_t*)(p))[6] = (d)>>48; \ | |
| 336 | 153 ((uint8_t*)(p))[7] = (d)>>56; } while(0) |
| 727 | 154 #endif |
| 155 | |
| 156 #ifdef WORDS_BIGENDIAN | |
| 157 # define AV_RN(s, p) AV_RB##s(p) | |
| 158 # define AV_WN(s, p, v) AV_WB##s(p, v) | |
| 159 #else | |
| 160 # define AV_RN(s, p) AV_RL##s(p) | |
| 161 # define AV_WN(s, p, v) AV_WL##s(p, v) | |
| 162 #endif | |
| 163 | |
| 164 #endif /* HAVE_FAST_UNALIGNED */ | |
| 165 | |
| 166 #ifndef AV_RN16 | |
| 167 # define AV_RN16(p) AV_RN(16, p) | |
| 168 #endif | |
| 169 | |
| 170 #ifndef AV_RN32 | |
| 171 # define AV_RN32(p) AV_RN(32, p) | |
| 172 #endif | |
| 173 | |
| 174 #ifndef AV_RN64 | |
| 175 # define AV_RN64(p) AV_RN(64, p) | |
| 176 #endif | |
| 177 | |
| 178 #ifndef AV_WN16 | |
| 179 # define AV_WN16(p, v) AV_WN(16, p, v) | |
| 180 #endif | |
| 181 | |
| 182 #ifndef AV_WN32 | |
| 183 # define AV_WN32(p, v) AV_WN(32, p, v) | |
| 184 #endif | |
| 185 | |
| 186 #ifndef AV_WN64 | |
| 187 # define AV_WN64(p, v) AV_WN(64, p, v) | |
| 188 #endif | |
| 189 | |
| 190 #ifdef WORDS_BIGENDIAN | |
| 191 # define AV_RB(s, p) AV_RN(s, p) | |
| 192 # define AV_WB(s, p, v) AV_WN(s, p, v) | |
| 193 # define AV_RL(s, p) bswap_##s(AV_RN(s, p)) | |
| 194 # define AV_WL(s, p, v) AV_WN(s, p, bswap_##s(v)) | |
| 195 #else | |
| 196 # define AV_RB(s, p) bswap_##s(AV_RN(s, p)) | |
| 197 # define AV_WB(s, p, v) AV_WN(s, p, bswap_##s(v)) | |
| 198 # define AV_RL(s, p) AV_RN(s, p) | |
| 199 # define AV_WL(s, p, v) AV_WN(s, p, v) | |
| 200 #endif | |
| 201 | |
| 202 #define AV_RB8(x) (((const uint8_t*)(x))[0]) | |
| 203 #define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0) | |
| 204 | |
| 205 #define AV_RL8(x) AV_RB8(x) | |
| 206 #define AV_WL8(p, d) AV_WB8(p, d) | |
| 207 | |
| 208 #ifndef AV_RB16 | |
| 209 # define AV_RB16(p) AV_RB(16, p) | |
| 210 #endif | |
| 211 #ifndef AV_WB16 | |
| 212 # define AV_WB16(p, v) AV_WB(16, p, v) | |
| 213 #endif | |
| 214 | |
| 215 #ifndef AV_RL16 | |
| 216 # define AV_RL16(p) AV_RL(16, p) | |
| 217 #endif | |
| 218 #ifndef AV_WL16 | |
| 219 # define AV_WL16(p, v) AV_WL(16, p, v) | |
| 220 #endif | |
| 221 | |
| 222 #ifndef AV_RB32 | |
| 223 # define AV_RB32(p) AV_RB(32, p) | |
| 224 #endif | |
| 225 #ifndef AV_WB32 | |
| 226 # define AV_WB32(p, v) AV_WB(32, p, v) | |
| 227 #endif | |
| 228 | |
| 229 #ifndef AV_RL32 | |
| 230 # define AV_RL32(p) AV_RL(32, p) | |
| 231 #endif | |
| 232 #ifndef AV_WL32 | |
| 233 # define AV_WL32(p, v) AV_WL(32, p, v) | |
| 234 #endif | |
| 235 | |
| 236 #ifndef AV_RB64 | |
| 237 # define AV_RB64(p) AV_RB(64, p) | |
| 238 #endif | |
| 239 #ifndef AV_WB64 | |
| 240 # define AV_WB64(p, v) AV_WB(64, p, v) | |
| 241 #endif | |
| 242 | |
| 243 #ifndef AV_RL64 | |
| 244 # define AV_RL64(p) AV_RL(64, p) | |
| 245 #endif | |
| 246 #ifndef AV_WL64 | |
| 247 # define AV_WL64(p, v) AV_WL(64, p, v) | |
| 248 #endif | |
| 524 | 249 |
| 250 #define AV_RB24(x) ((((const uint8_t*)(x))[0] << 16) | \ | |
| 251 (((const uint8_t*)(x))[1] << 8) | \ | |
| 252 ((const uint8_t*)(x))[2]) | |
| 253 #define AV_WB24(p, d) do { \ | |
| 254 ((uint8_t*)(p))[2] = (d); \ | |
| 255 ((uint8_t*)(p))[1] = (d)>>8; \ | |
| 256 ((uint8_t*)(p))[0] = (d)>>16; } while(0) | |
| 257 | |
| 258 #define AV_RL24(x) ((((const uint8_t*)(x))[2] << 16) | \ | |
| 259 (((const uint8_t*)(x))[1] << 8) | \ | |
| 260 ((const uint8_t*)(x))[0]) | |
| 261 #define AV_WL24(p, d) do { \ | |
| 262 ((uint8_t*)(p))[0] = (d); \ | |
| 263 ((uint8_t*)(p))[1] = (d)>>8; \ | |
| 264 ((uint8_t*)(p))[2] = (d)>>16; } while(0) | |
| 335 | 265 |
| 567 | 266 #endif /* AVUTIL_INTREADWRITE_H */ |
