annotate ffmpeg/libavutil/intreadwrite.h @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * This file is part of FFmpeg.
yading@11 3 *
yading@11 4 * FFmpeg is free software; you can redistribute it and/or
yading@11 5 * modify it under the terms of the GNU Lesser General Public
yading@11 6 * License as published by the Free Software Foundation; either
yading@11 7 * version 2.1 of the License, or (at your option) any later version.
yading@11 8 *
yading@11 9 * FFmpeg is distributed in the hope that it will be useful,
yading@11 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 12 * Lesser General Public License for more details.
yading@11 13 *
yading@11 14 * You should have received a copy of the GNU Lesser General Public
yading@11 15 * License along with FFmpeg; if not, write to the Free Software
yading@11 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 17 */
yading@11 18
yading@11 19 #ifndef AVUTIL_INTREADWRITE_H
yading@11 20 #define AVUTIL_INTREADWRITE_H
yading@11 21
yading@11 22 #include <stdint.h>
yading@11 23 #include "libavutil/avconfig.h"
yading@11 24 #include "attributes.h"
yading@11 25 #include "bswap.h"
yading@11 26
yading@11 27 typedef union {
yading@11 28 uint64_t u64;
yading@11 29 uint32_t u32[2];
yading@11 30 uint16_t u16[4];
yading@11 31 uint8_t u8 [8];
yading@11 32 double f64;
yading@11 33 float f32[2];
yading@11 34 } av_alias av_alias64;
yading@11 35
yading@11 36 typedef union {
yading@11 37 uint32_t u32;
yading@11 38 uint16_t u16[2];
yading@11 39 uint8_t u8 [4];
yading@11 40 float f32;
yading@11 41 } av_alias av_alias32;
yading@11 42
yading@11 43 typedef union {
yading@11 44 uint16_t u16;
yading@11 45 uint8_t u8 [2];
yading@11 46 } av_alias av_alias16;
yading@11 47
yading@11 48 /*
yading@11 49 * Arch-specific headers can provide any combination of
yading@11 50 * AV_[RW][BLN](16|24|32|48|64) and AV_(COPY|SWAP|ZERO)(64|128) macros.
yading@11 51 * Preprocessor symbols must be defined, even if these are implemented
yading@11 52 * as inline functions.
yading@11 53 */
yading@11 54
yading@11 55 #ifdef HAVE_AV_CONFIG_H
yading@11 56
yading@11 57 #include "config.h"
yading@11 58
yading@11 59 #if ARCH_ARM
yading@11 60 # include "arm/intreadwrite.h"
yading@11 61 #elif ARCH_AVR32
yading@11 62 # include "avr32/intreadwrite.h"
yading@11 63 #elif ARCH_MIPS
yading@11 64 # include "mips/intreadwrite.h"
yading@11 65 #elif ARCH_PPC
yading@11 66 # include "ppc/intreadwrite.h"
yading@11 67 #elif ARCH_TOMI
yading@11 68 # include "tomi/intreadwrite.h"
yading@11 69 #elif ARCH_X86
yading@11 70 # include "x86/intreadwrite.h"
yading@11 71 #endif
yading@11 72
yading@11 73 #endif /* HAVE_AV_CONFIG_H */
yading@11 74
yading@11 75 /*
yading@11 76 * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers.
yading@11 77 */
yading@11 78
yading@11 79 #if AV_HAVE_BIGENDIAN
yading@11 80
yading@11 81 # if defined(AV_RN16) && !defined(AV_RB16)
yading@11 82 # define AV_RB16(p) AV_RN16(p)
yading@11 83 # elif !defined(AV_RN16) && defined(AV_RB16)
yading@11 84 # define AV_RN16(p) AV_RB16(p)
yading@11 85 # endif
yading@11 86
yading@11 87 # if defined(AV_WN16) && !defined(AV_WB16)
yading@11 88 # define AV_WB16(p, v) AV_WN16(p, v)
yading@11 89 # elif !defined(AV_WN16) && defined(AV_WB16)
yading@11 90 # define AV_WN16(p, v) AV_WB16(p, v)
yading@11 91 # endif
yading@11 92
yading@11 93 # if defined(AV_RN24) && !defined(AV_RB24)
yading@11 94 # define AV_RB24(p) AV_RN24(p)
yading@11 95 # elif !defined(AV_RN24) && defined(AV_RB24)
yading@11 96 # define AV_RN24(p) AV_RB24(p)
yading@11 97 # endif
yading@11 98
yading@11 99 # if defined(AV_WN24) && !defined(AV_WB24)
yading@11 100 # define AV_WB24(p, v) AV_WN24(p, v)
yading@11 101 # elif !defined(AV_WN24) && defined(AV_WB24)
yading@11 102 # define AV_WN24(p, v) AV_WB24(p, v)
yading@11 103 # endif
yading@11 104
yading@11 105 # if defined(AV_RN32) && !defined(AV_RB32)
yading@11 106 # define AV_RB32(p) AV_RN32(p)
yading@11 107 # elif !defined(AV_RN32) && defined(AV_RB32)
yading@11 108 # define AV_RN32(p) AV_RB32(p)
yading@11 109 # endif
yading@11 110
yading@11 111 # if defined(AV_WN32) && !defined(AV_WB32)
yading@11 112 # define AV_WB32(p, v) AV_WN32(p, v)
yading@11 113 # elif !defined(AV_WN32) && defined(AV_WB32)
yading@11 114 # define AV_WN32(p, v) AV_WB32(p, v)
yading@11 115 # endif
yading@11 116
yading@11 117 # if defined(AV_RN48) && !defined(AV_RB48)
yading@11 118 # define AV_RB48(p) AV_RN48(p)
yading@11 119 # elif !defined(AV_RN48) && defined(AV_RB48)
yading@11 120 # define AV_RN48(p) AV_RB48(p)
yading@11 121 # endif
yading@11 122
yading@11 123 # if defined(AV_WN48) && !defined(AV_WB48)
yading@11 124 # define AV_WB48(p, v) AV_WN48(p, v)
yading@11 125 # elif !defined(AV_WN48) && defined(AV_WB48)
yading@11 126 # define AV_WN48(p, v) AV_WB48(p, v)
yading@11 127 # endif
yading@11 128
yading@11 129 # if defined(AV_RN64) && !defined(AV_RB64)
yading@11 130 # define AV_RB64(p) AV_RN64(p)
yading@11 131 # elif !defined(AV_RN64) && defined(AV_RB64)
yading@11 132 # define AV_RN64(p) AV_RB64(p)
yading@11 133 # endif
yading@11 134
yading@11 135 # if defined(AV_WN64) && !defined(AV_WB64)
yading@11 136 # define AV_WB64(p, v) AV_WN64(p, v)
yading@11 137 # elif !defined(AV_WN64) && defined(AV_WB64)
yading@11 138 # define AV_WN64(p, v) AV_WB64(p, v)
yading@11 139 # endif
yading@11 140
yading@11 141 #else /* AV_HAVE_BIGENDIAN */
yading@11 142
yading@11 143 # if defined(AV_RN16) && !defined(AV_RL16)
yading@11 144 # define AV_RL16(p) AV_RN16(p)
yading@11 145 # elif !defined(AV_RN16) && defined(AV_RL16)
yading@11 146 # define AV_RN16(p) AV_RL16(p)
yading@11 147 # endif
yading@11 148
yading@11 149 # if defined(AV_WN16) && !defined(AV_WL16)
yading@11 150 # define AV_WL16(p, v) AV_WN16(p, v)
yading@11 151 # elif !defined(AV_WN16) && defined(AV_WL16)
yading@11 152 # define AV_WN16(p, v) AV_WL16(p, v)
yading@11 153 # endif
yading@11 154
yading@11 155 # if defined(AV_RN24) && !defined(AV_RL24)
yading@11 156 # define AV_RL24(p) AV_RN24(p)
yading@11 157 # elif !defined(AV_RN24) && defined(AV_RL24)
yading@11 158 # define AV_RN24(p) AV_RL24(p)
yading@11 159 # endif
yading@11 160
yading@11 161 # if defined(AV_WN24) && !defined(AV_WL24)
yading@11 162 # define AV_WL24(p, v) AV_WN24(p, v)
yading@11 163 # elif !defined(AV_WN24) && defined(AV_WL24)
yading@11 164 # define AV_WN24(p, v) AV_WL24(p, v)
yading@11 165 # endif
yading@11 166
yading@11 167 # if defined(AV_RN32) && !defined(AV_RL32)
yading@11 168 # define AV_RL32(p) AV_RN32(p)
yading@11 169 # elif !defined(AV_RN32) && defined(AV_RL32)
yading@11 170 # define AV_RN32(p) AV_RL32(p)
yading@11 171 # endif
yading@11 172
yading@11 173 # if defined(AV_WN32) && !defined(AV_WL32)
yading@11 174 # define AV_WL32(p, v) AV_WN32(p, v)
yading@11 175 # elif !defined(AV_WN32) && defined(AV_WL32)
yading@11 176 # define AV_WN32(p, v) AV_WL32(p, v)
yading@11 177 # endif
yading@11 178
yading@11 179 # if defined(AV_RN48) && !defined(AV_RL48)
yading@11 180 # define AV_RL48(p) AV_RN48(p)
yading@11 181 # elif !defined(AV_RN48) && defined(AV_RL48)
yading@11 182 # define AV_RN48(p) AV_RL48(p)
yading@11 183 # endif
yading@11 184
yading@11 185 # if defined(AV_WN48) && !defined(AV_WL48)
yading@11 186 # define AV_WL48(p, v) AV_WN48(p, v)
yading@11 187 # elif !defined(AV_WN48) && defined(AV_WL48)
yading@11 188 # define AV_WN48(p, v) AV_WL48(p, v)
yading@11 189 # endif
yading@11 190
yading@11 191 # if defined(AV_RN64) && !defined(AV_RL64)
yading@11 192 # define AV_RL64(p) AV_RN64(p)
yading@11 193 # elif !defined(AV_RN64) && defined(AV_RL64)
yading@11 194 # define AV_RN64(p) AV_RL64(p)
yading@11 195 # endif
yading@11 196
yading@11 197 # if defined(AV_WN64) && !defined(AV_WL64)
yading@11 198 # define AV_WL64(p, v) AV_WN64(p, v)
yading@11 199 # elif !defined(AV_WN64) && defined(AV_WL64)
yading@11 200 # define AV_WN64(p, v) AV_WL64(p, v)
yading@11 201 # endif
yading@11 202
yading@11 203 #endif /* !AV_HAVE_BIGENDIAN */
yading@11 204
yading@11 205 /*
yading@11 206 * Define AV_[RW]N helper macros to simplify definitions not provided
yading@11 207 * by per-arch headers.
yading@11 208 */
yading@11 209
yading@11 210 #if defined(__GNUC__) && !defined(__TI_COMPILER_VERSION__)
yading@11 211
yading@11 212 union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias;
yading@11 213 union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias;
yading@11 214 union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
yading@11 215
yading@11 216 # define AV_RN(s, p) (((const union unaligned_##s *) (p))->l)
yading@11 217 # define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v))
yading@11 218
yading@11 219 #elif defined(__DECC)
yading@11 220
yading@11 221 # define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p)))
yading@11 222 # define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v))
yading@11 223
yading@11 224 #elif AV_HAVE_FAST_UNALIGNED
yading@11 225
yading@11 226 # define AV_RN(s, p) (((const av_alias##s*)(p))->u##s)
yading@11 227 # define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v))
yading@11 228
yading@11 229 #else
yading@11 230
yading@11 231 #ifndef AV_RB16
yading@11 232 # define AV_RB16(x) \
yading@11 233 ((((const uint8_t*)(x))[0] << 8) | \
yading@11 234 ((const uint8_t*)(x))[1])
yading@11 235 #endif
yading@11 236 #ifndef AV_WB16
yading@11 237 # define AV_WB16(p, darg) do { \
yading@11 238 unsigned d = (darg); \
yading@11 239 ((uint8_t*)(p))[1] = (d); \
yading@11 240 ((uint8_t*)(p))[0] = (d)>>8; \
yading@11 241 } while(0)
yading@11 242 #endif
yading@11 243
yading@11 244 #ifndef AV_RL16
yading@11 245 # define AV_RL16(x) \
yading@11 246 ((((const uint8_t*)(x))[1] << 8) | \
yading@11 247 ((const uint8_t*)(x))[0])
yading@11 248 #endif
yading@11 249 #ifndef AV_WL16
yading@11 250 # define AV_WL16(p, darg) do { \
yading@11 251 unsigned d = (darg); \
yading@11 252 ((uint8_t*)(p))[0] = (d); \
yading@11 253 ((uint8_t*)(p))[1] = (d)>>8; \
yading@11 254 } while(0)
yading@11 255 #endif
yading@11 256
yading@11 257 #ifndef AV_RB32
yading@11 258 # define AV_RB32(x) \
yading@11 259 (((uint32_t)((const uint8_t*)(x))[0] << 24) | \
yading@11 260 (((const uint8_t*)(x))[1] << 16) | \
yading@11 261 (((const uint8_t*)(x))[2] << 8) | \
yading@11 262 ((const uint8_t*)(x))[3])
yading@11 263 #endif
yading@11 264 #ifndef AV_WB32
yading@11 265 # define AV_WB32(p, darg) do { \
yading@11 266 unsigned d = (darg); \
yading@11 267 ((uint8_t*)(p))[3] = (d); \
yading@11 268 ((uint8_t*)(p))[2] = (d)>>8; \
yading@11 269 ((uint8_t*)(p))[1] = (d)>>16; \
yading@11 270 ((uint8_t*)(p))[0] = (d)>>24; \
yading@11 271 } while(0)
yading@11 272 #endif
yading@11 273
yading@11 274 #ifndef AV_RL32
yading@11 275 # define AV_RL32(x) \
yading@11 276 (((uint32_t)((const uint8_t*)(x))[3] << 24) | \
yading@11 277 (((const uint8_t*)(x))[2] << 16) | \
yading@11 278 (((const uint8_t*)(x))[1] << 8) | \
yading@11 279 ((const uint8_t*)(x))[0])
yading@11 280 #endif
yading@11 281 #ifndef AV_WL32
yading@11 282 # define AV_WL32(p, darg) do { \
yading@11 283 unsigned d = (darg); \
yading@11 284 ((uint8_t*)(p))[0] = (d); \
yading@11 285 ((uint8_t*)(p))[1] = (d)>>8; \
yading@11 286 ((uint8_t*)(p))[2] = (d)>>16; \
yading@11 287 ((uint8_t*)(p))[3] = (d)>>24; \
yading@11 288 } while(0)
yading@11 289 #endif
yading@11 290
yading@11 291 #ifndef AV_RB64
yading@11 292 # define AV_RB64(x) \
yading@11 293 (((uint64_t)((const uint8_t*)(x))[0] << 56) | \
yading@11 294 ((uint64_t)((const uint8_t*)(x))[1] << 48) | \
yading@11 295 ((uint64_t)((const uint8_t*)(x))[2] << 40) | \
yading@11 296 ((uint64_t)((const uint8_t*)(x))[3] << 32) | \
yading@11 297 ((uint64_t)((const uint8_t*)(x))[4] << 24) | \
yading@11 298 ((uint64_t)((const uint8_t*)(x))[5] << 16) | \
yading@11 299 ((uint64_t)((const uint8_t*)(x))[6] << 8) | \
yading@11 300 (uint64_t)((const uint8_t*)(x))[7])
yading@11 301 #endif
yading@11 302 #ifndef AV_WB64
yading@11 303 # define AV_WB64(p, darg) do { \
yading@11 304 uint64_t d = (darg); \
yading@11 305 ((uint8_t*)(p))[7] = (d); \
yading@11 306 ((uint8_t*)(p))[6] = (d)>>8; \
yading@11 307 ((uint8_t*)(p))[5] = (d)>>16; \
yading@11 308 ((uint8_t*)(p))[4] = (d)>>24; \
yading@11 309 ((uint8_t*)(p))[3] = (d)>>32; \
yading@11 310 ((uint8_t*)(p))[2] = (d)>>40; \
yading@11 311 ((uint8_t*)(p))[1] = (d)>>48; \
yading@11 312 ((uint8_t*)(p))[0] = (d)>>56; \
yading@11 313 } while(0)
yading@11 314 #endif
yading@11 315
yading@11 316 #ifndef AV_RL64
yading@11 317 # define AV_RL64(x) \
yading@11 318 (((uint64_t)((const uint8_t*)(x))[7] << 56) | \
yading@11 319 ((uint64_t)((const uint8_t*)(x))[6] << 48) | \
yading@11 320 ((uint64_t)((const uint8_t*)(x))[5] << 40) | \
yading@11 321 ((uint64_t)((const uint8_t*)(x))[4] << 32) | \
yading@11 322 ((uint64_t)((const uint8_t*)(x))[3] << 24) | \
yading@11 323 ((uint64_t)((const uint8_t*)(x))[2] << 16) | \
yading@11 324 ((uint64_t)((const uint8_t*)(x))[1] << 8) | \
yading@11 325 (uint64_t)((const uint8_t*)(x))[0])
yading@11 326 #endif
yading@11 327 #ifndef AV_WL64
yading@11 328 # define AV_WL64(p, darg) do { \
yading@11 329 uint64_t d = (darg); \
yading@11 330 ((uint8_t*)(p))[0] = (d); \
yading@11 331 ((uint8_t*)(p))[1] = (d)>>8; \
yading@11 332 ((uint8_t*)(p))[2] = (d)>>16; \
yading@11 333 ((uint8_t*)(p))[3] = (d)>>24; \
yading@11 334 ((uint8_t*)(p))[4] = (d)>>32; \
yading@11 335 ((uint8_t*)(p))[5] = (d)>>40; \
yading@11 336 ((uint8_t*)(p))[6] = (d)>>48; \
yading@11 337 ((uint8_t*)(p))[7] = (d)>>56; \
yading@11 338 } while(0)
yading@11 339 #endif
yading@11 340
yading@11 341 #if AV_HAVE_BIGENDIAN
yading@11 342 # define AV_RN(s, p) AV_RB##s(p)
yading@11 343 # define AV_WN(s, p, v) AV_WB##s(p, v)
yading@11 344 #else
yading@11 345 # define AV_RN(s, p) AV_RL##s(p)
yading@11 346 # define AV_WN(s, p, v) AV_WL##s(p, v)
yading@11 347 #endif
yading@11 348
yading@11 349 #endif /* HAVE_FAST_UNALIGNED */
yading@11 350
yading@11 351 #ifndef AV_RN16
yading@11 352 # define AV_RN16(p) AV_RN(16, p)
yading@11 353 #endif
yading@11 354
yading@11 355 #ifndef AV_RN32
yading@11 356 # define AV_RN32(p) AV_RN(32, p)
yading@11 357 #endif
yading@11 358
yading@11 359 #ifndef AV_RN64
yading@11 360 # define AV_RN64(p) AV_RN(64, p)
yading@11 361 #endif
yading@11 362
yading@11 363 #ifndef AV_WN16
yading@11 364 # define AV_WN16(p, v) AV_WN(16, p, v)
yading@11 365 #endif
yading@11 366
yading@11 367 #ifndef AV_WN32
yading@11 368 # define AV_WN32(p, v) AV_WN(32, p, v)
yading@11 369 #endif
yading@11 370
yading@11 371 #ifndef AV_WN64
yading@11 372 # define AV_WN64(p, v) AV_WN(64, p, v)
yading@11 373 #endif
yading@11 374
yading@11 375 #if AV_HAVE_BIGENDIAN
yading@11 376 # define AV_RB(s, p) AV_RN##s(p)
yading@11 377 # define AV_WB(s, p, v) AV_WN##s(p, v)
yading@11 378 # define AV_RL(s, p) av_bswap##s(AV_RN##s(p))
yading@11 379 # define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v))
yading@11 380 #else
yading@11 381 # define AV_RB(s, p) av_bswap##s(AV_RN##s(p))
yading@11 382 # define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v))
yading@11 383 # define AV_RL(s, p) AV_RN##s(p)
yading@11 384 # define AV_WL(s, p, v) AV_WN##s(p, v)
yading@11 385 #endif
yading@11 386
yading@11 387 #define AV_RB8(x) (((const uint8_t*)(x))[0])
yading@11 388 #define AV_WB8(p, d) do { ((uint8_t*)(p))[0] = (d); } while(0)
yading@11 389
yading@11 390 #define AV_RL8(x) AV_RB8(x)
yading@11 391 #define AV_WL8(p, d) AV_WB8(p, d)
yading@11 392
yading@11 393 #ifndef AV_RB16
yading@11 394 # define AV_RB16(p) AV_RB(16, p)
yading@11 395 #endif
yading@11 396 #ifndef AV_WB16
yading@11 397 # define AV_WB16(p, v) AV_WB(16, p, v)
yading@11 398 #endif
yading@11 399
yading@11 400 #ifndef AV_RL16
yading@11 401 # define AV_RL16(p) AV_RL(16, p)
yading@11 402 #endif
yading@11 403 #ifndef AV_WL16
yading@11 404 # define AV_WL16(p, v) AV_WL(16, p, v)
yading@11 405 #endif
yading@11 406
yading@11 407 #ifndef AV_RB32
yading@11 408 # define AV_RB32(p) AV_RB(32, p)
yading@11 409 #endif
yading@11 410 #ifndef AV_WB32
yading@11 411 # define AV_WB32(p, v) AV_WB(32, p, v)
yading@11 412 #endif
yading@11 413
yading@11 414 #ifndef AV_RL32
yading@11 415 # define AV_RL32(p) AV_RL(32, p)
yading@11 416 #endif
yading@11 417 #ifndef AV_WL32
yading@11 418 # define AV_WL32(p, v) AV_WL(32, p, v)
yading@11 419 #endif
yading@11 420
yading@11 421 #ifndef AV_RB64
yading@11 422 # define AV_RB64(p) AV_RB(64, p)
yading@11 423 #endif
yading@11 424 #ifndef AV_WB64
yading@11 425 # define AV_WB64(p, v) AV_WB(64, p, v)
yading@11 426 #endif
yading@11 427
yading@11 428 #ifndef AV_RL64
yading@11 429 # define AV_RL64(p) AV_RL(64, p)
yading@11 430 #endif
yading@11 431 #ifndef AV_WL64
yading@11 432 # define AV_WL64(p, v) AV_WL(64, p, v)
yading@11 433 #endif
yading@11 434
yading@11 435 #ifndef AV_RB24
yading@11 436 # define AV_RB24(x) \
yading@11 437 ((((const uint8_t*)(x))[0] << 16) | \
yading@11 438 (((const uint8_t*)(x))[1] << 8) | \
yading@11 439 ((const uint8_t*)(x))[2])
yading@11 440 #endif
yading@11 441 #ifndef AV_WB24
yading@11 442 # define AV_WB24(p, d) do { \
yading@11 443 ((uint8_t*)(p))[2] = (d); \
yading@11 444 ((uint8_t*)(p))[1] = (d)>>8; \
yading@11 445 ((uint8_t*)(p))[0] = (d)>>16; \
yading@11 446 } while(0)
yading@11 447 #endif
yading@11 448
yading@11 449 #ifndef AV_RL24
yading@11 450 # define AV_RL24(x) \
yading@11 451 ((((const uint8_t*)(x))[2] << 16) | \
yading@11 452 (((const uint8_t*)(x))[1] << 8) | \
yading@11 453 ((const uint8_t*)(x))[0])
yading@11 454 #endif
yading@11 455 #ifndef AV_WL24
yading@11 456 # define AV_WL24(p, d) do { \
yading@11 457 ((uint8_t*)(p))[0] = (d); \
yading@11 458 ((uint8_t*)(p))[1] = (d)>>8; \
yading@11 459 ((uint8_t*)(p))[2] = (d)>>16; \
yading@11 460 } while(0)
yading@11 461 #endif
yading@11 462
yading@11 463 #ifndef AV_RB48
yading@11 464 # define AV_RB48(x) \
yading@11 465 (((uint64_t)((const uint8_t*)(x))[0] << 40) | \
yading@11 466 ((uint64_t)((const uint8_t*)(x))[1] << 32) | \
yading@11 467 ((uint64_t)((const uint8_t*)(x))[2] << 24) | \
yading@11 468 ((uint64_t)((const uint8_t*)(x))[3] << 16) | \
yading@11 469 ((uint64_t)((const uint8_t*)(x))[4] << 8) | \
yading@11 470 (uint64_t)((const uint8_t*)(x))[5])
yading@11 471 #endif
yading@11 472 #ifndef AV_WB48
yading@11 473 # define AV_WB48(p, darg) do { \
yading@11 474 uint64_t d = (darg); \
yading@11 475 ((uint8_t*)(p))[5] = (d); \
yading@11 476 ((uint8_t*)(p))[4] = (d)>>8; \
yading@11 477 ((uint8_t*)(p))[3] = (d)>>16; \
yading@11 478 ((uint8_t*)(p))[2] = (d)>>24; \
yading@11 479 ((uint8_t*)(p))[1] = (d)>>32; \
yading@11 480 ((uint8_t*)(p))[0] = (d)>>40; \
yading@11 481 } while(0)
yading@11 482 #endif
yading@11 483
yading@11 484 #ifndef AV_RL48
yading@11 485 # define AV_RL48(x) \
yading@11 486 (((uint64_t)((const uint8_t*)(x))[5] << 40) | \
yading@11 487 ((uint64_t)((const uint8_t*)(x))[4] << 32) | \
yading@11 488 ((uint64_t)((const uint8_t*)(x))[3] << 24) | \
yading@11 489 ((uint64_t)((const uint8_t*)(x))[2] << 16) | \
yading@11 490 ((uint64_t)((const uint8_t*)(x))[1] << 8) | \
yading@11 491 (uint64_t)((const uint8_t*)(x))[0])
yading@11 492 #endif
yading@11 493 #ifndef AV_WL48
yading@11 494 # define AV_WL48(p, darg) do { \
yading@11 495 uint64_t d = (darg); \
yading@11 496 ((uint8_t*)(p))[0] = (d); \
yading@11 497 ((uint8_t*)(p))[1] = (d)>>8; \
yading@11 498 ((uint8_t*)(p))[2] = (d)>>16; \
yading@11 499 ((uint8_t*)(p))[3] = (d)>>24; \
yading@11 500 ((uint8_t*)(p))[4] = (d)>>32; \
yading@11 501 ((uint8_t*)(p))[5] = (d)>>40; \
yading@11 502 } while(0)
yading@11 503 #endif
yading@11 504
yading@11 505 /*
yading@11 506 * The AV_[RW]NA macros access naturally aligned data
yading@11 507 * in a type-safe way.
yading@11 508 */
yading@11 509
yading@11 510 #define AV_RNA(s, p) (((const av_alias##s*)(p))->u##s)
yading@11 511 #define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v))
yading@11 512
yading@11 513 #ifndef AV_RN16A
yading@11 514 # define AV_RN16A(p) AV_RNA(16, p)
yading@11 515 #endif
yading@11 516
yading@11 517 #ifndef AV_RN32A
yading@11 518 # define AV_RN32A(p) AV_RNA(32, p)
yading@11 519 #endif
yading@11 520
yading@11 521 #ifndef AV_RN64A
yading@11 522 # define AV_RN64A(p) AV_RNA(64, p)
yading@11 523 #endif
yading@11 524
yading@11 525 #ifndef AV_WN16A
yading@11 526 # define AV_WN16A(p, v) AV_WNA(16, p, v)
yading@11 527 #endif
yading@11 528
yading@11 529 #ifndef AV_WN32A
yading@11 530 # define AV_WN32A(p, v) AV_WNA(32, p, v)
yading@11 531 #endif
yading@11 532
yading@11 533 #ifndef AV_WN64A
yading@11 534 # define AV_WN64A(p, v) AV_WNA(64, p, v)
yading@11 535 #endif
yading@11 536
yading@11 537 /*
yading@11 538 * The AV_COPYxxU macros are suitable for copying data to/from unaligned
yading@11 539 * memory locations.
yading@11 540 */
yading@11 541
yading@11 542 #define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s));
yading@11 543
yading@11 544 #ifndef AV_COPY16U
yading@11 545 # define AV_COPY16U(d, s) AV_COPYU(16, d, s)
yading@11 546 #endif
yading@11 547
yading@11 548 #ifndef AV_COPY32U
yading@11 549 # define AV_COPY32U(d, s) AV_COPYU(32, d, s)
yading@11 550 #endif
yading@11 551
yading@11 552 #ifndef AV_COPY64U
yading@11 553 # define AV_COPY64U(d, s) AV_COPYU(64, d, s)
yading@11 554 #endif
yading@11 555
yading@11 556 #ifndef AV_COPY128U
yading@11 557 # define AV_COPY128U(d, s) \
yading@11 558 do { \
yading@11 559 AV_COPY64U(d, s); \
yading@11 560 AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8); \
yading@11 561 } while(0)
yading@11 562 #endif
yading@11 563
yading@11 564 /* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be
yading@11 565 * naturally aligned. They may be implemented using MMX,
yading@11 566 * so emms_c() must be called before using any float code
yading@11 567 * afterwards.
yading@11 568 */
yading@11 569
yading@11 570 #define AV_COPY(n, d, s) \
yading@11 571 (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n)
yading@11 572
yading@11 573 #ifndef AV_COPY16
yading@11 574 # define AV_COPY16(d, s) AV_COPY(16, d, s)
yading@11 575 #endif
yading@11 576
yading@11 577 #ifndef AV_COPY32
yading@11 578 # define AV_COPY32(d, s) AV_COPY(32, d, s)
yading@11 579 #endif
yading@11 580
yading@11 581 #ifndef AV_COPY64
yading@11 582 # define AV_COPY64(d, s) AV_COPY(64, d, s)
yading@11 583 #endif
yading@11 584
yading@11 585 #ifndef AV_COPY128
yading@11 586 # define AV_COPY128(d, s) \
yading@11 587 do { \
yading@11 588 AV_COPY64(d, s); \
yading@11 589 AV_COPY64((char*)(d)+8, (char*)(s)+8); \
yading@11 590 } while(0)
yading@11 591 #endif
yading@11 592
yading@11 593 #define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b))
yading@11 594
yading@11 595 #ifndef AV_SWAP64
yading@11 596 # define AV_SWAP64(a, b) AV_SWAP(64, a, b)
yading@11 597 #endif
yading@11 598
yading@11 599 #define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0)
yading@11 600
yading@11 601 #ifndef AV_ZERO16
yading@11 602 # define AV_ZERO16(d) AV_ZERO(16, d)
yading@11 603 #endif
yading@11 604
yading@11 605 #ifndef AV_ZERO32
yading@11 606 # define AV_ZERO32(d) AV_ZERO(32, d)
yading@11 607 #endif
yading@11 608
yading@11 609 #ifndef AV_ZERO64
yading@11 610 # define AV_ZERO64(d) AV_ZERO(64, d)
yading@11 611 #endif
yading@11 612
yading@11 613 #ifndef AV_ZERO128
yading@11 614 # define AV_ZERO128(d) \
yading@11 615 do { \
yading@11 616 AV_ZERO64(d); \
yading@11 617 AV_ZERO64((char*)(d)+8); \
yading@11 618 } while(0)
yading@11 619 #endif
yading@11 620
yading@11 621 #endif /* AVUTIL_INTREADWRITE_H */