206 lines
5.5 KiB
C
206 lines
5.5 KiB
C
/*
|
|
* copyright (c) 2006 Michael Niedermayer <[email protected]>
|
|
*
|
|
* 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
|
|
*/
|
|
|
|
/**
|
|
* @file libavutil/internal.h
|
|
* common internal API header
|
|
*/
|
|
|
|
#ifndef AVUTIL_INTERNAL_H
|
|
#define AVUTIL_INTERNAL_H
|
|
|
|
#if !defined(DEBUG) && !defined(NDEBUG)
|
|
# define NDEBUG
|
|
#endif
|
|
|
|
#include <limits.h>
|
|
#include "common.h"
|
|
|
|
#ifndef attribute_align_arg
|
|
#if (!defined(__ICC) || __ICC > 1110) && AV_GCC_VERSION_AT_LEAST(4,2)
|
|
# define attribute_align_arg __attribute__((force_align_arg_pointer))
|
|
#else
|
|
# define attribute_align_arg
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef attribute_used
|
|
#if AV_GCC_VERSION_AT_LEAST(3,1)
|
|
# define attribute_used __attribute__((used))
|
|
#else
|
|
# define attribute_used
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef INT16_MIN
|
|
#define INT16_MIN (-0x7fff - 1)
|
|
#endif
|
|
|
|
#ifndef INT16_MAX
|
|
#define INT16_MAX 0x7fff
|
|
#endif
|
|
|
|
#ifndef INT32_MIN
|
|
#define INT32_MIN (-0x7fffffff - 1)
|
|
#endif
|
|
|
|
#ifndef INT32_MAX
|
|
#define INT32_MAX 0x7fffffff
|
|
#endif
|
|
|
|
#ifndef UINT32_MAX
|
|
#define UINT32_MAX 0xffffffff
|
|
#endif
|
|
|
|
#ifndef INT64_MIN
|
|
#define INT64_MIN (-0x7fffffffffffffffLL - 1)
|
|
#endif
|
|
|
|
#ifndef INT64_MAX
|
|
#define INT64_MAX INT64_C(9223372036854775807)
|
|
#endif
|
|
|
|
#ifndef UINT64_MAX
|
|
#define UINT64_MAX UINT64_C(0xFFFFFFFFFFFFFFFF)
|
|
#endif
|
|
|
|
#ifndef INT_BIT
|
|
# define INT_BIT (CHAR_BIT * sizeof(int))
|
|
#endif
|
|
|
|
#ifndef offsetof
|
|
# define offsetof(T, F) ((unsigned int)((char *)&((T *)0)->F))
|
|
#endif
|
|
|
|
/* Use to export labels from asm. */
|
|
#define LABEL_MANGLE(a) EXTERN_PREFIX #a
|
|
|
|
// Use rip-relative addressing if compiling PIC code on x86-64.
|
|
#if ARCH_X86_64 && defined(PIC)
|
|
# define LOCAL_MANGLE(a) #a "(%%rip)"
|
|
#else
|
|
# define LOCAL_MANGLE(a) #a
|
|
#endif
|
|
|
|
#define MANGLE(a) EXTERN_PREFIX LOCAL_MANGLE(a)
|
|
|
|
/* math */
|
|
|
|
extern const uint32_t ff_inverse[257];
|
|
|
|
#if CONFIG_FASTDIV
|
|
#define FASTDIV(a,b) ((uint32_t)((((uint64_t)a) * ff_inverse[b]) >> 32))
|
|
#else
|
|
#define FASTDIV(a,b) ((a) / (b))
|
|
#endif
|
|
|
|
const uint8_t ff_sqrt_tab[256]={
|
|
0, 16, 23, 28, 32, 36, 40, 43, 46, 48, 51, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 77, 79, 80, 82, 84, 85, 87, 88, 90,
|
|
91, 92, 94, 95, 96, 98, 99,100,102,103,104,105,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
|
|
128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,144,145,146,147,148,149,150,151,151,152,153,154,155,156,156,
|
|
157,158,159,160,160,161,162,163,164,164,165,166,167,168,168,169,170,171,171,172,173,174,174,175,176,176,177,178,179,179,180,181,
|
|
182,182,183,184,184,185,186,186,187,188,188,189,190,190,191,192,192,193,194,194,195,196,196,197,198,198,199,200,200,201,202,202,
|
|
203,204,204,205,205,206,207,207,208,208,209,210,210,211,212,212,213,213,214,215,215,216,216,217,218,218,219,219,220,220,221,222,
|
|
222,223,223,224,224,225,226,226,227,227,228,228,229,230,230,231,231,232,232,233,233,234,235,235,236,236,237,237,238,238,239,239,
|
|
240,240,241,242,242,243,243,244,244,245,245,246,246,247,247,248,248,249,249,250,250,251,251,252,252,253,253,254,254,255,255,255
|
|
};
|
|
|
|
|
|
static inline av_const unsigned int ff_sqrt(unsigned int a)
|
|
{
|
|
unsigned int b;
|
|
|
|
if (a < 255) {
|
|
return (ff_sqrt_tab[a + 1] - 1) >> 4;
|
|
} else if (a < (1 << 12)) {
|
|
b = ff_sqrt_tab[a >> 4] >> 2;
|
|
}
|
|
#if !CONFIG_SMALL
|
|
else if (a < (1 << 14)) {
|
|
b = ff_sqrt_tab[a >> 6] >> 1;
|
|
} else if (a < (1 << 16)) {
|
|
b = ff_sqrt_tab[a >> 8] ;
|
|
}
|
|
#endif
|
|
else {
|
|
int s = av_log2_16bit(a >> 16) >> 1;
|
|
unsigned int c = a >> (s + 2);
|
|
b = ff_sqrt_tab[c >> (s + 8)];
|
|
b = FASTDIV(c, b) + (b << s);
|
|
}
|
|
|
|
return b - (a < b * b);
|
|
}
|
|
|
|
#if ARCH_X86
|
|
#define MASK_ABS(mask, level)\
|
|
__asm__ volatile(\
|
|
"cltd \n\t"\
|
|
"xorl %1, %0 \n\t"\
|
|
"subl %1, %0 \n\t"\
|
|
: "+a" (level), "=&d" (mask)\
|
|
);
|
|
#else
|
|
#define MASK_ABS(mask, level)\
|
|
mask = level >> 31;\
|
|
level = (level ^ mask) - mask;
|
|
#endif
|
|
|
|
#if HAVE_CMOV
|
|
#define COPY3_IF_LT(x, y, a, b, c, d)\
|
|
__asm__ volatile(\
|
|
"cmpl %0, %3 \n\t"\
|
|
"cmovl %3, %0 \n\t"\
|
|
"cmovl %4, %1 \n\t"\
|
|
"cmovl %5, %2 \n\t"\
|
|
: "+&r" (x), "+&r" (a), "+r" (c)\
|
|
: "r" (y), "r" (b), "r" (d)\
|
|
);
|
|
#else
|
|
#define COPY3_IF_LT(x, y, a, b, c, d)\
|
|
if ((y) < (x)) {\
|
|
(x) = (y);\
|
|
(a) = (b);\
|
|
(c) = (d);\
|
|
}
|
|
#endif
|
|
|
|
#define FF_ALLOC_OR_GOTO(ctx, p, size, label)\
|
|
{\
|
|
p = av_malloc(size);\
|
|
if (p == NULL && (size) != 0) {\
|
|
av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\
|
|
goto label;\
|
|
}\
|
|
}
|
|
|
|
#define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)\
|
|
{\
|
|
p = av_mallocz(size);\
|
|
if (p == NULL && (size) != 0) {\
|
|
av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\
|
|
goto label;\
|
|
}\
|
|
}
|
|
|
|
#define NULL_IF_CONFIG_SMALL(x) x
|
|
|
|
#endif /* AVUTIL_INTERNAL_H */
|