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 | ||
2ba45a60 DM |
83 | |
84 | #define FF_MEMORY_POISON 0x2a | |
85 | ||
86 | #define MAKE_ACCESSORS(str, name, type, field) \ | |
87 | type av_##name##_get_##field(const str *s) { return s->field; } \ | |
88 | void av_##name##_set_##field(str *s, type v) { s->field = v; } | |
89 | ||
90 | // Some broken preprocessors need a second expansion | |
91 | // to be forced to tokenize __VA_ARGS__ | |
92 | #define E1(x) x | |
93 | ||
94 | /* Check if the hard coded offset of a struct member still matches reality. | |
95 | * Induce a compilation failure if not. | |
96 | */ | |
97 | #define AV_CHECK_OFFSET(s, m, o) struct check_##o { \ | |
98 | int x_##o[offsetof(s, m) == o? 1: -1]; \ | |
99 | } | |
100 | ||
101 | #define LOCAL_ALIGNED_A(a, t, v, s, o, ...) \ | |
102 | uint8_t la_##v[sizeof(t s o) + (a)]; \ | |
103 | t (*v) o = (void *)FFALIGN((uintptr_t)la_##v, a) | |
104 | ||
105 | #define LOCAL_ALIGNED_D(a, t, v, s, o, ...) \ | |
106 | DECLARE_ALIGNED(a, t, la_##v) s o; \ | |
107 | t (*v) o = la_##v | |
108 | ||
109 | #define LOCAL_ALIGNED(a, t, v, ...) E1(LOCAL_ALIGNED_A(a, t, v, __VA_ARGS__,,)) | |
110 | ||
111 | #if HAVE_LOCAL_ALIGNED_8 | |
112 | # define LOCAL_ALIGNED_8(t, v, ...) E1(LOCAL_ALIGNED_D(8, t, v, __VA_ARGS__,,)) | |
113 | #else | |
114 | # define LOCAL_ALIGNED_8(t, v, ...) LOCAL_ALIGNED(8, t, v, __VA_ARGS__) | |
115 | #endif | |
116 | ||
117 | #if HAVE_LOCAL_ALIGNED_16 | |
118 | # define LOCAL_ALIGNED_16(t, v, ...) E1(LOCAL_ALIGNED_D(16, t, v, __VA_ARGS__,,)) | |
119 | #else | |
120 | # define LOCAL_ALIGNED_16(t, v, ...) LOCAL_ALIGNED(16, t, v, __VA_ARGS__) | |
121 | #endif | |
122 | ||
123 | #if HAVE_LOCAL_ALIGNED_32 | |
124 | # define LOCAL_ALIGNED_32(t, v, ...) E1(LOCAL_ALIGNED_D(32, t, v, __VA_ARGS__,,)) | |
125 | #else | |
126 | # define LOCAL_ALIGNED_32(t, v, ...) LOCAL_ALIGNED(32, t, v, __VA_ARGS__) | |
127 | #endif | |
128 | ||
129 | #define FF_ALLOC_OR_GOTO(ctx, p, size, label)\ | |
130 | {\ | |
131 | p = av_malloc(size);\ | |
132 | if (!(p) && (size) != 0) {\ | |
133 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ | |
134 | goto label;\ | |
135 | }\ | |
136 | } | |
137 | ||
138 | #define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)\ | |
139 | {\ | |
140 | p = av_mallocz(size);\ | |
141 | if (!(p) && (size) != 0) {\ | |
142 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ | |
143 | goto label;\ | |
144 | }\ | |
145 | } | |
146 | ||
147 | #define FF_ALLOC_ARRAY_OR_GOTO(ctx, p, nelem, elsize, label)\ | |
148 | {\ | |
149 | p = av_malloc_array(nelem, elsize);\ | |
150 | if (!p) {\ | |
151 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ | |
152 | goto label;\ | |
153 | }\ | |
154 | } | |
155 | ||
156 | #define FF_ALLOCZ_ARRAY_OR_GOTO(ctx, p, nelem, elsize, label)\ | |
157 | {\ | |
158 | p = av_mallocz_array(nelem, elsize);\ | |
159 | if (!p) {\ | |
160 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ | |
161 | goto label;\ | |
162 | }\ | |
163 | } | |
164 | ||
165 | #include "libm.h" | |
166 | ||
167 | #if defined(_MSC_VER) | |
168 | #pragma comment(linker, "/include:"EXTERN_PREFIX"avpriv_strtod") | |
169 | #pragma comment(linker, "/include:"EXTERN_PREFIX"avpriv_snprintf") | |
170 | #endif | |
171 | ||
172 | /** | |
173 | * Return NULL if CONFIG_SMALL is true, otherwise the argument | |
174 | * without modification. Used to disable the definition of strings | |
175 | * (for example AVCodec long_names). | |
176 | */ | |
177 | #if CONFIG_SMALL | |
178 | # define NULL_IF_CONFIG_SMALL(x) NULL | |
179 | #else | |
180 | # define NULL_IF_CONFIG_SMALL(x) x | |
181 | #endif | |
182 | ||
183 | /** | |
184 | * Define a function with only the non-default version specified. | |
185 | * | |
186 | * On systems with ELF shared libraries, all symbols exported from | |
187 | * FFmpeg libraries are tagged with the name and major version of the | |
188 | * library to which they belong. If a function is moved from one | |
189 | * library to another, a wrapper must be retained in the original | |
190 | * location to preserve binary compatibility. | |
191 | * | |
192 | * Functions defined with this macro will never be used to resolve | |
193 | * symbols by the build-time linker. | |
194 | * | |
195 | * @param type return type of function | |
196 | * @param name name of function | |
197 | * @param args argument list of function | |
198 | * @param ver version tag to assign function | |
199 | */ | |
200 | #if HAVE_SYMVER_ASM_LABEL | |
201 | # define FF_SYMVER(type, name, args, ver) \ | |
202 | type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver); \ | |
203 | type ff_##name args | |
204 | #elif HAVE_SYMVER_GNU_ASM | |
205 | # define FF_SYMVER(type, name, args, ver) \ | |
206 | __asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver); \ | |
207 | type ff_##name args; \ | |
208 | type ff_##name args | |
209 | #endif | |
210 | ||
211 | /** | |
212 | * Return NULL if a threading library has not been enabled. | |
213 | * Used to disable threading functions in AVCodec definitions | |
214 | * when not needed. | |
215 | */ | |
216 | #if HAVE_THREADS | |
217 | # define ONLY_IF_THREADS_ENABLED(x) x | |
218 | #else | |
219 | # define ONLY_IF_THREADS_ENABLED(x) NULL | |
220 | #endif | |
221 | ||
222 | /** | |
223 | * Log a generic warning message about a missing feature. | |
224 | * | |
225 | * @param[in] avc a pointer to an arbitrary struct of which the first | |
226 | * field is a pointer to an AVClass struct | |
227 | * @param[in] msg string containing the name of the missing feature | |
228 | */ | |
229 | void avpriv_report_missing_feature(void *avc, | |
230 | const char *msg, ...) av_printf_format(2, 3); | |
231 | ||
232 | /** | |
233 | * Log a generic warning message about a missing feature. | |
234 | * Additionally request that a sample showcasing the feature be uploaded. | |
235 | * | |
236 | * @param[in] avc a pointer to an arbitrary struct of which the first field is | |
237 | * a pointer to an AVClass struct | |
238 | * @param[in] msg string containing the name of the missing feature | |
239 | */ | |
240 | void avpriv_request_sample(void *avc, | |
241 | const char *msg, ...) av_printf_format(2, 3); | |
242 | ||
243 | #if HAVE_LIBC_MSVCRT | |
244 | #define avpriv_open ff_open | |
245 | #define PTRDIFF_SPECIFIER "Id" | |
246 | #define SIZE_SPECIFIER "Iu" | |
247 | #else | |
248 | #define PTRDIFF_SPECIFIER "td" | |
249 | #define SIZE_SPECIFIER "zu" | |
250 | #endif | |
251 | ||
252 | /** | |
253 | * A wrapper for open() setting O_CLOEXEC. | |
254 | */ | |
255 | int avpriv_open(const char *filename, int flags, ...); | |
256 | ||
257 | int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt); | |
258 | ||
259 | #if FF_API_GET_CHANNEL_LAYOUT_COMPAT | |
260 | uint64_t ff_get_channel_layout(const char *name, int compat); | |
261 | #endif | |
262 | ||
263 | #endif /* AVUTIL_INTERNAL_H */ |