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