annotate ffmpeg/libavcodec/mathops.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 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * simple math operations
yading@10 3 * Copyright (c) 2001, 2002 Fabrice Bellard
yading@10 4 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
yading@10 5 *
yading@10 6 * This file is part of FFmpeg.
yading@10 7 *
yading@10 8 * FFmpeg is free software; you can redistribute it and/or
yading@10 9 * modify it under the terms of the GNU Lesser General Public
yading@10 10 * License as published by the Free Software Foundation; either
yading@10 11 * version 2.1 of the License, or (at your option) any later version.
yading@10 12 *
yading@10 13 * FFmpeg is distributed in the hope that it will be useful,
yading@10 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 16 * Lesser General Public License for more details.
yading@10 17 *
yading@10 18 * You should have received a copy of the GNU Lesser General Public
yading@10 19 * License along with FFmpeg; if not, write to the Free Software
yading@10 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 21 */
yading@10 22 #ifndef AVCODEC_MATHOPS_H
yading@10 23 #define AVCODEC_MATHOPS_H
yading@10 24
yading@10 25 #include <stdint.h>
yading@10 26
yading@10 27 #include "libavutil/common.h"
yading@10 28 #include "config.h"
yading@10 29
yading@10 30 extern const uint32_t ff_inverse[257];
yading@10 31 extern const uint8_t ff_reverse[256];
yading@10 32 extern const uint8_t ff_sqrt_tab[256];
yading@10 33
yading@10 34 #if ARCH_ARM
yading@10 35 # include "arm/mathops.h"
yading@10 36 #elif ARCH_AVR32
yading@10 37 # include "avr32/mathops.h"
yading@10 38 #elif ARCH_BFIN
yading@10 39 # include "bfin/mathops.h"
yading@10 40 #elif ARCH_MIPS
yading@10 41 # include "mips/mathops.h"
yading@10 42 #elif ARCH_PPC
yading@10 43 # include "ppc/mathops.h"
yading@10 44 #elif ARCH_X86
yading@10 45 # include "x86/mathops.h"
yading@10 46 #endif
yading@10 47
yading@10 48 /* generic implementation */
yading@10 49
yading@10 50 #ifndef MUL64
yading@10 51 # define MUL64(a,b) ((int64_t)(a) * (int64_t)(b))
yading@10 52 #endif
yading@10 53
yading@10 54 #ifndef MULL
yading@10 55 # define MULL(a,b,s) (MUL64(a, b) >> (s))
yading@10 56 #endif
yading@10 57
yading@10 58 #ifndef MULH
yading@10 59 static av_always_inline int MULH(int a, int b){
yading@10 60 return MUL64(a, b) >> 32;
yading@10 61 }
yading@10 62 #endif
yading@10 63
yading@10 64 #ifndef UMULH
yading@10 65 static av_always_inline unsigned UMULH(unsigned a, unsigned b){
yading@10 66 return ((uint64_t)(a) * (uint64_t)(b))>>32;
yading@10 67 }
yading@10 68 #endif
yading@10 69
yading@10 70 #ifndef MAC64
yading@10 71 # define MAC64(d, a, b) ((d) += MUL64(a, b))
yading@10 72 #endif
yading@10 73
yading@10 74 #ifndef MLS64
yading@10 75 # define MLS64(d, a, b) ((d) -= MUL64(a, b))
yading@10 76 #endif
yading@10 77
yading@10 78 /* signed 16x16 -> 32 multiply add accumulate */
yading@10 79 #ifndef MAC16
yading@10 80 # define MAC16(rt, ra, rb) rt += (ra) * (rb)
yading@10 81 #endif
yading@10 82
yading@10 83 /* signed 16x16 -> 32 multiply */
yading@10 84 #ifndef MUL16
yading@10 85 # define MUL16(ra, rb) ((ra) * (rb))
yading@10 86 #endif
yading@10 87
yading@10 88 #ifndef MLS16
yading@10 89 # define MLS16(rt, ra, rb) ((rt) -= (ra) * (rb))
yading@10 90 #endif
yading@10 91
yading@10 92 /* median of 3 */
yading@10 93 #ifndef mid_pred
yading@10 94 #define mid_pred mid_pred
yading@10 95 static inline av_const int mid_pred(int a, int b, int c)
yading@10 96 {
yading@10 97 #if 0
yading@10 98 int t= (a-b)&((a-b)>>31);
yading@10 99 a-=t;
yading@10 100 b+=t;
yading@10 101 b-= (b-c)&((b-c)>>31);
yading@10 102 b+= (a-b)&((a-b)>>31);
yading@10 103
yading@10 104 return b;
yading@10 105 #else
yading@10 106 if(a>b){
yading@10 107 if(c>b){
yading@10 108 if(c>a) b=a;
yading@10 109 else b=c;
yading@10 110 }
yading@10 111 }else{
yading@10 112 if(b>c){
yading@10 113 if(c>a) b=c;
yading@10 114 else b=a;
yading@10 115 }
yading@10 116 }
yading@10 117 return b;
yading@10 118 #endif
yading@10 119 }
yading@10 120 #endif
yading@10 121
yading@10 122 #ifndef sign_extend
yading@10 123 static inline av_const int sign_extend(int val, unsigned bits)
yading@10 124 {
yading@10 125 unsigned shift = 8 * sizeof(int) - bits;
yading@10 126 union { unsigned u; int s; } v = { (unsigned) val << shift };
yading@10 127 return v.s >> shift;
yading@10 128 }
yading@10 129 #endif
yading@10 130
yading@10 131 #ifndef zero_extend
yading@10 132 static inline av_const unsigned zero_extend(unsigned val, unsigned bits)
yading@10 133 {
yading@10 134 return (val << ((8 * sizeof(int)) - bits)) >> ((8 * sizeof(int)) - bits);
yading@10 135 }
yading@10 136 #endif
yading@10 137
yading@10 138 #ifndef COPY3_IF_LT
yading@10 139 #define COPY3_IF_LT(x, y, a, b, c, d)\
yading@10 140 if ((y) < (x)) {\
yading@10 141 (x) = (y);\
yading@10 142 (a) = (b);\
yading@10 143 (c) = (d);\
yading@10 144 }
yading@10 145 #endif
yading@10 146
yading@10 147 #ifndef MASK_ABS
yading@10 148 #define MASK_ABS(mask, level) do { \
yading@10 149 mask = level >> 31; \
yading@10 150 level = (level ^ mask) - mask; \
yading@10 151 } while (0)
yading@10 152 #endif
yading@10 153
yading@10 154 #ifndef NEG_SSR32
yading@10 155 # define NEG_SSR32(a,s) ((( int32_t)(a))>>(32-(s)))
yading@10 156 #endif
yading@10 157
yading@10 158 #ifndef NEG_USR32
yading@10 159 # define NEG_USR32(a,s) (((uint32_t)(a))>>(32-(s)))
yading@10 160 #endif
yading@10 161
yading@10 162 #if HAVE_BIGENDIAN
yading@10 163 # ifndef PACK_2U8
yading@10 164 # define PACK_2U8(a,b) (((a) << 8) | (b))
yading@10 165 # endif
yading@10 166 # ifndef PACK_4U8
yading@10 167 # define PACK_4U8(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
yading@10 168 # endif
yading@10 169 # ifndef PACK_2U16
yading@10 170 # define PACK_2U16(a,b) (((a) << 16) | (b))
yading@10 171 # endif
yading@10 172 #else
yading@10 173 # ifndef PACK_2U8
yading@10 174 # define PACK_2U8(a,b) (((b) << 8) | (a))
yading@10 175 # endif
yading@10 176 # ifndef PACK_4U2
yading@10 177 # define PACK_4U8(a,b,c,d) (((d) << 24) | ((c) << 16) | ((b) << 8) | (a))
yading@10 178 # endif
yading@10 179 # ifndef PACK_2U16
yading@10 180 # define PACK_2U16(a,b) (((b) << 16) | (a))
yading@10 181 # endif
yading@10 182 #endif
yading@10 183
yading@10 184 #ifndef PACK_2S8
yading@10 185 # define PACK_2S8(a,b) PACK_2U8((a)&255, (b)&255)
yading@10 186 #endif
yading@10 187 #ifndef PACK_4S8
yading@10 188 # define PACK_4S8(a,b,c,d) PACK_4U8((a)&255, (b)&255, (c)&255, (d)&255)
yading@10 189 #endif
yading@10 190 #ifndef PACK_2S16
yading@10 191 # define PACK_2S16(a,b) PACK_2U16((a)&0xffff, (b)&0xffff)
yading@10 192 #endif
yading@10 193
yading@10 194 #ifndef FASTDIV
yading@10 195 # define FASTDIV(a,b) ((uint32_t)((((uint64_t)a) * ff_inverse[b]) >> 32))
yading@10 196 #endif /* FASTDIV */
yading@10 197
yading@10 198 static inline av_const unsigned int ff_sqrt(unsigned int a)
yading@10 199 {
yading@10 200 unsigned int b;
yading@10 201
yading@10 202 if (a < 255) return (ff_sqrt_tab[a + 1] - 1) >> 4;
yading@10 203 else if (a < (1 << 12)) b = ff_sqrt_tab[a >> 4] >> 2;
yading@10 204 #if !CONFIG_SMALL
yading@10 205 else if (a < (1 << 14)) b = ff_sqrt_tab[a >> 6] >> 1;
yading@10 206 else if (a < (1 << 16)) b = ff_sqrt_tab[a >> 8] ;
yading@10 207 #endif
yading@10 208 else {
yading@10 209 int s = av_log2_16bit(a >> 16) >> 1;
yading@10 210 unsigned int c = a >> (s + 2);
yading@10 211 b = ff_sqrt_tab[c >> (s + 8)];
yading@10 212 b = FASTDIV(c,b) + (b << s);
yading@10 213 }
yading@10 214
yading@10 215 return b - (a < b * b);
yading@10 216 }
yading@10 217
yading@10 218 #endif /* AVCODEC_MATHOPS_H */