Newer
Older
/*
* copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
*
Diego Biurrun
committed
* 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
Diego Biurrun
committed
* version 2.1 of the License, or (at your option) any later version.
Diego Biurrun
committed
* 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
Diego Biurrun
committed
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
Reimar Döffinger
committed
/**
Reimar Döffinger
committed
*/
#ifndef AVUTIL_INTERNAL_H
#define AVUTIL_INTERNAL_H
Reimar Döffinger
committed
#if !defined(DEBUG) && !defined(NDEBUG)
# define NDEBUG
#endif
#include <stddef.h>
#include <assert.h>
#include "config.h"
#include "attributes.h"
#ifndef attribute_align_arg
Carl Eugen Hoyos
committed
#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
* Mark a variable as used and prevent the compiler from optimizing it away.
* This is useful for asm that accesses varibles in ways that the compiler does not
#if AV_GCC_VERSION_AT_LEAST(3,1)
# define attribute_used __attribute__((used))
#else
# define attribute_used
#endif
#endif
#endif
#ifndef INT16_MAX
#define INT16_MAX 0x7fff
#endif
#ifndef INT32_MIN
#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)
#define INT64_MAX INT64_C(9223372036854775807)
#define UINT64_MAX UINT64_C(0xFFFFFFFFFFFFFFFF)
# define INT_BIT (CHAR_BIT * sizeof(int))
Reimar Döffinger
committed
#ifndef offsetof
# define offsetof(T, F) ((unsigned int)((char *)&((T *)0)->F))
Reimar Döffinger
committed
#endif
/* Use to export labels from asm. */
#define LABEL_MANGLE(a) EXTERN_PREFIX #a
Reimar Döffinger
committed
// Use rip-relative addressing if compiling PIC code on x86-64.
#if ARCH_X86_64 && defined(PIC)
# define LOCAL_MANGLE(a) #a "(%%rip)"
# define LOCAL_MANGLE(a) #a
Reimar Döffinger
committed
#define MANGLE(a) EXTERN_PREFIX LOCAL_MANGLE(a)
Reimar Döffinger
committed
/* debug stuff */
/* dprintf macros */
# define dprintf(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
Reimar Döffinger
committed
#define av_abort() do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0)
Reimar Döffinger
committed
Reimar Döffinger
committed
#define MASK_ABS(mask, level)\
"cltd \n\t"\
Reimar Döffinger
committed
"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;
Reimar Döffinger
committed
#endif
/* avoid usage of dangerous/inappropriate system functions */
Måns Rullgård
committed
#undef malloc
Reimar Döffinger
committed
#define malloc please_use_av_malloc
Måns Rullgård
committed
#undef free
Reimar Döffinger
committed
#define free please_use_av_free
Måns Rullgård
committed
#undef realloc
Reimar Döffinger
committed
#define realloc please_use_av_realloc
Måns Rullgård
committed
#undef time
Reimar Döffinger
committed
#define time time_is_forbidden_due_to_security_issues
Måns Rullgård
committed
#undef rand
#define rand rand_is_forbidden_due_to_state_trashing_use_av_lfg_get
Måns Rullgård
committed
#undef srand
#define srand srand_is_forbidden_due_to_state_trashing_use_av_lfg_init
Måns Rullgård
committed
#undef random
#define random random_is_forbidden_due_to_state_trashing_use_av_lfg_get
Måns Rullgård
committed
#undef sprintf
Reimar Döffinger
committed
#define sprintf sprintf_is_forbidden_due_to_security_issues_use_snprintf
Måns Rullgård
committed
#undef strcat
#define strcat strcat_is_forbidden_due_to_security_issues_use_av_strlcat
Måns Rullgård
committed
#undef exit
#ifndef LIBAVFORMAT_BUILD
Måns Rullgård
committed
#undef printf
#define printf please_use_av_log_instead_of_printf
Måns Rullgård
committed
#undef fprintf
#define fprintf please_use_av_log_instead_of_fprintf
#define puts please_use_av_log_instead_of_puts
#undef perror
#define perror please_use_av_log_instead_of_perror
Reimar Döffinger
committed
#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)\
Reimar Döffinger
committed
{\
p = av_mallocz(size);\
if (p == NULL && (size) != 0) {\
av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\
goto label;\
Reimar Döffinger
committed
}\
}
* Return NULL if CONFIG_SMALL is true, otherwise the argument
* without modification. Used to disable the definition of strings
* (for example AVCodec long_names).
*/
#if CONFIG_SMALL
# define NULL_IF_CONFIG_SMALL(x) NULL
#else
# define NULL_IF_CONFIG_SMALL(x) x
#endif
* Define a function with only the non-default version specified.
*
* On systems with ELF shared libraries, all symbols exported from
* FFmpeg libraries are tagged with the name and major version of the
* library to which they belong. If a function is moved from one
* library to another, a wrapper must be retained in the original
* location to preserve binary compatibility.
*
* Functions defined with this macro will never be used to resolve
* symbols by the build-time linker.
*
* @param type return type of function
* @param name name of function
* @param args argument list of function
* @param ver version tag to assign function
#if HAVE_SYMVER_ASM_LABEL
# define FF_SYMVER(type, name, args, ver) \
type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver); \
type ff_##name args
#elif HAVE_SYMVER_GNU_ASM
# define FF_SYMVER(type, name, args, ver) \
__asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver); \
type ff_##name args; \
type ff_##name args
#endif
#endif /* AVUTIL_INTERNAL_H */