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 | ||
ab441e20 DB |
42 | #if ARCH_X86 |
43 | # include "x86/emms.h" | |
44 | #endif | |
45 | ||
4db96649 DB |
46 | #ifndef emms_c |
47 | # define emms_c() | |
48 | #endif | |
49 | ||
5e4c7ca2 | 50 | #ifndef attribute_align_arg |
820818a3 | 51 | #if ARCH_X86_32 && AV_GCC_VERSION_AT_LEAST(4,2) |
5e4c7ca2 RP |
52 | # define attribute_align_arg __attribute__((force_align_arg_pointer)) |
53 | #else | |
54 | # define attribute_align_arg | |
55 | #endif | |
56 | #endif | |
57 | ||
d66c52c2 MS |
58 | #if defined(_MSC_VER) && CONFIG_SHARED |
59 | # define av_export __declspec(dllimport) | |
60 | #else | |
61 | # define av_export | |
62 | #endif | |
63 | ||
cd107896 | 64 | #ifndef INT_BIT |
28499cc8 | 65 | # define INT_BIT (CHAR_BIT * sizeof(int)) |
cd107896 MR |
66 | #endif |
67 | ||
218aefce DB |
68 | // Some broken preprocessors need a second expansion |
69 | // to be forced to tokenize __VA_ARGS__ | |
fd1abf42 | 70 | #define E1(x) x |
218aefce DB |
71 | |
72 | #define LOCAL_ALIGNED_A(a, t, v, s, o, ...) \ | |
73 | uint8_t la_##v[sizeof(t s o) + (a)]; \ | |
74 | t (*v) o = (void *)FFALIGN((uintptr_t)la_##v, a) | |
75 | ||
76 | #define LOCAL_ALIGNED_D(a, t, v, s, o, ...) \ | |
77 | DECLARE_ALIGNED(a, t, la_##v) s o; \ | |
78 | t (*v) o = la_##v | |
79 | ||
fd1abf42 | 80 | #define LOCAL_ALIGNED(a, t, v, ...) E1(LOCAL_ALIGNED_A(a, t, v, __VA_ARGS__,,)) |
218aefce DB |
81 | |
82 | #if HAVE_LOCAL_ALIGNED_8 | |
fd1abf42 | 83 | # define LOCAL_ALIGNED_8(t, v, ...) E1(LOCAL_ALIGNED_D(8, t, v, __VA_ARGS__,,)) |
218aefce DB |
84 | #else |
85 | # define LOCAL_ALIGNED_8(t, v, ...) LOCAL_ALIGNED(8, t, v, __VA_ARGS__) | |
86 | #endif | |
87 | ||
88 | #if HAVE_LOCAL_ALIGNED_16 | |
fd1abf42 | 89 | # define LOCAL_ALIGNED_16(t, v, ...) E1(LOCAL_ALIGNED_D(16, t, v, __VA_ARGS__,,)) |
218aefce DB |
90 | #else |
91 | # define LOCAL_ALIGNED_16(t, v, ...) LOCAL_ALIGNED(16, t, v, __VA_ARGS__) | |
92 | #endif | |
93 | ||
d31dbec3 | 94 | #define FF_ALLOC_OR_GOTO(ctx, p, size, label)\ |
e48a0966 | 95 | {\ |
ee155011 DB |
96 | p = av_malloc(size);\ |
97 | if (p == NULL && (size) != 0) {\ | |
d31dbec3 RP |
98 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ |
99 | goto label;\ | |
e48a0966 RP |
100 | }\ |
101 | } | |
102 | ||
d31dbec3 | 103 | #define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)\ |
05020c89 | 104 | {\ |
ee155011 DB |
105 | p = av_mallocz(size);\ |
106 | if (p == NULL && (size) != 0) {\ | |
d31dbec3 RP |
107 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ |
108 | goto label;\ | |
05020c89 RD |
109 | }\ |
110 | } | |
111 | ||
335ee1aa | 112 | #include "libm.h" |
7b04b8a0 | 113 | |
d80a7fe5 | 114 | /** |
49bd8e4b | 115 | * Return NULL if CONFIG_SMALL is true, otherwise the argument |
bfe3676f | 116 | * without modification. Used to disable the definition of strings |
d80a7fe5 AJ |
117 | * (for example AVCodec long_names). |
118 | */ | |
119 | #if CONFIG_SMALL | |
120 | # define NULL_IF_CONFIG_SMALL(x) NULL | |
121 | #else | |
122 | # define NULL_IF_CONFIG_SMALL(x) x | |
123 | #endif | |
124 | ||
33586ee7 MN |
125 | |
126 | /** | |
cae70f99 MR |
127 | * Define a function with only the non-default version specified. |
128 | * | |
129 | * On systems with ELF shared libraries, all symbols exported from | |
2912e87a | 130 | * Libav libraries are tagged with the name and major version of the |
cae70f99 MR |
131 | * library to which they belong. If a function is moved from one |
132 | * library to another, a wrapper must be retained in the original | |
133 | * location to preserve binary compatibility. | |
134 | * | |
135 | * Functions defined with this macro will never be used to resolve | |
136 | * symbols by the build-time linker. | |
137 | * | |
138 | * @param type return type of function | |
139 | * @param name name of function | |
140 | * @param args argument list of function | |
141 | * @param ver version tag to assign function | |
33586ee7 | 142 | */ |
b462d132 | 143 | #if HAVE_SYMVER_ASM_LABEL |
ccc87908 MR |
144 | # define FF_SYMVER(type, name, args, ver) \ |
145 | type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver); \ | |
b462d132 MR |
146 | type ff_##name args |
147 | #elif HAVE_SYMVER_GNU_ASM | |
ccc87908 MR |
148 | # define FF_SYMVER(type, name, args, ver) \ |
149 | __asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver); \ | |
150 | type ff_##name args; \ | |
b462d132 MR |
151 | type ff_##name args |
152 | #endif | |
153 | ||
37b00b47 | 154 | /** |
58c42af7 | 155 | * Return NULL if a threading library has not been enabled. |
37b00b47 AS |
156 | * Used to disable threading functions in AVCodec definitions |
157 | * when not needed. | |
158 | */ | |
159 | #if HAVE_THREADS | |
160 | # define ONLY_IF_THREADS_ENABLED(x) x | |
161 | #else | |
162 | # define ONLY_IF_THREADS_ENABLED(x) NULL | |
163 | #endif | |
164 | ||
98790382 | 165 | #endif /* AVUTIL_INTERNAL_H */ |