internal.h (5125B)
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 // This can be enabled to allow detection of additional integer overflows with ubsan 34 //#define CHECKED 35 36 #include <limits.h> 37 #include <stdint.h> 38 #include <stddef.h> 39 #include <assert.h> 40 #include <stdio.h> 41 #include "config.h" 42 #include "attributes.h" 43 #include "libm.h" 44 #include "macros.h" 45 46 #ifndef attribute_align_arg 47 #if ARCH_X86_32 && AV_GCC_VERSION_AT_LEAST(4,2) 48 # define attribute_align_arg __attribute__((force_align_arg_pointer)) 49 #else 50 # define attribute_align_arg 51 #endif 52 #endif 53 54 #if defined(_WIN32) && CONFIG_SHARED && !defined(BUILDING_avutil) 55 # define av_export_avutil __declspec(dllimport) 56 #else 57 # define av_export_avutil 58 #endif 59 60 #if HAVE_PRAGMA_DEPRECATED 61 # if defined(__ICL) || defined (__INTEL_COMPILER) 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 push") _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") 69 # define FF_ENABLE_DEPRECATION_WARNINGS _Pragma("GCC diagnostic pop") 70 # endif 71 #else 72 # define FF_DISABLE_DEPRECATION_WARNINGS 73 # define FF_ENABLE_DEPRECATION_WARNINGS 74 #endif 75 76 77 #define FF_ALLOC_TYPED_ARRAY(p, nelem) (p = av_malloc_array(nelem, sizeof(*p))) 78 #define FF_ALLOCZ_TYPED_ARRAY(p, nelem) (p = av_calloc(nelem, sizeof(*p))) 79 80 #define FF_PTR_ADD(ptr, off) ((off) ? (ptr) + (off) : (ptr)) 81 82 /** 83 * Access a field in a structure by its offset. 84 */ 85 #define FF_FIELD_AT(type, off, obj) (*(type *)((char *)&(obj) + (off))) 86 87 /** 88 * Return NULL if CONFIG_SMALL is true, otherwise the argument 89 * without modification. Used to disable the definition of strings. 90 */ 91 #if CONFIG_SMALL 92 # define NULL_IF_CONFIG_SMALL(x) NULL 93 #else 94 # define NULL_IF_CONFIG_SMALL(x) x 95 #endif 96 97 /** 98 * Log a generic warning message about a missing feature. 99 * 100 * @param[in] avc a pointer to an arbitrary struct of which the first 101 * field is a pointer to an AVClass struct 102 * @param[in] msg string containing the name of the missing feature 103 */ 104 void avpriv_report_missing_feature(void *avc, 105 const char *msg, ...) av_printf_format(2, 3); 106 107 /** 108 * Log a generic warning message about a missing feature. 109 * Additionally request that a sample showcasing the feature be uploaded. 110 * 111 * @param[in] avc a pointer to an arbitrary struct of which the first field is 112 * a pointer to an AVClass struct 113 * @param[in] msg string containing the name of the missing feature 114 */ 115 void avpriv_request_sample(void *avc, 116 const char *msg, ...) av_printf_format(2, 3); 117 118 #if HAVE_LIBC_MSVCRT 119 #include <crtversion.h> 120 #if defined(_VC_CRT_MAJOR_VERSION) && _VC_CRT_MAJOR_VERSION < 14 121 #pragma comment(linker, "/include:" EXTERN_PREFIX "avpriv_strtod") 122 #pragma comment(linker, "/include:" EXTERN_PREFIX "avpriv_snprintf") 123 #endif 124 125 #define PTRDIFF_SPECIFIER "Id" 126 #define SIZE_SPECIFIER "Iu" 127 #else 128 #define PTRDIFF_SPECIFIER "td" 129 #define SIZE_SPECIFIER "zu" 130 #endif 131 132 #ifdef DEBUG 133 # define ff_dlog(ctx, ...) av_log(ctx, AV_LOG_DEBUG, __VA_ARGS__) 134 #else 135 # define ff_dlog(ctx, ...) do { if (0) av_log(ctx, AV_LOG_DEBUG, __VA_ARGS__); } while (0) 136 #endif 137 138 #ifdef TRACE 139 # define ff_tlog(ctx, ...) av_log(ctx, AV_LOG_TRACE, __VA_ARGS__) 140 #else 141 # define ff_tlog(ctx, ...) do { } while(0) 142 #endif 143 144 // For debuging we use signed operations so overflows can be detected (by ubsan) 145 // For production we use unsigned so there are no undefined operations 146 #ifdef CHECKED 147 #define SUINT int 148 #define SUINT32 int32_t 149 #else 150 #define SUINT unsigned 151 #define SUINT32 uint32_t 152 #endif 153 154 static av_always_inline av_const int avpriv_mirror(int x, int w) 155 { 156 if (!w) 157 return 0; 158 159 while ((unsigned)x > (unsigned)w) { 160 x = -x; 161 if (x < 0) 162 x += 2 * w; 163 } 164 return x; 165 } 166 167 #endif /* AVUTIL_INTERNAL_H */