| OLD | NEW |
| 1 /* | 1 /* |
| 2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | 2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> |
| 3 * | 3 * |
| 4 * This file is part of FFmpeg. | 4 * This file is part of FFmpeg. |
| 5 * | 5 * |
| 6 * FFmpeg is free software; you can redistribute it and/or | 6 * FFmpeg is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Lesser General Public | 7 * modify it under the terms of the GNU Lesser General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2.1 of the License, or (at your option) any later version. | 9 * version 2.1 of the License, or (at your option) any later version. |
| 10 * | 10 * |
| 11 * FFmpeg is distributed in the hope that it will be useful, | 11 * FFmpeg is distributed in the hope that it will be useful, |
| 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 * Lesser General Public License for more details. | 14 * Lesser General Public License for more details. |
| 15 * | 15 * |
| 16 * You should have received a copy of the GNU Lesser General Public | 16 * You should have received a copy of the GNU Lesser General Public |
| 17 * License along with FFmpeg; if not, write to the Free Software | 17 * License along with FFmpeg; if not, write to the Free Software |
| 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 19 */ | 19 */ |
| 20 | 20 |
| 21 /** | 21 /** |
| 22 * @file common.h | 22 * @file libavutil/common.h |
| 23 * common internal and external API header | 23 * common internal and external API header |
| 24 */ | 24 */ |
| 25 | 25 |
| 26 #ifndef AVUTIL_COMMON_H | 26 #ifndef AVUTIL_COMMON_H |
| 27 #define AVUTIL_COMMON_H | 27 #define AVUTIL_COMMON_H |
| 28 | 28 |
| 29 #include <ctype.h> |
| 30 #include <errno.h> |
| 29 #include <inttypes.h> | 31 #include <inttypes.h> |
| 32 #include <limits.h> |
| 33 #include <math.h> |
| 34 #include <stdio.h> |
| 35 #include <stdlib.h> |
| 36 #include <string.h> |
| 30 | 37 |
| 31 #ifdef HAVE_AV_CONFIG_H | 38 #ifdef __GNUC__ |
| 32 /* only include the following when compiling package */ | 39 # define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > x || __GNUC__ == x && __GNU
C_MINOR__ >= y) |
| 33 # include "config.h" | 40 #else |
| 34 | 41 # define AV_GCC_VERSION_AT_LEAST(x,y) 0 |
| 35 # include <stdlib.h> | 42 #endif |
| 36 # include <stdio.h> | |
| 37 # include <string.h> | |
| 38 # include <ctype.h> | |
| 39 # include <limits.h> | |
| 40 # include <errno.h> | |
| 41 # include <math.h> | |
| 42 #endif /* HAVE_AV_CONFIG_H */ | |
| 43 | |
| 44 #define AV_GCC_VERSION_AT_LEAST(x,y) (defined(__GNUC__) && (__GNUC__ > x || __GN
UC__ == x && __GNUC_MINOR__ >= y)) | |
| 45 | 43 |
| 46 #ifndef av_always_inline | 44 #ifndef av_always_inline |
| 47 #if AV_GCC_VERSION_AT_LEAST(3,1) | 45 #if AV_GCC_VERSION_AT_LEAST(3,1) |
| 48 # define av_always_inline __attribute__((always_inline)) inline | 46 # define av_always_inline __attribute__((always_inline)) inline |
| 49 #else | 47 #else |
| 50 # define av_always_inline inline | 48 # define av_always_inline inline |
| 51 #endif | 49 #endif |
| 52 #endif | 50 #endif |
| 53 | 51 |
| 54 #ifndef av_noinline | 52 #ifndef av_noinline |
| (...skipping 21 matching lines...) Expand all Loading... |
| 76 #endif | 74 #endif |
| 77 | 75 |
| 78 #ifndef av_cold | 76 #ifndef av_cold |
| 79 #if (!defined(__ICC) || __ICC > 1100) && AV_GCC_VERSION_AT_LEAST(4,3) | 77 #if (!defined(__ICC) || __ICC > 1100) && AV_GCC_VERSION_AT_LEAST(4,3) |
| 80 # define av_cold __attribute__((cold)) | 78 # define av_cold __attribute__((cold)) |
| 81 #else | 79 #else |
| 82 # define av_cold | 80 # define av_cold |
| 83 #endif | 81 #endif |
| 84 #endif | 82 #endif |
| 85 | 83 |
| 86 #ifdef HAVE_AV_CONFIG_H | 84 #ifndef av_flatten |
| 87 # include "internal.h" | 85 #if AV_GCC_VERSION_AT_LEAST(4,1) |
| 88 #endif /* HAVE_AV_CONFIG_H */ | 86 # define av_flatten __attribute__((flatten)) |
| 87 #else |
| 88 # define av_flatten |
| 89 #endif |
| 90 #endif |
| 89 | 91 |
| 90 #ifndef attribute_deprecated | 92 #ifndef attribute_deprecated |
| 91 #if AV_GCC_VERSION_AT_LEAST(3,1) | 93 #if AV_GCC_VERSION_AT_LEAST(3,1) |
| 92 # define attribute_deprecated __attribute__((deprecated)) | 94 # define attribute_deprecated __attribute__((deprecated)) |
| 93 #else | 95 #else |
| 94 # define attribute_deprecated | 96 # define attribute_deprecated |
| 95 #endif | 97 #endif |
| 96 #endif | 98 #endif |
| 97 | 99 |
| 98 #ifndef av_unused | 100 #ifndef av_unused |
| 99 #if defined(__GNUC__) | 101 #if defined(__GNUC__) |
| 100 # define av_unused __attribute__((unused)) | 102 # define av_unused __attribute__((unused)) |
| 101 #else | 103 #else |
| 102 # define av_unused | 104 # define av_unused |
| 103 #endif | 105 #endif |
| 104 #endif | 106 #endif |
| 105 | 107 |
| 106 #include "mem.h" | 108 #ifndef av_uninit |
| 109 #if defined(__GNUC__) && !defined(__ICC) |
| 110 # define av_uninit(x) x=x |
| 111 #else |
| 112 # define av_uninit(x) x |
| 113 #endif |
| 114 #endif |
| 107 | 115 |
| 108 //rounded divison & shift | 116 //rounded division & shift |
| 109 #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)
-1)>>(b)) | 117 #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)
-1)>>(b)) |
| 110 /* assume b>0 */ | 118 /* assume b>0 */ |
| 111 #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) | 119 #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) |
| 112 #define FFABS(a) ((a) >= 0 ? (a) : (-(a))) | 120 #define FFABS(a) ((a) >= 0 ? (a) : (-(a))) |
| 113 #define FFSIGN(a) ((a) > 0 ? 1 : -1) | 121 #define FFSIGN(a) ((a) > 0 ? 1 : -1) |
| 114 | 122 |
| 115 #define FFMAX(a,b) ((a) > (b) ? (a) : (b)) | 123 #define FFMAX(a,b) ((a) > (b) ? (a) : (b)) |
| 116 #define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) | 124 #define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) |
| 117 #define FFMIN(a,b) ((a) > (b) ? (b) : (a)) | 125 #define FFMIN(a,b) ((a) > (b) ? (b) : (a)) |
| 118 #define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) | 126 #define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) |
| (...skipping 25 matching lines...) Expand all Loading... |
| 144 int n = 0; | 152 int n = 0; |
| 145 if (v & 0xff00) { | 153 if (v & 0xff00) { |
| 146 v >>= 8; | 154 v >>= 8; |
| 147 n += 8; | 155 n += 8; |
| 148 } | 156 } |
| 149 n += ff_log2_tab[v]; | 157 n += ff_log2_tab[v]; |
| 150 | 158 |
| 151 return n; | 159 return n; |
| 152 } | 160 } |
| 153 | 161 |
| 154 /* median of 3 */ | |
| 155 static inline av_const int mid_pred(int a, int b, int c) | |
| 156 { | |
| 157 #if HAVE_CMOV | |
| 158 int i=b; | |
| 159 __asm__ volatile( | |
| 160 "cmp %2, %1 \n\t" | |
| 161 "cmovg %1, %0 \n\t" | |
| 162 "cmovg %2, %1 \n\t" | |
| 163 "cmp %3, %1 \n\t" | |
| 164 "cmovl %3, %1 \n\t" | |
| 165 "cmp %1, %0 \n\t" | |
| 166 "cmovg %1, %0 \n\t" | |
| 167 :"+&r"(i), "+&r"(a) | |
| 168 :"r"(b), "r"(c) | |
| 169 ); | |
| 170 return i; | |
| 171 #elif 0 | |
| 172 int t= (a-b)&((a-b)>>31); | |
| 173 a-=t; | |
| 174 b+=t; | |
| 175 b-= (b-c)&((b-c)>>31); | |
| 176 b+= (a-b)&((a-b)>>31); | |
| 177 | |
| 178 return b; | |
| 179 #else | |
| 180 if(a>b){ | |
| 181 if(c>b){ | |
| 182 if(c>a) b=a; | |
| 183 else b=c; | |
| 184 } | |
| 185 }else{ | |
| 186 if(b>c){ | |
| 187 if(c>a) b=c; | |
| 188 else b=a; | |
| 189 } | |
| 190 } | |
| 191 return b; | |
| 192 #endif | |
| 193 } | |
| 194 | |
| 195 /** | 162 /** |
| 196 * clip a signed integer value into the amin-amax range | 163 * Clips a signed integer value into the amin-amax range. |
| 197 * @param a value to clip | 164 * @param a value to clip |
| 198 * @param amin minimum value of the clip range | 165 * @param amin minimum value of the clip range |
| 199 * @param amax maximum value of the clip range | 166 * @param amax maximum value of the clip range |
| 200 * @return clipped value | 167 * @return clipped value |
| 201 */ | 168 */ |
| 202 static inline av_const int av_clip(int a, int amin, int amax) | 169 static inline av_const int av_clip(int a, int amin, int amax) |
| 203 { | 170 { |
| 204 if (a < amin) return amin; | 171 if (a < amin) return amin; |
| 205 else if (a > amax) return amax; | 172 else if (a > amax) return amax; |
| 206 else return a; | 173 else return a; |
| 207 } | 174 } |
| 208 | 175 |
| 209 /** | 176 /** |
| 210 * clip a signed integer value into the 0-255 range | 177 * Clips a signed integer value into the 0-255 range. |
| 211 * @param a value to clip | 178 * @param a value to clip |
| 212 * @return clipped value | 179 * @return clipped value |
| 213 */ | 180 */ |
| 214 static inline av_const uint8_t av_clip_uint8(int a) | 181 static inline av_const uint8_t av_clip_uint8(int a) |
| 215 { | 182 { |
| 216 if (a&(~255)) return (-a)>>31; | 183 if (a&(~255)) return (-a)>>31; |
| 217 else return a; | 184 else return a; |
| 218 } | 185 } |
| 219 | 186 |
| 220 /** | 187 /** |
| 221 * clip a signed integer value into the -32768,32767 range | 188 * Clips a signed integer value into the -32768,32767 range. |
| 222 * @param a value to clip | 189 * @param a value to clip |
| 223 * @return clipped value | 190 * @return clipped value |
| 224 */ | 191 */ |
| 225 static inline av_const int16_t av_clip_int16(int a) | 192 static inline av_const int16_t av_clip_int16(int a) |
| 226 { | 193 { |
| 227 if ((a+32768) & ~65535) return (a>>31) ^ 32767; | 194 if ((a+32768) & ~65535) return (a>>31) ^ 32767; |
| 228 else return a; | 195 else return a; |
| 229 } | 196 } |
| 230 | 197 |
| 231 /** | 198 /** |
| 232 * clip a float value into the amin-amax range | 199 * Clips a float value into the amin-amax range. |
| 233 * @param a value to clip | 200 * @param a value to clip |
| 234 * @param amin minimum value of the clip range | 201 * @param amin minimum value of the clip range |
| 235 * @param amax maximum value of the clip range | 202 * @param amax maximum value of the clip range |
| 236 * @return clipped value | 203 * @return clipped value |
| 237 */ | 204 */ |
| 238 static inline av_const float av_clipf(float a, float amin, float amax) | 205 static inline av_const float av_clipf(float a, float amin, float amax) |
| 239 { | 206 { |
| 240 if (a < amin) return amin; | 207 if (a < amin) return amin; |
| 241 else if (a > amax) return amax; | 208 else if (a > amax) return amax; |
| 242 else return a; | 209 else return a; |
| 243 } | 210 } |
| 244 | 211 |
| 245 /* math */ | |
| 246 int64_t av_const ff_gcd(int64_t a, int64_t b); | |
| 247 | |
| 248 /** | |
| 249 * converts fourcc string to int | |
| 250 */ | |
| 251 static inline av_pure int ff_get_fourcc(const char *s){ | |
| 252 #ifdef HAVE_AV_CONFIG_H | |
| 253 assert( strlen(s)==4 ); | |
| 254 #endif | |
| 255 | |
| 256 return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24); | |
| 257 } | |
| 258 | |
| 259 #define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24)) | 212 #define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24)) |
| 260 #define MKBETAG(a,b,c,d) (d | (c << 8) | (b << 16) | (a << 24)) | 213 #define MKBETAG(a,b,c,d) (d | (c << 8) | (b << 16) | (a << 24)) |
| 261 | 214 |
| 262 /*! | 215 /*! |
| 263 * \def GET_UTF8(val, GET_BYTE, ERROR) | 216 * \def GET_UTF8(val, GET_BYTE, ERROR) |
| 264 * converts a UTF-8 character (up to 4 bytes long) to its 32-bit UCS-4 encoded f
orm | 217 * Converts a UTF-8 character (up to 4 bytes long) to its 32-bit UCS-4 encoded f
orm |
| 265 * \param val is the output and should be of type uint32_t. It holds the convert
ed | 218 * \param val is the output and should be of type uint32_t. It holds the convert
ed |
| 266 * UCS-4 character and should be a left value. | 219 * UCS-4 character and should be a left value. |
| 267 * \param GET_BYTE gets UTF-8 encoded bytes from any proper source. It can be | 220 * \param GET_BYTE gets UTF-8 encoded bytes from any proper source. It can be |
| 268 * a function or a statement whose return value or evaluated value is of type | 221 * a function or a statement whose return value or evaluated value is of type |
| 269 * uint8_t. It will be executed up to 4 times for values in the valid UTF-8 rang
e, | 222 * uint8_t. It will be executed up to 4 times for values in the valid UTF-8 rang
e, |
| 270 * and up to 7 times in the general case. | 223 * and up to 7 times in the general case. |
| 271 * \param ERROR action that should be taken when an invalid UTF-8 byte is return
ed | 224 * \param ERROR action that should be taken when an invalid UTF-8 byte is return
ed |
| 272 * from GET_BYTE. It should be a statement that jumps out of the macro, | 225 * from GET_BYTE. It should be a statement that jumps out of the macro, |
| 273 * like exit(), goto, return, break, or continue. | 226 * like exit(), goto, return, break, or continue. |
| 274 */ | 227 */ |
| 275 #define GET_UTF8(val, GET_BYTE, ERROR)\ | 228 #define GET_UTF8(val, GET_BYTE, ERROR)\ |
| 276 val= GET_BYTE;\ | 229 val= GET_BYTE;\ |
| 277 {\ | 230 {\ |
| 278 int ones= 7 - av_log2(val ^ 255);\ | 231 int ones= 7 - av_log2(val ^ 255);\ |
| 279 if(ones==1)\ | 232 if(ones==1)\ |
| 280 ERROR\ | 233 ERROR\ |
| 281 val&= 127>>ones;\ | 234 val&= 127>>ones;\ |
| 282 while(--ones > 0){\ | 235 while(--ones > 0){\ |
| 283 int tmp= GET_BYTE - 128;\ | 236 int tmp= GET_BYTE - 128;\ |
| 284 if(tmp>>6)\ | 237 if(tmp>>6)\ |
| 285 ERROR\ | 238 ERROR\ |
| 286 val= (val<<6) + tmp;\ | 239 val= (val<<6) + tmp;\ |
| 287 }\ | 240 }\ |
| 288 } | 241 } |
| 289 | 242 |
| 290 /*! | 243 /*! |
| 291 * \def PUT_UTF8(val, tmp, PUT_BYTE) | 244 * \def PUT_UTF8(val, tmp, PUT_BYTE) |
| 292 * converts a 32-bit unicode character to its UTF-8 encoded form (up to 4 bytes
long). | 245 * Converts a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes
long). |
| 293 * \param val is an input only argument and should be of type uint32_t. It holds | 246 * \param val is an input-only argument and should be of type uint32_t. It holds |
| 294 * a ucs4 encoded unicode character that is to be converted to UTF-8. If | 247 * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If |
| 295 * val is given as a function it's executed only once. | 248 * val is given as a function it is executed only once. |
| 296 * \param tmp is a temporary variable and should be of type uint8_t. It | 249 * \param tmp is a temporary variable and should be of type uint8_t. It |
| 297 * represents an intermediate value during conversion that is to be | 250 * represents an intermediate value during conversion that is to be |
| 298 * outputted by PUT_BYTE. | 251 * output by PUT_BYTE. |
| 299 * \param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. | 252 * \param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. |
| 300 * It could be a function or a statement, and uses tmp as the input byte. | 253 * It could be a function or a statement, and uses tmp as the input byte. |
| 301 * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be | 254 * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be |
| 302 * executed up to 4 times for values in the valid UTF-8 range and up to | 255 * executed up to 4 times for values in the valid UTF-8 range and up to |
| 303 * 7 times in the general case, depending on the length of the converted | 256 * 7 times in the general case, depending on the length of the converted |
| 304 * unicode character. | 257 * Unicode character. |
| 305 */ | 258 */ |
| 306 #define PUT_UTF8(val, tmp, PUT_BYTE)\ | 259 #define PUT_UTF8(val, tmp, PUT_BYTE)\ |
| 307 {\ | 260 {\ |
| 308 int bytes, shift;\ | 261 int bytes, shift;\ |
| 309 uint32_t in = val;\ | 262 uint32_t in = val;\ |
| 310 if (in < 0x80) {\ | 263 if (in < 0x80) {\ |
| 311 tmp = in;\ | 264 tmp = in;\ |
| 312 PUT_BYTE\ | 265 PUT_BYTE\ |
| 313 } else {\ | 266 } else {\ |
| 314 bytes = (av_log2(in) + 4) / 5;\ | 267 bytes = (av_log2(in) + 4) / 5;\ |
| 315 shift = (bytes - 1) * 6;\ | 268 shift = (bytes - 1) * 6;\ |
| 316 tmp = (256 - (256 >> bytes)) | (in >> shift);\ | 269 tmp = (256 - (256 >> bytes)) | (in >> shift);\ |
| 317 PUT_BYTE\ | 270 PUT_BYTE\ |
| 318 while (shift >= 6) {\ | 271 while (shift >= 6) {\ |
| 319 shift -= 6;\ | 272 shift -= 6;\ |
| 320 tmp = 0x80 | ((in >> shift) & 0x3f);\ | 273 tmp = 0x80 | ((in >> shift) & 0x3f);\ |
| 321 PUT_BYTE\ | 274 PUT_BYTE\ |
| 322 }\ | 275 }\ |
| 323 }\ | 276 }\ |
| 324 } | 277 } |
| 325 | 278 |
| 279 #include "mem.h" |
| 280 |
| 281 #ifdef HAVE_AV_CONFIG_H |
| 282 # include "config.h" |
| 283 # include "internal.h" |
| 284 #endif /* HAVE_AV_CONFIG_H */ |
| 285 |
| 326 #endif /* AVUTIL_COMMON_H */ | 286 #endif /* AVUTIL_COMMON_H */ |
| OLD | NEW |