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