media/libvpx/vpx_ports/mem_ops.h

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/media/libvpx/vpx_ports/mem_ops.h	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,222 @@
     1.4 +/*
     1.5 + *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
     1.6 + *
     1.7 + *  Use of this source code is governed by a BSD-style license
     1.8 + *  that can be found in the LICENSE file in the root of the source
     1.9 + *  tree. An additional intellectual property rights grant can be found
    1.10 + *  in the file PATENTS.  All contributing project authors may
    1.11 + *  be found in the AUTHORS file in the root of the source tree.
    1.12 + */
    1.13 +
    1.14 +
    1.15 +/* \file
    1.16 + * \brief Provides portable memory access primitives
    1.17 + *
    1.18 + * This function provides portable primitives for getting and setting of
    1.19 + * signed and unsigned integers in 16, 24, and 32 bit sizes. The operations
    1.20 + * can be performed on unaligned data regardless of hardware support for
    1.21 + * unaligned accesses.
    1.22 + *
    1.23 + * The type used to pass the integral values may be changed by defining
    1.24 + * MEM_VALUE_T with the appropriate type. The type given must be an integral
    1.25 + * numeric type.
    1.26 + *
    1.27 + * The actual functions instantiated have the MEM_VALUE_T type name pasted
    1.28 + * on to the symbol name. This allows the developer to instantiate these
    1.29 + * operations for multiple types within the same translation unit. This is
    1.30 + * of somewhat questionable utility, but the capability exists nonetheless.
    1.31 + * Users not making use of this functionality should call the functions
    1.32 + * without the type name appended, and the preprocessor will take care of
    1.33 + * it.
    1.34 + *
    1.35 + * NOTE: This code is not supported on platforms where char > 1 octet ATM.
    1.36 + */
    1.37 +
    1.38 +#ifndef MAU_T
    1.39 +/* Minimum Access Unit for this target */
    1.40 +#define MAU_T unsigned char
    1.41 +#endif
    1.42 +
    1.43 +#ifndef MEM_VALUE_T
    1.44 +#define MEM_VALUE_T int
    1.45 +#endif
    1.46 +
    1.47 +#undef MEM_VALUE_T_SZ_BITS
    1.48 +#define MEM_VALUE_T_SZ_BITS (sizeof(MEM_VALUE_T) << 3)
    1.49 +
    1.50 +#undef  mem_ops_wrap_symbol
    1.51 +#define mem_ops_wrap_symbol(fn) mem_ops_wrap_symbol2(fn, MEM_VALUE_T)
    1.52 +#undef  mem_ops_wrap_symbol2
    1.53 +#define mem_ops_wrap_symbol2(fn,typ) mem_ops_wrap_symbol3(fn,typ)
    1.54 +#undef  mem_ops_wrap_symbol3
    1.55 +#define mem_ops_wrap_symbol3(fn,typ) fn##_as_##typ
    1.56 +
    1.57 +/*
    1.58 + * Include aligned access routines
    1.59 + */
    1.60 +#define INCLUDED_BY_MEM_OPS_H
    1.61 +#include "mem_ops_aligned.h"
    1.62 +#undef  INCLUDED_BY_MEM_OPS_H
    1.63 +
    1.64 +#undef  mem_get_be16
    1.65 +#define mem_get_be16 mem_ops_wrap_symbol(mem_get_be16)
    1.66 +static unsigned MEM_VALUE_T mem_get_be16(const void *vmem) {
    1.67 +  unsigned MEM_VALUE_T  val;
    1.68 +  const MAU_T          *mem = (const MAU_T *)vmem;
    1.69 +
    1.70 +  val = mem[0] << 8;
    1.71 +  val |= mem[1];
    1.72 +  return val;
    1.73 +}
    1.74 +
    1.75 +#undef  mem_get_be24
    1.76 +#define mem_get_be24 mem_ops_wrap_symbol(mem_get_be24)
    1.77 +static unsigned MEM_VALUE_T mem_get_be24(const void *vmem) {
    1.78 +  unsigned MEM_VALUE_T  val;
    1.79 +  const MAU_T          *mem = (const MAU_T *)vmem;
    1.80 +
    1.81 +  val = mem[0] << 16;
    1.82 +  val |= mem[1] << 8;
    1.83 +  val |= mem[2];
    1.84 +  return val;
    1.85 +}
    1.86 +
    1.87 +#undef  mem_get_be32
    1.88 +#define mem_get_be32 mem_ops_wrap_symbol(mem_get_be32)
    1.89 +static unsigned MEM_VALUE_T mem_get_be32(const void *vmem) {
    1.90 +  unsigned MEM_VALUE_T  val;
    1.91 +  const MAU_T          *mem = (const MAU_T *)vmem;
    1.92 +
    1.93 +  val = mem[0] << 24;
    1.94 +  val |= mem[1] << 16;
    1.95 +  val |= mem[2] << 8;
    1.96 +  val |= mem[3];
    1.97 +  return val;
    1.98 +}
    1.99 +
   1.100 +#undef  mem_get_le16
   1.101 +#define mem_get_le16 mem_ops_wrap_symbol(mem_get_le16)
   1.102 +static unsigned MEM_VALUE_T mem_get_le16(const void *vmem) {
   1.103 +  unsigned MEM_VALUE_T  val;
   1.104 +  const MAU_T          *mem = (const MAU_T *)vmem;
   1.105 +
   1.106 +  val = mem[1] << 8;
   1.107 +  val |= mem[0];
   1.108 +  return val;
   1.109 +}
   1.110 +
   1.111 +#undef  mem_get_le24
   1.112 +#define mem_get_le24 mem_ops_wrap_symbol(mem_get_le24)
   1.113 +static unsigned MEM_VALUE_T mem_get_le24(const void *vmem) {
   1.114 +  unsigned MEM_VALUE_T  val;
   1.115 +  const MAU_T          *mem = (const MAU_T *)vmem;
   1.116 +
   1.117 +  val = mem[2] << 16;
   1.118 +  val |= mem[1] << 8;
   1.119 +  val |= mem[0];
   1.120 +  return val;
   1.121 +}
   1.122 +
   1.123 +#undef  mem_get_le32
   1.124 +#define mem_get_le32 mem_ops_wrap_symbol(mem_get_le32)
   1.125 +static unsigned MEM_VALUE_T mem_get_le32(const void *vmem) {
   1.126 +  unsigned MEM_VALUE_T  val;
   1.127 +  const MAU_T          *mem = (const MAU_T *)vmem;
   1.128 +
   1.129 +  val = mem[3] << 24;
   1.130 +  val |= mem[2] << 16;
   1.131 +  val |= mem[1] << 8;
   1.132 +  val |= mem[0];
   1.133 +  return val;
   1.134 +}
   1.135 +
   1.136 +#define mem_get_s_generic(end,sz) \
   1.137 +  static signed MEM_VALUE_T mem_get_s##end##sz(const void *vmem) {\
   1.138 +    const MAU_T *mem = (const MAU_T*)vmem;\
   1.139 +    signed MEM_VALUE_T val = mem_get_##end##sz(mem);\
   1.140 +    return (val << (MEM_VALUE_T_SZ_BITS - sz)) >> (MEM_VALUE_T_SZ_BITS - sz);\
   1.141 +  }
   1.142 +
   1.143 +#undef  mem_get_sbe16
   1.144 +#define mem_get_sbe16 mem_ops_wrap_symbol(mem_get_sbe16)
   1.145 +mem_get_s_generic(be, 16)
   1.146 +
   1.147 +#undef  mem_get_sbe24
   1.148 +#define mem_get_sbe24 mem_ops_wrap_symbol(mem_get_sbe24)
   1.149 +mem_get_s_generic(be, 24)
   1.150 +
   1.151 +#undef  mem_get_sbe32
   1.152 +#define mem_get_sbe32 mem_ops_wrap_symbol(mem_get_sbe32)
   1.153 +mem_get_s_generic(be, 32)
   1.154 +
   1.155 +#undef  mem_get_sle16
   1.156 +#define mem_get_sle16 mem_ops_wrap_symbol(mem_get_sle16)
   1.157 +mem_get_s_generic(le, 16)
   1.158 +
   1.159 +#undef  mem_get_sle24
   1.160 +#define mem_get_sle24 mem_ops_wrap_symbol(mem_get_sle24)
   1.161 +mem_get_s_generic(le, 24)
   1.162 +
   1.163 +#undef  mem_get_sle32
   1.164 +#define mem_get_sle32 mem_ops_wrap_symbol(mem_get_sle32)
   1.165 +mem_get_s_generic(le, 32)
   1.166 +
   1.167 +#undef  mem_put_be16
   1.168 +#define mem_put_be16 mem_ops_wrap_symbol(mem_put_be16)
   1.169 +static void mem_put_be16(void *vmem, MEM_VALUE_T val) {
   1.170 +  MAU_T *mem = (MAU_T *)vmem;
   1.171 +
   1.172 +  mem[0] = (val >> 8) & 0xff;
   1.173 +  mem[1] = (val >> 0) & 0xff;
   1.174 +}
   1.175 +
   1.176 +#undef  mem_put_be24
   1.177 +#define mem_put_be24 mem_ops_wrap_symbol(mem_put_be24)
   1.178 +static void mem_put_be24(void *vmem, MEM_VALUE_T val) {
   1.179 +  MAU_T *mem = (MAU_T *)vmem;
   1.180 +
   1.181 +  mem[0] = (val >> 16) & 0xff;
   1.182 +  mem[1] = (val >>  8) & 0xff;
   1.183 +  mem[2] = (val >>  0) & 0xff;
   1.184 +}
   1.185 +
   1.186 +#undef  mem_put_be32
   1.187 +#define mem_put_be32 mem_ops_wrap_symbol(mem_put_be32)
   1.188 +static void mem_put_be32(void *vmem, MEM_VALUE_T val) {
   1.189 +  MAU_T *mem = (MAU_T *)vmem;
   1.190 +
   1.191 +  mem[0] = (val >> 24) & 0xff;
   1.192 +  mem[1] = (val >> 16) & 0xff;
   1.193 +  mem[2] = (val >>  8) & 0xff;
   1.194 +  mem[3] = (val >>  0) & 0xff;
   1.195 +}
   1.196 +
   1.197 +#undef  mem_put_le16
   1.198 +#define mem_put_le16 mem_ops_wrap_symbol(mem_put_le16)
   1.199 +static void mem_put_le16(void *vmem, MEM_VALUE_T val) {
   1.200 +  MAU_T *mem = (MAU_T *)vmem;
   1.201 +
   1.202 +  mem[0] = (val >>  0) & 0xff;
   1.203 +  mem[1] = (val >>  8) & 0xff;
   1.204 +}
   1.205 +
   1.206 +#undef  mem_put_le24
   1.207 +#define mem_put_le24 mem_ops_wrap_symbol(mem_put_le24)
   1.208 +static void mem_put_le24(void *vmem, MEM_VALUE_T val) {
   1.209 +  MAU_T *mem = (MAU_T *)vmem;
   1.210 +
   1.211 +  mem[0] = (val >>  0) & 0xff;
   1.212 +  mem[1] = (val >>  8) & 0xff;
   1.213 +  mem[2] = (val >> 16) & 0xff;
   1.214 +}
   1.215 +
   1.216 +#undef  mem_put_le32
   1.217 +#define mem_put_le32 mem_ops_wrap_symbol(mem_put_le32)
   1.218 +static void mem_put_le32(void *vmem, MEM_VALUE_T val) {
   1.219 +  MAU_T *mem = (MAU_T *)vmem;
   1.220 +
   1.221 +  mem[0] = (val >>  0) & 0xff;
   1.222 +  mem[1] = (val >>  8) & 0xff;
   1.223 +  mem[2] = (val >> 16) & 0xff;
   1.224 +  mem[3] = (val >> 24) & 0xff;
   1.225 +}

mercurial