Commit | Line | Data |
---|---|---|
2ba45a60 DM |
1 | /* |
2 | * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | |
3 | * | |
4 | * This file is part of FFmpeg. | |
5 | * | |
6 | * FFmpeg is free software; you can redistribute it and/or | |
7 | * modify it under the terms of the GNU Lesser General Public | |
8 | * License as published by the Free Software Foundation; either | |
9 | * version 2.1 of the License, or (at your option) any later version. | |
10 | * | |
11 | * FFmpeg is distributed in the hope that it will be useful, | |
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 | |
17 | * License along with FFmpeg; if not, write to the Free Software | |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
19 | */ | |
20 | ||
21 | /** | |
22 | * @file | |
23 | * common internal API header | |
24 | */ | |
25 | ||
26 | #ifndef AVUTIL_INTERNAL_H | |
27 | #define AVUTIL_INTERNAL_H | |
28 | ||
29 | #if !defined(DEBUG) && !defined(NDEBUG) | |
30 | # define NDEBUG | |
31 | #endif | |
32 | ||
33 | #include <limits.h> | |
34 | #include <stdint.h> | |
35 | #include <stddef.h> | |
36 | #include <assert.h> | |
37 | #include "config.h" | |
38 | #include "attributes.h" | |
39 | #include "timer.h" | |
40 | #include "cpu.h" | |
41 | #include "dict.h" | |
42 | #include "pixfmt.h" | |
43 | #include "version.h" | |
44 | ||
45 | #if ARCH_X86 | |
46 | # include "x86/emms.h" | |
47 | #endif | |
48 | ||
49 | #ifndef emms_c | |
50 | # define emms_c() | |
51 | #endif | |
52 | ||
53 | #ifndef attribute_align_arg | |
54 | #if ARCH_X86_32 && AV_GCC_VERSION_AT_LEAST(4,2) | |
55 | # define attribute_align_arg __attribute__((force_align_arg_pointer)) | |
56 | #else | |
57 | # define attribute_align_arg | |
58 | #endif | |
59 | #endif | |
60 | ||
61 | #if defined(_MSC_VER) && CONFIG_SHARED | |
62 | # define av_export __declspec(dllimport) | |
63 | #else | |
64 | # define av_export | |
65 | #endif | |
66 | ||
67 | #if HAVE_PRAGMA_DEPRECATED | |
68 | # if defined(__ICL) || defined (__INTEL_COMPILER) | |
69 | # define FF_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:1478)) | |
70 | # define FF_ENABLE_DEPRECATION_WARNINGS __pragma(warning(pop)) | |
71 | # elif defined(_MSC_VER) | |
72 | # define FF_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:4996)) | |
73 | # define FF_ENABLE_DEPRECATION_WARNINGS __pragma(warning(pop)) | |
74 | # else | |
75 | # define FF_DISABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") | |
76 | # define FF_ENABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic warning \"-Wdeprecated-declarations\"") | |
77 | # endif | |
78 | #else | |
79 | # define FF_DISABLE_DEPRECATION_WARNINGS | |
80 | # define FF_ENABLE_DEPRECATION_WARNINGS | |
81 | #endif | |
82 | ||
83 | #ifndef INT_BIT | |
84 | # define INT_BIT (CHAR_BIT * sizeof(int)) | |
85 | #endif | |
86 | ||
87 | #define FF_MEMORY_POISON 0x2a | |
88 | ||
89 | #define MAKE_ACCESSORS(str, name, type, field) \ | |
90 | type av_##name##_get_##field(const str *s) { return s->field; } \ | |
91 | void av_##name##_set_##field(str *s, type v) { s->field = v; } | |
92 | ||
93 | // Some broken preprocessors need a second expansion | |
94 | // to be forced to tokenize __VA_ARGS__ | |
95 | #define E1(x) x | |
96 | ||
97 | /* Check if the hard coded offset of a struct member still matches reality. | |
98 | * Induce a compilation failure if not. | |
99 | */ | |
100 | #define AV_CHECK_OFFSET(s, m, o) struct check_##o { \ | |
101 | int x_##o[offsetof(s, m) == o? 1: -1]; \ | |
102 | } | |
103 | ||
104 | #define LOCAL_ALIGNED_A(a, t, v, s, o, ...) \ | |
105 | uint8_t la_##v[sizeof(t s o) + (a)]; \ | |
106 | t (*v) o = (void *)FFALIGN((uintptr_t)la_##v, a) | |
107 | ||
108 | #define LOCAL_ALIGNED_D(a, t, v, s, o, ...) \ | |
109 | DECLARE_ALIGNED(a, t, la_##v) s o; \ | |
110 | t (*v) o = la_##v | |
111 | ||
112 | #define LOCAL_ALIGNED(a, t, v, ...) E1(LOCAL_ALIGNED_A(a, t, v, __VA_ARGS__,,)) | |
113 | ||
114 | #if HAVE_LOCAL_ALIGNED_8 | |
115 | # define LOCAL_ALIGNED_8(t, v, ...) E1(LOCAL_ALIGNED_D(8, t, v, __VA_ARGS__,,)) | |
116 | #else | |
117 | # define LOCAL_ALIGNED_8(t, v, ...) LOCAL_ALIGNED(8, t, v, __VA_ARGS__) | |
118 | #endif | |
119 | ||
120 | #if HAVE_LOCAL_ALIGNED_16 | |
121 | # define LOCAL_ALIGNED_16(t, v, ...) E1(LOCAL_ALIGNED_D(16, t, v, __VA_ARGS__,,)) | |
122 | #else | |
123 | # define LOCAL_ALIGNED_16(t, v, ...) LOCAL_ALIGNED(16, t, v, __VA_ARGS__) | |
124 | #endif | |
125 | ||
126 | #if HAVE_LOCAL_ALIGNED_32 | |
127 | # define LOCAL_ALIGNED_32(t, v, ...) E1(LOCAL_ALIGNED_D(32, t, v, __VA_ARGS__,,)) | |
128 | #else | |
129 | # define LOCAL_ALIGNED_32(t, v, ...) LOCAL_ALIGNED(32, t, v, __VA_ARGS__) | |
130 | #endif | |
131 | ||
132 | #define FF_ALLOC_OR_GOTO(ctx, p, size, label)\ | |
133 | {\ | |
134 | p = av_malloc(size);\ | |
135 | if (!(p) && (size) != 0) {\ | |
136 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ | |
137 | goto label;\ | |
138 | }\ | |
139 | } | |
140 | ||
141 | #define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)\ | |
142 | {\ | |
143 | p = av_mallocz(size);\ | |
144 | if (!(p) && (size) != 0) {\ | |
145 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ | |
146 | goto label;\ | |
147 | }\ | |
148 | } | |
149 | ||
150 | #define FF_ALLOC_ARRAY_OR_GOTO(ctx, p, nelem, elsize, label)\ | |
151 | {\ | |
152 | p = av_malloc_array(nelem, elsize);\ | |
153 | if (!p) {\ | |
154 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ | |
155 | goto label;\ | |
156 | }\ | |
157 | } | |
158 | ||
159 | #define FF_ALLOCZ_ARRAY_OR_GOTO(ctx, p, nelem, elsize, label)\ | |
160 | {\ | |
161 | p = av_mallocz_array(nelem, elsize);\ | |
162 | if (!p) {\ | |
163 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ | |
164 | goto label;\ | |
165 | }\ | |
166 | } | |
167 | ||
168 | #include "libm.h" | |
169 | ||
170 | #if defined(_MSC_VER) | |
171 | #pragma comment(linker, "/include:"EXTERN_PREFIX"avpriv_strtod") | |
172 | #pragma comment(linker, "/include:"EXTERN_PREFIX"avpriv_snprintf") | |
173 | #endif | |
174 | ||
175 | /** | |
176 | * Return NULL if CONFIG_SMALL is true, otherwise the argument | |
177 | * without modification. Used to disable the definition of strings | |
178 | * (for example AVCodec long_names). | |
179 | */ | |
180 | #if CONFIG_SMALL | |
181 | # define NULL_IF_CONFIG_SMALL(x) NULL | |
182 | #else | |
183 | # define NULL_IF_CONFIG_SMALL(x) x | |
184 | #endif | |
185 | ||
186 | /** | |
187 | * Define a function with only the non-default version specified. | |
188 | * | |
189 | * On systems with ELF shared libraries, all symbols exported from | |
190 | * FFmpeg libraries are tagged with the name and major version of the | |
191 | * library to which they belong. If a function is moved from one | |
192 | * library to another, a wrapper must be retained in the original | |
193 | * location to preserve binary compatibility. | |
194 | * | |
195 | * Functions defined with this macro will never be used to resolve | |
196 | * symbols by the build-time linker. | |
197 | * | |
198 | * @param type return type of function | |
199 | * @param name name of function | |
200 | * @param args argument list of function | |
201 | * @param ver version tag to assign function | |
202 | */ | |
203 | #if HAVE_SYMVER_ASM_LABEL | |
204 | # define FF_SYMVER(type, name, args, ver) \ | |
205 | type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver); \ | |
206 | type ff_##name args | |
207 | #elif HAVE_SYMVER_GNU_ASM | |
208 | # define FF_SYMVER(type, name, args, ver) \ | |
209 | __asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver); \ | |
210 | type ff_##name args; \ | |
211 | type ff_##name args | |
212 | #endif | |
213 | ||
214 | /** | |
215 | * Return NULL if a threading library has not been enabled. | |
216 | * Used to disable threading functions in AVCodec definitions | |
217 | * when not needed. | |
218 | */ | |
219 | #if HAVE_THREADS | |
220 | # define ONLY_IF_THREADS_ENABLED(x) x | |
221 | #else | |
222 | # define ONLY_IF_THREADS_ENABLED(x) NULL | |
223 | #endif | |
224 | ||
225 | /** | |
226 | * Log a generic warning message about a missing feature. | |
227 | * | |
228 | * @param[in] avc a pointer to an arbitrary struct of which the first | |
229 | * field is a pointer to an AVClass struct | |
230 | * @param[in] msg string containing the name of the missing feature | |
231 | */ | |
232 | void avpriv_report_missing_feature(void *avc, | |
233 | const char *msg, ...) av_printf_format(2, 3); | |
234 | ||
235 | /** | |
236 | * Log a generic warning message about a missing feature. | |
237 | * Additionally request that a sample showcasing the feature be uploaded. | |
238 | * | |
239 | * @param[in] avc a pointer to an arbitrary struct of which the first field is | |
240 | * a pointer to an AVClass struct | |
241 | * @param[in] msg string containing the name of the missing feature | |
242 | */ | |
243 | void avpriv_request_sample(void *avc, | |
244 | const char *msg, ...) av_printf_format(2, 3); | |
245 | ||
246 | #if HAVE_LIBC_MSVCRT | |
247 | #define avpriv_open ff_open | |
248 | #define PTRDIFF_SPECIFIER "Id" | |
249 | #define SIZE_SPECIFIER "Iu" | |
250 | #else | |
251 | #define PTRDIFF_SPECIFIER "td" | |
252 | #define SIZE_SPECIFIER "zu" | |
253 | #endif | |
254 | ||
255 | /** | |
256 | * A wrapper for open() setting O_CLOEXEC. | |
257 | */ | |
258 | int avpriv_open(const char *filename, int flags, ...); | |
259 | ||
260 | int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt); | |
261 | ||
262 | #if FF_API_GET_CHANNEL_LAYOUT_COMPAT | |
263 | uint64_t ff_get_channel_layout(const char *name, int compat); | |
264 | #endif | |
265 | ||
266 | #endif /* AVUTIL_INTERNAL_H */ |