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 +}