/*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVUTIL_INTREADWRITE_H
#define AVUTIL_INTREADWRITE_H
#include <stdint.h>
#include "libavutil/avconfig.h"
#include "attributes.h"
#include "bswap.h"
typedef union {
uint64_t u64;
uint32_t u32[2 ];
uint16_t u16[4 ];
uint8_t u8 [8 ];
double f64;
float f32[2 ];
} av_alias av_alias64;
typedef union {
uint32_t u32;
uint16_t u16[2 ];
uint8_t u8 [4 ];
float f32;
} av_alias av_alias32;
typedef union {
uint16_t u16;
uint8_t u8 [2 ];
} av_alias av_alias16;
/*
* Arch-specific headers can provide any combination of
* AV_[RW][BLN](16|24|32|48|64) and AV_(COPY|SWAP|ZERO)(64|128) macros.
* Preprocessor symbols must be defined, even if these are implemented
* as inline functions.
*
* R/W means read/write, B/L/N means big/little/native endianness.
* The following macros require aligned access, compared to their
* unaligned variants: AV_(COPY|SWAP|ZERO)(64|128), AV_[RW]N[8-64]A.
* Incorrect usage may range from abysmal performance to crash
* depending on the platform.
*
* The unaligned variants are AV_[RW][BLN][8-64] and AV_COPY*U.
*/
#ifdef HAVE_AV_CONFIG_H
#include "config.h"
#if ARCH_AARCH64
# include "aarch64/intreadwrite.h"
#elif ARCH_MIPS
# include "mips/intreadwrite.h"
#elif ARCH_PPC
# include "ppc/intreadwrite.h"
#elif ARCH_X86
# include "x86/intreadwrite.h"
#endif
#endif /* HAVE_AV_CONFIG_H */
/*
* Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers.
*/
#if AV_HAVE_BIGENDIAN
# if defined (AV_RN16) && !defined (AV_RB16)
# define AV_RB16(p) AV_RN16(p)
# elif !defined (AV_RN16) && defined (AV_RB16)
# define AV_RN16(p) AV_RB16(p)
# endif
# if defined (AV_WN16) && !defined (AV_WB16)
# define AV_WB16(p, v) AV_WN16(p, v)
# elif !defined (AV_WN16) && defined (AV_WB16)
# define AV_WN16(p, v) AV_WB16(p, v)
# endif
# if defined (AV_RN24) && !defined (AV_RB24)
# define AV_RB24(p) AV_RN24(p)
# elif !defined (AV_RN24) && defined (AV_RB24)
# define AV_RN24(p) AV_RB24(p)
# endif
# if defined (AV_WN24) && !defined (AV_WB24)
# define AV_WB24(p, v) AV_WN24(p, v)
# elif !defined (AV_WN24) && defined (AV_WB24)
# define AV_WN24(p, v) AV_WB24(p, v)
# endif
# if defined (AV_RN32) && !defined (AV_RB32)
# define AV_RB32(p) AV_RN32(p)
# elif !defined (AV_RN32) && defined (AV_RB32)
# define AV_RN32(p) AV_RB32(p)
# endif
# if defined (AV_WN32) && !defined (AV_WB32)
# define AV_WB32(p, v) AV_WN32(p, v)
# elif !defined (AV_WN32) && defined (AV_WB32)
# define AV_WN32(p, v) AV_WB32(p, v)
# endif
# if defined (AV_RN48) && !defined (AV_RB48)
# define AV_RB48(p) AV_RN48(p)
# elif !defined (AV_RN48) && defined (AV_RB48)
# define AV_RN48(p) AV_RB48(p)
# endif
# if defined (AV_WN48) && !defined (AV_WB48)
# define AV_WB48(p, v) AV_WN48(p, v)
# elif !defined (AV_WN48) && defined (AV_WB48)
# define AV_WN48(p, v) AV_WB48(p, v)
# endif
# if defined (AV_RN64) && !defined (AV_RB64)
# define AV_RB64(p) AV_RN64(p)
# elif !defined (AV_RN64) && defined (AV_RB64)
# define AV_RN64(p) AV_RB64(p)
# endif
# if defined (AV_WN64) && !defined (AV_WB64)
# define AV_WB64(p, v) AV_WN64(p, v)
# elif !defined (AV_WN64) && defined (AV_WB64)
# define AV_WN64(p, v) AV_WB64(p, v)
# endif
#else /* AV_HAVE_BIGENDIAN */
# if defined (AV_RN16) && !defined (AV_RL16)
# define AV_RL16(p) AV_RN16(p)
# elif !defined (AV_RN16) && defined (AV_RL16)
# define AV_RN16(p) AV_RL16(p)
# endif
# if defined (AV_WN16) && !defined (AV_WL16)
# define AV_WL16(p, v) AV_WN16(p, v)
# elif !defined (AV_WN16) && defined (AV_WL16)
# define AV_WN16(p, v) AV_WL16(p, v)
# endif
# if defined (AV_RN24) && !defined (AV_RL24)
# define AV_RL24(p) AV_RN24(p)
# elif !defined (AV_RN24) && defined (AV_RL24)
# define AV_RN24(p) AV_RL24(p)
# endif
# if defined (AV_WN24) && !defined (AV_WL24)
# define AV_WL24(p, v) AV_WN24(p, v)
# elif !defined (AV_WN24) && defined (AV_WL24)
# define AV_WN24(p, v) AV_WL24(p, v)
# endif
# if defined (AV_RN32) && !defined (AV_RL32)
# define AV_RL32(p) AV_RN32(p)
# elif !defined (AV_RN32) && defined (AV_RL32)
# define AV_RN32(p) AV_RL32(p)
# endif
# if defined (AV_WN32) && !defined (AV_WL32)
# define AV_WL32(p, v) AV_WN32(p, v)
# elif !defined (AV_WN32) && defined (AV_WL32)
# define AV_WN32(p, v) AV_WL32(p, v)
# endif
# if defined (AV_RN48) && !defined (AV_RL48)
# define AV_RL48(p) AV_RN48(p)
# elif !defined (AV_RN48) && defined (AV_RL48)
# define AV_RN48(p) AV_RL48(p)
# endif
# if defined (AV_WN48) && !defined (AV_WL48)
# define AV_WL48(p, v) AV_WN48(p, v)
# elif !defined (AV_WN48) && defined (AV_WL48)
# define AV_WN48(p, v) AV_WL48(p, v)
# endif
# if defined (AV_RN64) && !defined (AV_RL64)
# define AV_RL64(p) AV_RN64(p)
# elif !defined (AV_RN64) && defined (AV_RL64)
# define AV_RN64(p) AV_RL64(p)
# endif
# if defined (AV_WN64) && !defined (AV_WL64)
# define AV_WL64(p, v) AV_WN64(p, v)
# elif !defined (AV_WN64) && defined (AV_WL64)
# define AV_WN64(p, v) AV_WL64(p, v)
# endif
#endif /* !AV_HAVE_BIGENDIAN */
/*
* Define AV_[RW]N helper macros to simplify definitions not provided
* by per-arch headers.
*/
#if defined (__GNUC__) || defined (__clang__)
union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias;
union unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias;
union unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;
# define AV_RN(s, p) (((const union unaligned_## s *) (p))->l)
# define AV_WN(s, p, v) ((((union unaligned_## s *) (p))->l) = (v))
#elif defined (_MSC_VER) && (defined (_M_ARM) || defined (_M_X64) || defined (_M_ARM64)) && AV_HAVE_FAST_UNALIGNED
# define AV_RN(s, p) (*((const __unaligned uint## s## _t*)(p)))
# define AV_WN(s, p, v) (*((__unaligned uint## s## _t*)(p)) = (v))
#elif AV_HAVE_FAST_UNALIGNED
# define AV_RN(s, p) (((const av_alias## s*)(p))->u## s)
# define AV_WN(s, p, v) (((av_alias## s*)(p))->u## s = (v))
#else
#ifndef AV_RB16
# define AV_RB16(x) \
((((const uint8_t*)(x))[0 ] << 8 ) | \
((const uint8_t*)(x))[1 ])
#endif
#ifndef AV_WB16
# define AV_WB16(p, val) do { \
uint16_t d = (val); \
((uint8_t*)(p))[1 ] = (d); \
((uint8_t*)(p))[0 ] = (d)>>8 ; \
} while (0 )
#endif
#ifndef AV_RL16
# define AV_RL16(x) \
((((const uint8_t*)(x))[1 ] << 8 ) | \
((const uint8_t*)(x))[0 ])
#endif
#ifndef AV_WL16
# define AV_WL16(p, val) do { \
uint16_t d = (val); \
((uint8_t*)(p))[0 ] = (d); \
((uint8_t*)(p))[1 ] = (d)>>8 ; \
} while (0 )
#endif
#ifndef AV_RB32
# define AV_RB32(x) \
(((uint32_t)((const uint8_t*)(x))[0 ] << 24 ) | \
(((const uint8_t*)(x))[1 ] << 16 ) | \
(((const uint8_t*)(x))[2 ] << 8 ) | \
((const uint8_t*)(x))[3 ])
#endif
#ifndef AV_WB32
# define AV_WB32(p, val) do { \
uint32_t d = (val); \
((uint8_t*)(p))[3 ] = (d); \
((uint8_t*)(p))[2 ] = (d)>>8 ; \
((uint8_t*)(p))[1 ] = (d)>>16 ; \
((uint8_t*)(p))[0 ] = (d)>>24 ; \
} while (0 )
#endif
#ifndef AV_RL32
# define AV_RL32(x) \
(((uint32_t)((const uint8_t*)(x))[3 ] << 24 ) | \
(((const uint8_t*)(x))[2 ] << 16 ) | \
(((const uint8_t*)(x))[1 ] << 8 ) | \
((const uint8_t*)(x))[0 ])
#endif
#ifndef AV_WL32
# define AV_WL32(p, val) do { \
uint32_t d = (val); \
((uint8_t*)(p))[0 ] = (d); \
((uint8_t*)(p))[1 ] = (d)>>8 ; \
((uint8_t*)(p))[2 ] = (d)>>16 ; \
((uint8_t*)(p))[3 ] = (d)>>24 ; \
} while (0 )
#endif
#ifndef AV_RB64
# define AV_RB64(x) \
(((uint64_t)((const uint8_t*)(x))[0 ] << 56 ) | \
((uint64_t)((const uint8_t*)(x))[1 ] << 48 ) | \
((uint64_t)((const uint8_t*)(x))[2 ] << 40 ) | \
((uint64_t)((const uint8_t*)(x))[3 ] << 32 ) | \
((uint64_t)((const uint8_t*)(x))[4 ] << 24 ) | \
((uint64_t)((const uint8_t*)(x))[5 ] << 16 ) | \
((uint64_t)((const uint8_t*)(x))[6 ] << 8 ) | \
(uint64_t)((const uint8_t*)(x))[7 ])
#endif
#ifndef AV_WB64
# define AV_WB64(p, val) do { \
uint64_t d = (val); \
((uint8_t*)(p))[7 ] = (d); \
((uint8_t*)(p))[6 ] = (d)>>8 ; \
((uint8_t*)(p))[5 ] = (d)>>16 ; \
((uint8_t*)(p))[4 ] = (d)>>24 ; \
((uint8_t*)(p))[3 ] = (d)>>32 ; \
((uint8_t*)(p))[2 ] = (d)>>40 ; \
((uint8_t*)(p))[1 ] = (d)>>48 ; \
((uint8_t*)(p))[0 ] = (d)>>56 ; \
} while (0 )
#endif
#ifndef AV_RL64
# define AV_RL64(x) \
(((uint64_t)((const uint8_t*)(x))[7 ] << 56 ) | \
((uint64_t)((const uint8_t*)(x))[6 ] << 48 ) | \
((uint64_t)((const uint8_t*)(x))[5 ] << 40 ) | \
((uint64_t)((const uint8_t*)(x))[4 ] << 32 ) | \
((uint64_t)((const uint8_t*)(x))[3 ] << 24 ) | \
((uint64_t)((const uint8_t*)(x))[2 ] << 16 ) | \
((uint64_t)((const uint8_t*)(x))[1 ] << 8 ) | \
(uint64_t)((const uint8_t*)(x))[0 ])
#endif
#ifndef AV_WL64
# define AV_WL64(p, val) do { \
uint64_t d = (val); \
((uint8_t*)(p))[0 ] = (d); \
((uint8_t*)(p))[1 ] = (d)>>8 ; \
((uint8_t*)(p))[2 ] = (d)>>16 ; \
((uint8_t*)(p))[3 ] = (d)>>24 ; \
((uint8_t*)(p))[4 ] = (d)>>32 ; \
((uint8_t*)(p))[5 ] = (d)>>40 ; \
((uint8_t*)(p))[6 ] = (d)>>48 ; \
((uint8_t*)(p))[7 ] = (d)>>56 ; \
} while (0 )
#endif
#if AV_HAVE_BIGENDIAN
# define AV_RN(s, p) AV_RB## s(p)
# define AV_WN(s, p, v) AV_WB## s(p, v)
#else
# define AV_RN(s, p) AV_RL## s(p)
# define AV_WN(s, p, v) AV_WL## s(p, v)
#endif
#endif /* HAVE_FAST_UNALIGNED */
#ifndef AV_RN16
# define AV_RN16(p) AV_RN(16 , p)
#endif
#ifndef AV_RN32
# define AV_RN32(p) AV_RN(32 , p)
#endif
#ifndef AV_RN64
# define AV_RN64(p) AV_RN(64 , p)
#endif
#ifndef AV_WN16
# define AV_WN16(p, v) AV_WN(16 , p, v)
#endif
#ifndef AV_WN32
# define AV_WN32(p, v) AV_WN(32 , p, v)
#endif
#ifndef AV_WN64
# define AV_WN64(p, v) AV_WN(64 , p, v)
#endif
#if AV_HAVE_BIGENDIAN
# define AV_RB(s, p) AV_RN## s(p)
# define AV_WB(s, p, v) AV_WN## s(p, v)
# define AV_RL(s, p) av_bswap## s(AV_RN## s(p))
# define AV_WL(s, p, v) AV_WN## s(p, av_bswap## s(v))
#else
# define AV_RB(s, p) av_bswap## s(AV_RN## s(p))
# define AV_WB(s, p, v) AV_WN## s(p, av_bswap## s(v))
# define AV_RL(s, p) AV_RN## s(p)
# define AV_WL(s, p, v) AV_WN## s(p, v)
#endif
#define AV_RB8(x) (((const uint8_t*)(x))[0 ])
#define AV_WB8(p, d) do { ((uint8_t*)(p))[0 ] = (d); } while (0 )
#define AV_RL8(x) AV_RB8(x)
#define AV_WL8(p, d) AV_WB8(p, d)
#ifndef AV_RB16
# define AV_RB16(p) AV_RB(16 , p)
#endif
#ifndef AV_WB16
# define AV_WB16(p, v) AV_WB(16 , p, v)
#endif
#ifndef AV_RL16
# define AV_RL16(p) AV_RL(16 , p)
#endif
#ifndef AV_WL16
# define AV_WL16(p, v) AV_WL(16 , p, v)
#endif
#ifndef AV_RB32
# define AV_RB32(p) AV_RB(32 , p)
#endif
#ifndef AV_WB32
# define AV_WB32(p, v) AV_WB(32 , p, v)
#endif
#ifndef AV_RL32
# define AV_RL32(p) AV_RL(32 , p)
#endif
#ifndef AV_WL32
# define AV_WL32(p, v) AV_WL(32 , p, v)
#endif
#ifndef AV_RB64
# define AV_RB64(p) AV_RB(64 , p)
#endif
#ifndef AV_WB64
# define AV_WB64(p, v) AV_WB(64 , p, v)
#endif
#ifndef AV_RL64
# define AV_RL64(p) AV_RL(64 , p)
#endif
#ifndef AV_WL64
# define AV_WL64(p, v) AV_WL(64 , p, v)
#endif
#ifndef AV_RB24
# define AV_RB24(x) \
((((const uint8_t*)(x))[0 ] << 16 ) | \
(((const uint8_t*)(x))[1 ] << 8 ) | \
((const uint8_t*)(x))[2 ])
#endif
#ifndef AV_WB24
# define AV_WB24(p, d) do { \
((uint8_t*)(p))[2 ] = (d); \
((uint8_t*)(p))[1 ] = (d)>>8 ; \
((uint8_t*)(p))[0 ] = (d)>>16 ; \
} while (0 )
#endif
#ifndef AV_RL24
# define AV_RL24(x) \
((((const uint8_t*)(x))[2 ] << 16 ) | \
(((const uint8_t*)(x))[1 ] << 8 ) | \
((const uint8_t*)(x))[0 ])
#endif
#ifndef AV_WL24
# define AV_WL24(p, d) do { \
((uint8_t*)(p))[0 ] = (d); \
((uint8_t*)(p))[1 ] = (d)>>8 ; \
((uint8_t*)(p))[2 ] = (d)>>16 ; \
} while (0 )
#endif
#ifndef AV_RB48
# define AV_RB48(x) \
(((uint64_t)((const uint8_t*)(x))[0 ] << 40 ) | \
((uint64_t)((const uint8_t*)(x))[1 ] << 32 ) | \
((uint64_t)((const uint8_t*)(x))[2 ] << 24 ) | \
((uint64_t)((const uint8_t*)(x))[3 ] << 16 ) | \
((uint64_t)((const uint8_t*)(x))[4 ] << 8 ) | \
(uint64_t)((const uint8_t*)(x))[5 ])
#endif
#ifndef AV_WB48
# define AV_WB48(p, darg) do { \
uint64_t d = (darg); \
((uint8_t*)(p))[5 ] = (d); \
((uint8_t*)(p))[4 ] = (d)>>8 ; \
((uint8_t*)(p))[3 ] = (d)>>16 ; \
((uint8_t*)(p))[2 ] = (d)>>24 ; \
((uint8_t*)(p))[1 ] = (d)>>32 ; \
((uint8_t*)(p))[0 ] = (d)>>40 ; \
} while (0 )
#endif
#ifndef AV_RL48
# define AV_RL48(x) \
(((uint64_t)((const uint8_t*)(x))[5 ] << 40 ) | \
((uint64_t)((const uint8_t*)(x))[4 ] << 32 ) | \
((uint64_t)((const uint8_t*)(x))[3 ] << 24 ) | \
((uint64_t)((const uint8_t*)(x))[2 ] << 16 ) | \
((uint64_t)((const uint8_t*)(x))[1 ] << 8 ) | \
(uint64_t)((const uint8_t*)(x))[0 ])
#endif
#ifndef AV_WL48
# define AV_WL48(p, darg) do { \
uint64_t d = (darg); \
((uint8_t*)(p))[0 ] = (d); \
((uint8_t*)(p))[1 ] = (d)>>8 ; \
((uint8_t*)(p))[2 ] = (d)>>16 ; \
((uint8_t*)(p))[3 ] = (d)>>24 ; \
((uint8_t*)(p))[4 ] = (d)>>32 ; \
((uint8_t*)(p))[5 ] = (d)>>40 ; \
} while (0 )
#endif
/*
* The AV_[RW]NA macros access naturally aligned data
* in a type-safe way.
*/
#define AV_RNA(s, p) (((const av_alias## s*)(p))->u## s)
#define AV_WNA(s, p, v) (((av_alias## s*)(p))->u## s = (v))
#ifndef AV_RN16A
# define AV_RN16A(p) AV_RNA(16 , p)
#endif
#ifndef AV_RN32A
# define AV_RN32A(p) AV_RNA(32 , p)
#endif
#ifndef AV_RN64A
# define AV_RN64A(p) AV_RNA(64 , p)
#endif
#ifndef AV_WN16A
# define AV_WN16A(p, v) AV_WNA(16 , p, v)
#endif
#ifndef AV_WN32A
# define AV_WN32A(p, v) AV_WNA(32 , p, v)
#endif
#ifndef AV_WN64A
# define AV_WN64A(p, v) AV_WNA(64 , p, v)
#endif
#if AV_HAVE_BIGENDIAN
# define AV_RLA(s, p) av_bswap## s(AV_RN## s## A(p))
# define AV_WLA(s, p, v) AV_WN## s## A(p, av_bswap## s(v))
# define AV_RBA(s, p) AV_RN## s## A(p)
# define AV_WBA(s, p, v) AV_WN## s## A(p, v)
#else
# define AV_RLA(s, p) AV_RN## s## A(p)
# define AV_WLA(s, p, v) AV_WN## s## A(p, v)
# define AV_RBA(s, p) av_bswap## s(AV_RN## s## A(p))
# define AV_WBA(s, p, v) AV_WN## s## A(p, av_bswap## s(v))
#endif
#ifndef AV_RL16A
# define AV_RL16A(p) AV_RLA(16 , p)
#endif
#ifndef AV_WL16A
# define AV_WL16A(p, v) AV_WLA(16 , p, v)
#endif
#ifndef AV_RB16A
# define AV_RB16A(p) AV_RBA(16 , p)
#endif
#ifndef AV_WB16A
# define AV_WB16A(p, v) AV_WBA(16 , p, v)
#endif
#ifndef AV_RL32A
# define AV_RL32A(p) AV_RLA(32 , p)
#endif
#ifndef AV_WL32A
# define AV_WL32A(p, v) AV_WLA(32 , p, v)
#endif
#ifndef AV_RB32A
# define AV_RB32A(p) AV_RBA(32 , p)
#endif
#ifndef AV_WB32A
# define AV_WB32A(p, v) AV_WBA(32 , p, v)
#endif
#ifndef AV_RL64A
# define AV_RL64A(p) AV_RLA(64 , p)
#endif
#ifndef AV_WL64A
# define AV_WL64A(p, v) AV_WLA(64 , p, v)
#endif
#ifndef AV_RB64A
# define AV_RB64A(p) AV_RBA(64 , p)
#endif
#ifndef AV_WB64A
# define AV_WB64A(p, v) AV_WBA(64 , p, v)
#endif
/*
* The AV_COPYxxU macros are suitable for copying data to/from unaligned
* memory locations.
*/
#define AV_COPYU(n, d, s) AV_WN## n(d, AV_RN## n(s));
#ifndef AV_COPY16U
# define AV_COPY16U(d, s) AV_COPYU(16 , d, s)
#endif
#ifndef AV_COPY32U
# define AV_COPY32U(d, s) AV_COPYU(32 , d, s)
#endif
#ifndef AV_COPY64U
# define AV_COPY64U(d, s) AV_COPYU(64 , d, s)
#endif
#ifndef AV_COPY128U
# define AV_COPY128U(d, s) \
do { \
AV_COPY64U(d, s); \
AV_COPY64U((char *)(d) + 8 , (const char *)(s) + 8 ); \
} while (0 )
#endif
/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be
* naturally aligned.
*/
#define AV_COPY(n, d, s) \
(((av_alias## n*)(d))->u## n = ((const av_alias## n*)(s))->u## n)
#ifndef AV_COPY16
# define AV_COPY16(d, s) AV_COPY(16 , d, s)
#endif
#ifndef AV_COPY32
# define AV_COPY32(d, s) AV_COPY(32 , d, s)
#endif
#ifndef AV_COPY64
# define AV_COPY64(d, s) AV_COPY(64 , d, s)
#endif
#ifndef AV_COPY128
# define AV_COPY128(d, s) \
do { \
AV_COPY64(d, s); \
AV_COPY64((char *)(d)+8 , (char *)(s)+8 ); \
} while (0 )
#endif
#define AV_SWAP(n, a, b) FFSWAP(av_alias## n, *(av_alias## n*)(a), *(av_alias## n*)(b))
#ifndef AV_SWAP64
# define AV_SWAP64(a, b) AV_SWAP(64 , a, b)
#endif
#define AV_ZERO(n, d) (((av_alias## n*)(d))->u## n = 0 )
#ifndef AV_ZERO16
# define AV_ZERO16(d) AV_ZERO(16 , d)
#endif
#ifndef AV_ZERO32
# define AV_ZERO32(d) AV_ZERO(32 , d)
#endif
#ifndef AV_ZERO64
# define AV_ZERO64(d) AV_ZERO(64 , d)
#endif
#ifndef AV_ZERO128
# define AV_ZERO128(d) \
do { \
AV_ZERO64(d); \
AV_ZERO64((char *)(d)+8 ); \
} while (0 )
#endif
#endif /* AVUTIL_INTREADWRITE_H */
Messung V0.5 in Prozent C=92 H=89 G=90
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-04)
¤
*© Formatika GbR, Deutschland