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" |
d9f80ea2 | 39 | #include "dict.h" |
bb41115d | 40 | #include "pixfmt.h" |
d9f80ea2 | 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 | ||
3a7050ff | 64 | #if HAVE_PRAGMA_DEPRECATED |
09f2581d AS |
65 | # if defined(__ICL) |
66 | # define FF_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:1478)) | |
67 | # define FF_ENABLE_DEPRECATION_WARNINGS __pragma(warning(pop)) | |
68 | # elif defined(_MSC_VER) | |
69 | # define FF_DISABLE_DEPRECATION_WARNINGS __pragma(warning(push)) __pragma(warning(disable:4996)) | |
70 | # define FF_ENABLE_DEPRECATION_WARNINGS __pragma(warning(pop)) | |
71 | # else | |
72 | # define FF_DISABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") | |
73 | # define FF_ENABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic warning \"-Wdeprecated-declarations\"") | |
74 | # endif | |
3a7050ff DB |
75 | #else |
76 | # define FF_DISABLE_DEPRECATION_WARNINGS | |
77 | # define FF_ENABLE_DEPRECATION_WARNINGS | |
78 | #endif | |
79 | ||
218aefce DB |
80 | // Some broken preprocessors need a second expansion |
81 | // to be forced to tokenize __VA_ARGS__ | |
fd1abf42 | 82 | #define E1(x) x |
a88e1d1c JG |
83 | |
84 | /* Check if the hard coded offset of a struct member still matches reality. | |
85 | * Induce a compilation failure if not. | |
86 | */ | |
87 | #define AV_CHECK_OFFSET(s, m, o) struct check_##o { \ | |
88 | int x_##o[offsetof(s, m) == o? 1: -1]; \ | |
89 | } | |
218aefce DB |
90 | |
91 | #define LOCAL_ALIGNED_A(a, t, v, s, o, ...) \ | |
92 | uint8_t la_##v[sizeof(t s o) + (a)]; \ | |
93 | t (*v) o = (void *)FFALIGN((uintptr_t)la_##v, a) | |
94 | ||
95 | #define LOCAL_ALIGNED_D(a, t, v, s, o, ...) \ | |
96 | DECLARE_ALIGNED(a, t, la_##v) s o; \ | |
97 | t (*v) o = la_##v | |
98 | ||
fd1abf42 | 99 | #define LOCAL_ALIGNED(a, t, v, ...) E1(LOCAL_ALIGNED_A(a, t, v, __VA_ARGS__,,)) |
218aefce DB |
100 | |
101 | #if HAVE_LOCAL_ALIGNED_8 | |
fd1abf42 | 102 | # define LOCAL_ALIGNED_8(t, v, ...) E1(LOCAL_ALIGNED_D(8, t, v, __VA_ARGS__,,)) |
218aefce DB |
103 | #else |
104 | # define LOCAL_ALIGNED_8(t, v, ...) LOCAL_ALIGNED(8, t, v, __VA_ARGS__) | |
105 | #endif | |
106 | ||
107 | #if HAVE_LOCAL_ALIGNED_16 | |
fd1abf42 | 108 | # define LOCAL_ALIGNED_16(t, v, ...) E1(LOCAL_ALIGNED_D(16, t, v, __VA_ARGS__,,)) |
218aefce DB |
109 | #else |
110 | # define LOCAL_ALIGNED_16(t, v, ...) LOCAL_ALIGNED(16, t, v, __VA_ARGS__) | |
111 | #endif | |
112 | ||
d31dbec3 | 113 | #define FF_ALLOC_OR_GOTO(ctx, p, size, label)\ |
e48a0966 | 114 | {\ |
ee155011 | 115 | p = av_malloc(size);\ |
f929ab05 | 116 | if (!(p) && (size) != 0) {\ |
d31dbec3 RP |
117 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ |
118 | goto label;\ | |
e48a0966 RP |
119 | }\ |
120 | } | |
121 | ||
d31dbec3 | 122 | #define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)\ |
05020c89 | 123 | {\ |
ee155011 | 124 | p = av_mallocz(size);\ |
f929ab05 | 125 | if (!(p) && (size) != 0) {\ |
d31dbec3 RP |
126 | av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ |
127 | goto label;\ | |
05020c89 RD |
128 | }\ |
129 | } | |
130 | ||
335ee1aa | 131 | #include "libm.h" |
7b04b8a0 | 132 | |
d80a7fe5 | 133 | /** |
49bd8e4b | 134 | * Return NULL if CONFIG_SMALL is true, otherwise the argument |
bfe3676f | 135 | * without modification. Used to disable the definition of strings |
d80a7fe5 AJ |
136 | * (for example AVCodec long_names). |
137 | */ | |
138 | #if CONFIG_SMALL | |
139 | # define NULL_IF_CONFIG_SMALL(x) NULL | |
140 | #else | |
141 | # define NULL_IF_CONFIG_SMALL(x) x | |
142 | #endif | |
143 | ||
33586ee7 MN |
144 | |
145 | /** | |
cae70f99 MR |
146 | * Define a function with only the non-default version specified. |
147 | * | |
148 | * On systems with ELF shared libraries, all symbols exported from | |
2912e87a | 149 | * Libav libraries are tagged with the name and major version of the |
cae70f99 MR |
150 | * library to which they belong. If a function is moved from one |
151 | * library to another, a wrapper must be retained in the original | |
152 | * location to preserve binary compatibility. | |
153 | * | |
154 | * Functions defined with this macro will never be used to resolve | |
155 | * symbols by the build-time linker. | |
156 | * | |
157 | * @param type return type of function | |
158 | * @param name name of function | |
159 | * @param args argument list of function | |
160 | * @param ver version tag to assign function | |
33586ee7 | 161 | */ |
b462d132 | 162 | #if HAVE_SYMVER_ASM_LABEL |
ccc87908 MR |
163 | # define FF_SYMVER(type, name, args, ver) \ |
164 | type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver); \ | |
b462d132 MR |
165 | type ff_##name args |
166 | #elif HAVE_SYMVER_GNU_ASM | |
ccc87908 MR |
167 | # define FF_SYMVER(type, name, args, ver) \ |
168 | __asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver); \ | |
169 | type ff_##name args; \ | |
b462d132 MR |
170 | type ff_##name args |
171 | #endif | |
172 | ||
37b00b47 | 173 | /** |
58c42af7 | 174 | * Return NULL if a threading library has not been enabled. |
37b00b47 AS |
175 | * Used to disable threading functions in AVCodec definitions |
176 | * when not needed. | |
177 | */ | |
178 | #if HAVE_THREADS | |
179 | # define ONLY_IF_THREADS_ENABLED(x) x | |
180 | #else | |
181 | # define ONLY_IF_THREADS_ENABLED(x) NULL | |
182 | #endif | |
183 | ||
f099d3d1 DB |
184 | /** |
185 | * Log a generic warning message about a missing feature. | |
186 | * | |
187 | * @param[in] avc a pointer to an arbitrary struct of which the first | |
188 | * field is a pointer to an AVClass struct | |
189 | * @param[in] msg string containing the name of the missing feature | |
190 | */ | |
191 | void avpriv_report_missing_feature(void *avc, | |
192 | const char *msg, ...) av_printf_format(2, 3); | |
193 | ||
194 | /** | |
195 | * Log a generic warning message about a missing feature. | |
196 | * Additionally request that a sample showcasing the feature be uploaded. | |
197 | * | |
198 | * @param[in] avc a pointer to an arbitrary struct of which the first field is | |
199 | * a pointer to an AVClass struct | |
200 | * @param[in] msg string containing the name of the missing feature | |
201 | */ | |
202 | void avpriv_request_sample(void *avc, | |
203 | const char *msg, ...) av_printf_format(2, 3); | |
204 | ||
d64341e4 | 205 | #if HAVE_LIBC_MSVCRT |
a6f19d6a LB |
206 | #include <crtversion.h> |
207 | #if defined(_VC_CRT_MAJOR_VERSION) && _VC_CRT_MAJOR_VERSION < 14 | |
208 | #pragma comment(linker, "/include:"EXTERN_PREFIX"avpriv_strtod") | |
209 | #pragma comment(linker, "/include:"EXTERN_PREFIX"avpriv_snprintf") | |
210 | #endif | |
211 | ||
e743e7ae MS |
212 | #define avpriv_open ff_open |
213 | #endif | |
214 | ||
869b04e8 RDC |
215 | /** |
216 | * A wrapper for open() setting O_CLOEXEC. | |
217 | */ | |
218 | int avpriv_open(const char *filename, int flags, ...); | |
219 | ||
bb41115d DB |
220 | int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt); |
221 | ||
98790382 | 222 | #endif /* AVUTIL_INTERNAL_H */ |