1 /* 2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> 3 * 4 * This file is part of Libav. 5 * 6 * Libav 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 * Libav 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 Libav; 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 "dict.h" 40 #include "pixfmt.h" 41 42 #if ARCH_X86 43 # include "x86/emms.h" 44 #endif 45 46 #ifndef emms_c 47 # define emms_c() 48 #endif 49 50 #ifndef attribute_align_arg 51 #if ARCH_X86_32 && AV_GCC_VERSION_AT_LEAST(4,2) 52 # define attribute_align_arg __attribute__((force_align_arg_pointer)) 53 #else 54 # define attribute_align_arg 55 #endif 56 #endif 57 58 #if defined(_MSC_VER) && CONFIG_SHARED 59 # define av_export __declspec(dllimport) 60 #else 61 # define av_export 62 #endif 63 64 #if HAVE_PRAGMA_DEPRECATED 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 75 #else 76 # define FF_DISABLE_DEPRECATION_WARNINGS 77 # define FF_ENABLE_DEPRECATION_WARNINGS 78 #endif 79 80 #ifndef INT_BIT 81 # define INT_BIT (CHAR_BIT * sizeof(int)) 82 #endif 83 84 // Some broken preprocessors need a second expansion 85 // to be forced to tokenize __VA_ARGS__ 86 #define E1(x) x 87 88 /* Check if the hard coded offset of a struct member still matches reality. 89 * Induce a compilation failure if not. 90 */ 91 #define AV_CHECK_OFFSET(s, m, o) struct check_##o { \ 92 int x_##o[offsetof(s, m) == o? 1: -1]; \ 93 } 94 95 #define LOCAL_ALIGNED_A(a, t, v, s, o, ...) \ 96 uint8_t la_##v[sizeof(t s o) + (a)]; \ 97 t (*v) o = (void *)FFALIGN((uintptr_t)la_##v, a) 98 99 #define LOCAL_ALIGNED_D(a, t, v, s, o, ...) \ 100 DECLARE_ALIGNED(a, t, la_##v) s o; \ 101 t (*v) o = la_##v 102 103 #define LOCAL_ALIGNED(a, t, v, ...) E1(LOCAL_ALIGNED_A(a, t, v, __VA_ARGS__,,)) 104 105 #if HAVE_LOCAL_ALIGNED_8 106 # define LOCAL_ALIGNED_8(t, v, ...) E1(LOCAL_ALIGNED_D(8, t, v, __VA_ARGS__,,)) 107 #else 108 # define LOCAL_ALIGNED_8(t, v, ...) LOCAL_ALIGNED(8, t, v, __VA_ARGS__) 109 #endif 110 111 #if HAVE_LOCAL_ALIGNED_16 112 # define LOCAL_ALIGNED_16(t, v, ...) E1(LOCAL_ALIGNED_D(16, t, v, __VA_ARGS__,,)) 113 #else 114 # define LOCAL_ALIGNED_16(t, v, ...) LOCAL_ALIGNED(16, t, v, __VA_ARGS__) 115 #endif 116 117 #define FF_ALLOC_OR_GOTO(ctx, p, size, label)\ 118 {\ 119 p = av_malloc(size);\ 120 if (!(p) && (size) != 0) {\ 121 av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ 122 goto label;\ 123 }\ 124 } 125 126 #define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)\ 127 {\ 128 p = av_mallocz(size);\ 129 if (!(p) && (size) != 0) {\ 130 av_log(ctx, AV_LOG_ERROR, "Cannot allocate memory.\n");\ 131 goto label;\ 132 }\ 133 } 134 135 #include "libm.h" 136 137 #if defined(_MSC_VER) && _MSC_VER < 1800 138 #pragma comment(linker, "/include:"EXTERN_PREFIX"avpriv_strtod") 139 #pragma comment(linker, "/include:"EXTERN_PREFIX"avpriv_snprintf") 140 #endif 141 142 /** 143 * Return NULL if CONFIG_SMALL is true, otherwise the argument 144 * without modification. Used to disable the definition of strings 145 * (for example AVCodec long_names). 146 */ 147 #if CONFIG_SMALL 148 # define NULL_IF_CONFIG_SMALL(x) NULL 149 #else 150 # define NULL_IF_CONFIG_SMALL(x) x 151 #endif 152 153 154 /** 155 * Define a function with only the non-default version specified. 156 * 157 * On systems with ELF shared libraries, all symbols exported from 158 * Libav libraries are tagged with the name and major version of the 159 * library to which they belong. If a function is moved from one 160 * library to another, a wrapper must be retained in the original 161 * location to preserve binary compatibility. 162 * 163 * Functions defined with this macro will never be used to resolve 164 * symbols by the build-time linker. 165 * 166 * @param type return type of function 167 * @param name name of function 168 * @param args argument list of function 169 * @param ver version tag to assign function 170 */ 171 #if HAVE_SYMVER_ASM_LABEL 172 # define FF_SYMVER(type, name, args, ver) \ 173 type ff_##name args __asm__ (EXTERN_PREFIX #name "@" ver); \ 174 type ff_##name args 175 #elif HAVE_SYMVER_GNU_ASM 176 # define FF_SYMVER(type, name, args, ver) \ 177 __asm__ (".symver ff_" #name "," EXTERN_PREFIX #name "@" ver); \ 178 type ff_##name args; \ 179 type ff_##name args 180 #endif 181 182 /** 183 * Return NULL if a threading library has not been enabled. 184 * Used to disable threading functions in AVCodec definitions 185 * when not needed. 186 */ 187 #if HAVE_THREADS 188 # define ONLY_IF_THREADS_ENABLED(x) x 189 #else 190 # define ONLY_IF_THREADS_ENABLED(x) NULL 191 #endif 192 193 /** 194 * Log a generic warning message about a missing feature. 195 * 196 * @param[in] avc a pointer to an arbitrary struct of which the first 197 * field is a pointer to an AVClass struct 198 * @param[in] msg string containing the name of the missing feature 199 */ 200 void avpriv_report_missing_feature(void *avc, 201 const char *msg, ...) av_printf_format(2, 3); 202 203 /** 204 * Log a generic warning message about a missing feature. 205 * Additionally request that a sample showcasing the feature be uploaded. 206 * 207 * @param[in] avc a pointer to an arbitrary struct of which the first field is 208 * a pointer to an AVClass struct 209 * @param[in] msg string containing the name of the missing feature 210 */ 211 void avpriv_request_sample(void *avc, 212 const char *msg, ...) av_printf_format(2, 3); 213 214 #if HAVE_LIBC_MSVCRT 215 #define avpriv_open ff_open 216 #endif 217 218 /** 219 * A wrapper for open() setting O_CLOEXEC. 220 */ 221 int avpriv_open(const char *filename, int flags, ...); 222 223 int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt); 224 225 #endif /* AVUTIL_INTERNAL_H */ 226