Commit | Line | Data |
---|---|---|
04d7f601 DB |
1 | /* |
2 | * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | |
3 | * | |
2912e87a | 4 | * This file is part of Libav. |
b78e7197 | 5 | * |
2912e87a | 6 | * Libav is free software; you can redistribute it and/or |
04d7f601 DB |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either | |
b78e7197 | 9 | * version 2.1 of the License, or (at your option) any later version. |
04d7f601 | 10 | * |
2912e87a | 11 | * Libav is distributed in the hope that it will be useful, |
04d7f601 DB |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | * Lesser General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU Lesser General Public | |
2912e87a | 17 | * License along with Libav; if not, write to the Free Software |
04d7f601 DB |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ | |
20 | ||
05020c89 | 21 | /** |
ba87f080 | 22 | * @file |
89c9ff50 | 23 | * common internal API header |
05020c89 RD |
24 | */ |
25 | ||
98790382 SS |
26 | #ifndef AVUTIL_INTERNAL_H |
27 | #define AVUTIL_INTERNAL_H | |
05020c89 | 28 | |
318049b8 MR |
29 | #if !defined(DEBUG) && !defined(NDEBUG) |
30 | # define NDEBUG | |
31 | #endif | |
32 | ||
ed0fd852 | 33 | #include <limits.h> |
99545457 | 34 | #include <stdint.h> |
318049b8 MR |
35 | #include <stddef.h> |
36 | #include <assert.h> | |
dbef3f46 | 37 | #include "config.h" |
2ed6f399 | 38 | #include "attributes.h" |
2f5421d5 | 39 | #include "timer.h" |
d9f80ea2 AK |
40 | #include "dict.h" |
41 | ||
5e4c7ca2 | 42 | #ifndef attribute_align_arg |
820818a3 | 43 | #if ARCH_X86_32 && AV_GCC_VERSION_AT_LEAST(4,2) |
5e4c7ca2 RP |
44 | # define attribute_align_arg __attribute__((force_align_arg_pointer)) |
45 | #else | |
46 | # define attribute_align_arg | |
47 | #endif | |
48 | #endif | |
49 | ||
d66c52c2 MS |
50 | #if defined(_MSC_VER) && CONFIG_SHARED |
51 | # define av_export __declspec(dllimport) | |
52 | #else | |
53 | # define av_export | |
54 | #endif | |
55 | ||
cd107896 | 56 | #ifndef INT_BIT |
28499cc8 | 57 | # define INT_BIT (CHAR_BIT * sizeof(int)) |
cd107896 MR |
58 | #endif |
59 | ||
d31dbec3 | 60 | #define FF_ALLOC_OR_GOTO(ctx, p, size, label)\ |
e48a0966 | 61 | {\ |
ee155011 DB |
62 | p = av_malloc(size);\ |
63 | if (p == NULL && (size) != 0) {\ | |
d31dbec3 RP |
64 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ |
65 | goto label;\ | |
e48a0966 RP |
66 | }\ |
67 | } | |
68 | ||
d31dbec3 | 69 | #define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)\ |
05020c89 | 70 | {\ |
ee155011 DB |
71 | p = av_mallocz(size);\ |
72 | if (p == NULL && (size) != 0) {\ | |
d31dbec3 RP |
73 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ |
74 | goto label;\ | |
05020c89 RD |
75 | }\ |
76 | } | |
77 | ||
335ee1aa | 78 | #include "libm.h" |
7b04b8a0 | 79 | |
d80a7fe5 | 80 | /** |
49bd8e4b | 81 | * Return NULL if CONFIG_SMALL is true, otherwise the argument |
bfe3676f | 82 | * without modification. Used to disable the definition of strings |
d80a7fe5 AJ |
83 | * (for example AVCodec long_names). |
84 | */ | |
85 | #if CONFIG_SMALL | |
86 | # define NULL_IF_CONFIG_SMALL(x) NULL | |
87 | #else | |
88 | # define NULL_IF_CONFIG_SMALL(x) x | |
89 | #endif | |
90 | ||
33586ee7 MN |
91 | |
92 | /** | |
cae70f99 MR |
93 | * Define a function with only the non-default version specified. |
94 | * | |
95 | * On systems with ELF shared libraries, all symbols exported from | |
2912e87a | 96 | * Libav libraries are tagged with the name and major version of the |
cae70f99 MR |
97 | * library to which they belong. If a function is moved from one |
98 | * library to another, a wrapper must be retained in the original | |
99 | * location to preserve binary compatibility. | |
100 | * | |
101 | * Functions defined with this macro will never be used to resolve | |
102 | * symbols by the build-time linker. | |
103 | * | |
104 | * @param type return type of function | |
105 | * @param name name of function | |
106 | * @param args argument list of function | |
107 | * @param ver version tag to assign function | |
33586ee7 | 108 | */ |
b462d132 | 109 | #if HAVE_SYMVER_ASM_LABEL |
ccc87908 MR |
110 | # define FF_SYMVER(type, name, args, ver) \ |
111 | type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver); \ | |
b462d132 MR |
112 | type ff_##name args |
113 | #elif HAVE_SYMVER_GNU_ASM | |
ccc87908 MR |
114 | # define FF_SYMVER(type, name, args, ver) \ |
115 | __asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver); \ | |
116 | type ff_##name args; \ | |
b462d132 MR |
117 | type ff_##name args |
118 | #endif | |
119 | ||
37b00b47 | 120 | /** |
58c42af7 | 121 | * Return NULL if a threading library has not been enabled. |
37b00b47 AS |
122 | * Used to disable threading functions in AVCodec definitions |
123 | * when not needed. | |
124 | */ | |
125 | #if HAVE_THREADS | |
126 | # define ONLY_IF_THREADS_ENABLED(x) x | |
127 | #else | |
128 | # define ONLY_IF_THREADS_ENABLED(x) NULL | |
129 | #endif | |
130 | ||
17337f54 | 131 | #if HAVE_MMX_INLINE |
e9735572 RB |
132 | /** |
133 | * Empty mmx state. | |
134 | * this must be called between any dsp function and float/double code. | |
135 | * for example sin(); dsp->idct_put(); emms_c(); cos() | |
136 | */ | |
137 | static av_always_inline void emms_c(void) | |
138 | { | |
139 | __asm__ volatile ("emms" ::: "memory"); | |
140 | } | |
f80ddd5b RB |
141 | #elif HAVE_MMX && HAVE_MM_EMPTY |
142 | # include <mmintrin.h> | |
143 | # define emms_c _mm_empty | |
f4facd2c MS |
144 | #elif HAVE_MMX && HAVE_YASM |
145 | # include "libavutil/x86/emms.h" | |
146 | # define emms_c avpriv_emms_yasm | |
17337f54 | 147 | #else |
f80ddd5b | 148 | # define emms_c() |
17337f54 | 149 | #endif /* HAVE_MMX_INLINE */ |
e9735572 | 150 | |
98790382 | 151 | #endif /* AVUTIL_INTERNAL_H */ |