yading@11: /* yading@11: * copyright (c) 2006 Michael Niedermayer yading@11: * yading@11: * This file is part of FFmpeg. yading@11: * yading@11: * FFmpeg is free software; you can redistribute it and/or yading@11: * modify it under the terms of the GNU Lesser General Public yading@11: * License as published by the Free Software Foundation; either yading@11: * version 2.1 of the License, or (at your option) any later version. yading@11: * yading@11: * FFmpeg is distributed in the hope that it will be useful, yading@11: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@11: * Lesser General Public License for more details. yading@11: * yading@11: * You should have received a copy of the GNU Lesser General Public yading@11: * License along with FFmpeg; if not, write to the Free Software yading@11: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@11: */ yading@11: yading@11: /** yading@11: * @file yading@11: * common internal API header yading@11: */ yading@11: yading@11: #ifndef AVUTIL_INTERNAL_H yading@11: #define AVUTIL_INTERNAL_H yading@11: yading@11: #if !defined(DEBUG) && !defined(NDEBUG) yading@11: # define NDEBUG yading@11: #endif yading@11: yading@11: #include yading@11: #include yading@11: #include yading@11: #include yading@11: #include "config.h" yading@11: #include "attributes.h" yading@11: #include "timer.h" yading@11: #include "cpu.h" yading@11: #include "dict.h" yading@11: yading@11: #if ARCH_X86 yading@11: # include "x86/emms.h" yading@11: #endif yading@11: yading@11: #ifndef emms_c yading@11: # define emms_c() yading@11: #endif yading@11: yading@11: #ifndef attribute_align_arg yading@11: #if ARCH_X86_32 && AV_GCC_VERSION_AT_LEAST(4,2) yading@11: # define attribute_align_arg __attribute__((force_align_arg_pointer)) yading@11: #else yading@11: # define attribute_align_arg yading@11: #endif yading@11: #endif yading@11: yading@11: #if defined(_MSC_VER) && CONFIG_SHARED yading@11: # define av_export __declspec(dllimport) yading@11: #else yading@11: # define av_export yading@11: #endif yading@11: yading@11: #ifndef INT_BIT yading@11: # define INT_BIT (CHAR_BIT * sizeof(int)) yading@11: #endif yading@11: yading@11: // Some broken preprocessors need a second expansion yading@11: // to be forced to tokenize __VA_ARGS__ yading@11: #define E1(x) x yading@11: yading@11: #define LOCAL_ALIGNED_A(a, t, v, s, o, ...) \ yading@11: uint8_t la_##v[sizeof(t s o) + (a)]; \ yading@11: t (*v) o = (void *)FFALIGN((uintptr_t)la_##v, a) yading@11: yading@11: #define LOCAL_ALIGNED_D(a, t, v, s, o, ...) \ yading@11: DECLARE_ALIGNED(a, t, la_##v) s o; \ yading@11: t (*v) o = la_##v yading@11: yading@11: #define LOCAL_ALIGNED(a, t, v, ...) E1(LOCAL_ALIGNED_A(a, t, v, __VA_ARGS__,,)) yading@11: yading@11: #if HAVE_LOCAL_ALIGNED_8 yading@11: # define LOCAL_ALIGNED_8(t, v, ...) E1(LOCAL_ALIGNED_D(8, t, v, __VA_ARGS__,,)) yading@11: #else yading@11: # define LOCAL_ALIGNED_8(t, v, ...) LOCAL_ALIGNED(8, t, v, __VA_ARGS__) yading@11: #endif yading@11: yading@11: #if HAVE_LOCAL_ALIGNED_16 yading@11: # define LOCAL_ALIGNED_16(t, v, ...) E1(LOCAL_ALIGNED_D(16, t, v, __VA_ARGS__,,)) yading@11: #else yading@11: # define LOCAL_ALIGNED_16(t, v, ...) LOCAL_ALIGNED(16, t, v, __VA_ARGS__) yading@11: #endif yading@11: yading@11: #define FF_ALLOC_OR_GOTO(ctx, p, size, label)\ yading@11: {\ yading@11: p = av_malloc(size);\ yading@11: if (p == NULL && (size) != 0) {\ yading@11: av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ yading@11: goto label;\ yading@11: }\ yading@11: } yading@11: yading@11: #define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)\ yading@11: {\ yading@11: p = av_mallocz(size);\ yading@11: if (p == NULL && (size) != 0) {\ yading@11: av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ yading@11: goto label;\ yading@11: }\ yading@11: } yading@11: yading@11: #include "libm.h" yading@11: yading@11: /** yading@11: * Return NULL if CONFIG_SMALL is true, otherwise the argument yading@11: * without modification. Used to disable the definition of strings yading@11: * (for example AVCodec long_names). yading@11: */ yading@11: #if CONFIG_SMALL yading@11: # define NULL_IF_CONFIG_SMALL(x) NULL yading@11: #else yading@11: # define NULL_IF_CONFIG_SMALL(x) x yading@11: #endif yading@11: yading@11: /** yading@11: * Define a function with only the non-default version specified. yading@11: * yading@11: * On systems with ELF shared libraries, all symbols exported from yading@11: * FFmpeg libraries are tagged with the name and major version of the yading@11: * library to which they belong. If a function is moved from one yading@11: * library to another, a wrapper must be retained in the original yading@11: * location to preserve binary compatibility. yading@11: * yading@11: * Functions defined with this macro will never be used to resolve yading@11: * symbols by the build-time linker. yading@11: * yading@11: * @param type return type of function yading@11: * @param name name of function yading@11: * @param args argument list of function yading@11: * @param ver version tag to assign function yading@11: */ yading@11: #if HAVE_SYMVER_ASM_LABEL yading@11: # define FF_SYMVER(type, name, args, ver) \ yading@11: type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver); \ yading@11: type ff_##name args yading@11: #elif HAVE_SYMVER_GNU_ASM yading@11: # define FF_SYMVER(type, name, args, ver) \ yading@11: __asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver); \ yading@11: type ff_##name args; \ yading@11: type ff_##name args yading@11: #endif yading@11: yading@11: /** yading@11: * Return NULL if a threading library has not been enabled. yading@11: * Used to disable threading functions in AVCodec definitions yading@11: * when not needed. yading@11: */ yading@11: #if HAVE_THREADS yading@11: # define ONLY_IF_THREADS_ENABLED(x) x yading@11: #else yading@11: # define ONLY_IF_THREADS_ENABLED(x) NULL yading@11: #endif yading@11: yading@11: /** yading@11: * Log a generic warning message about a missing feature. yading@11: * yading@11: * @param[in] avc a pointer to an arbitrary struct of which the first yading@11: * field is a pointer to an AVClass struct yading@11: * @param[in] msg string containing the name of the missing feature yading@11: */ yading@11: void avpriv_report_missing_feature(void *avc, yading@11: const char *msg, ...) av_printf_format(2, 3); yading@11: yading@11: /** yading@11: * Log a generic warning message about a missing feature. yading@11: * Additionally request that a sample showcasing the feature be uploaded. yading@11: * yading@11: * @param[in] avc a pointer to an arbitrary struct of which the first field is yading@11: * a pointer to an AVClass struct yading@11: * @param[in] msg string containing the name of the missing feature yading@11: */ yading@11: void avpriv_request_sample(void *avc, yading@11: const char *msg, ...) av_printf_format(2, 3); yading@11: yading@11: #endif /* AVUTIL_INTERNAL_H */