[FFmpeg-devel] [PATCH 1/5] compat/avisynth: update headers

Stephen Hutchinson qyot27 at gmail.com
Thu Mar 12 03:21:55 EET 2020


AviSynth+ can now be used on Linux, which required some changes
to the headers.

As part of this, and to not cause issues with adding a new header,
correct the header inclusion guards to make FATE happy.
---
 compat/avisynth/avisynth_c.h |  30 ++++++----
 compat/avisynth/avs/capi.h   |  22 ++++++-
 compat/avisynth/avs/config.h |  52 +++++++++++++---
 compat/avisynth/avs/posix.h  | 111 +++++++++++++++++++++++++++++++++++
 compat/avisynth/avs/types.h  |  19 +++---
 tests/ref/fate/source        |   4 --
 6 files changed, 197 insertions(+), 41 deletions(-)
 create mode 100644 compat/avisynth/avs/posix.h

diff --git a/compat/avisynth/avisynth_c.h b/compat/avisynth/avisynth_c.h
index 9ff9321552..d30d7caca9 100644
--- a/compat/avisynth/avisynth_c.h
+++ b/compat/avisynth/avisynth_c.h
@@ -51,8 +51,8 @@
 //         Example#2: avs_bits_per_component will return 8 for all colorspaces (Classic Avisynth supports only 8 bits/pixel)
 //         Thus the Avisynth+ specific API functions are safely callable even when connected to classic Avisynth DLL
 
-#ifndef __AVISYNTH_C__
-#define __AVISYNTH_C__
+#ifndef COMPAT_AVISYNTH_AVISYNTH_C_H
+#define COMPAT_AVISYNTH_AVISYNTH_C_H
 
 #include "avs/config.h"
 #include "avs/capi.h"
@@ -341,7 +341,7 @@ typedef struct AVS_VideoInfo {
 
   int audio_samples_per_second;   // 0 means no audio
   int sample_type;
-  INT64 num_audio_samples;
+  int64_t num_audio_samples;
   int nchannels;
 
   // Image type properties
@@ -444,16 +444,16 @@ AVSC_INLINE int avs_bytes_per_channel_sample(const AVS_VideoInfo * p)
 AVSC_INLINE int avs_bytes_per_audio_sample(const AVS_VideoInfo * p)
         { return p->nchannels*avs_bytes_per_channel_sample(p);}
 
-AVSC_INLINE INT64 avs_audio_samples_from_frames(const AVS_VideoInfo * p, INT64 frames)
-        { return ((INT64)(frames) * p->audio_samples_per_second * p->fps_denominator / p->fps_numerator); }
+AVSC_INLINE int64_t avs_audio_samples_from_frames(const AVS_VideoInfo * p, int64_t frames)
+        { return ((int64_t)(frames) * p->audio_samples_per_second * p->fps_denominator / p->fps_numerator); }
 
-AVSC_INLINE int avs_frames_from_audio_samples(const AVS_VideoInfo * p, INT64 samples)
-        { return (int)(samples * (INT64)p->fps_numerator / (INT64)p->fps_denominator / (INT64)p->audio_samples_per_second); }
+AVSC_INLINE int avs_frames_from_audio_samples(const AVS_VideoInfo * p, int64_t samples)
+        { return (int)(samples * (int64_t)p->fps_numerator / (int64_t)p->fps_denominator / (int64_t)p->audio_samples_per_second); }
 
-AVSC_INLINE INT64 avs_audio_samples_from_bytes(const AVS_VideoInfo * p, INT64 bytes)
+AVSC_INLINE int64_t avs_audio_samples_from_bytes(const AVS_VideoInfo * p, int64_t bytes)
         { return bytes / avs_bytes_per_audio_sample(p); }
 
-AVSC_INLINE INT64 avs_bytes_from_audio_samples(const AVS_VideoInfo * p, INT64 samples)
+AVSC_INLINE int64_t avs_bytes_from_audio_samples(const AVS_VideoInfo * p, int64_t samples)
         { return samples * avs_bytes_per_audio_sample(p); }
 
 AVSC_INLINE int avs_audio_channels(const AVS_VideoInfo * p)
@@ -764,7 +764,7 @@ AVSC_API(int, avs_get_parity)(AVS_Clip *, int n);
 // return field parity if field_based, else parity of first field in frame
 
 AVSC_API(int, avs_get_audio)(AVS_Clip *, void * buf,
-                             INT64 start, INT64 count);
+                             int64_t start, int64_t count);
 // start and count are in samples
 
 AVSC_API(int, avs_set_cache_hints)(AVS_Clip *,
@@ -784,7 +784,7 @@ struct AVS_FilterInfo
   AVS_VideoFrame * (AVSC_CC * get_frame)(AVS_FilterInfo *, int n);
   int (AVSC_CC * get_parity)(AVS_FilterInfo *, int n);
   int (AVSC_CC * get_audio)(AVS_FilterInfo *, void * buf,
-                                  INT64 start, INT64 count);
+                                  int64_t start, int64_t count);
   int (AVSC_CC * set_cache_hints)(AVS_FilterInfo *, int cachehints,
                                         int frame_range);
   void (AVSC_CC * free_filter)(AVS_FilterInfo *);
@@ -933,6 +933,8 @@ AVSC_API(void, avs_delete_script_environment)(AVS_ScriptEnvironment *);
 AVSC_API(AVS_VideoFrame *, avs_subframe_planar)(AVS_ScriptEnvironment *, AVS_VideoFrame * src, int rel_offset, int new_pitch, int new_row_size, int new_height, int rel_offsetU, int rel_offsetV, int new_pitchUV);
 // The returned video frame must be be released
 
+#if defined(AVS_WINDOWS)
+// The following stuff is only relevant for Windows DLL handling; Linux does it completely differently.
 #ifdef AVSC_NO_DECLSPEC
 // This part uses LoadLibrary and related functions to dynamically load Avisynth instead of declspec(dllimport)
 // When AVSC_NO_DECLSPEC is defined, you can use avs_load_library to populate API functions into a struct
@@ -944,7 +946,7 @@ AVSC_API(AVS_VideoFrame *, avs_subframe_planar)(AVS_ScriptEnvironment *, AVS_Vid
   void* malloc(size_t)
   void free(void*);
 
-  HMODULE LoadLibrary(const char*);
+  HMODULE LoadLibraryA(const char*);
   void* GetProcAddress(HMODULE, const char*);
   FreeLibrary(HMODULE);
 */
@@ -1261,4 +1263,6 @@ AVSC_INLINE void avs_free_library(AVS_Library *library) {
 }
 #endif
 
-#endif
+#endif // AVS_WINDOWS
+
+#endif // COMPAT_AVISYNTH_AVISYNTH_C_H
diff --git a/compat/avisynth/avs/capi.h b/compat/avisynth/avs/capi.h
index 8799bf1fbb..105892bc2e 100644
--- a/compat/avisynth/avs/capi.h
+++ b/compat/avisynth/avs/capi.h
@@ -30,8 +30,15 @@
 // on Avisynth C Interface, such as 3rd-party filters, import and
 // export plugins, or graphical user interfaces.
 
-#ifndef AVS_CAPI_H
-#define AVS_CAPI_H
+#ifndef COMPAT_AVISYNTH_AVS_CAPI_H
+#define COMPAT_AVISYNTH_AVS_CAPI_H
+
+#include "config.h"
+
+#ifdef AVS_POSIX
+// this is also defined in avs/posix.h
+#define __declspec(x)
+#endif
 
 #ifdef __cplusplus
 #  define EXTERN_C extern "C"
@@ -39,6 +46,7 @@
 #  define EXTERN_C
 #endif
 
+#ifdef AVS_WINDOWS
 #ifdef BUILDING_AVSCORE
 #  if defined(GCC) && defined(X86_32)
 #    define AVSC_CC
@@ -60,6 +68,9 @@
 #    define AVSC_CC
 #  endif
 #endif
+#  else
+#    define AVSC_CC
+#endif
 
 // On 64-bit Windows, there's only one calling convention,
 // so there is no difference between MSVC and GCC. On 32-bit,
@@ -80,9 +91,14 @@
 #define AVSC_INLINE static __inline
 
 #ifdef BUILDING_AVSCORE
+#ifdef AVS_WINDOWS
 #  define AVSC_EXPORT __declspec(dllexport)
 #  define AVSC_API(ret, name) EXTERN_C AVSC_EXPORT ret AVSC_CC name
 #else
+#  define AVSC_EXPORT EXTERN_C
+#  define AVSC_API(ret, name) EXTERN_C ret AVSC_CC name
+#endif
+#else
 #  define AVSC_EXPORT EXTERN_C __declspec(dllexport)
 #  ifndef AVSC_NO_DECLSPEC
 #    define AVSC_API(ret, name) EXTERN_C __declspec(dllimport) ret AVSC_CC name
@@ -91,4 +107,4 @@
 #  endif
 #endif
 
-#endif //AVS_CAPI_H
+#endif // COMPAT_AVISYNTH_AVS_CAPI_H
diff --git a/compat/avisynth/avs/config.h b/compat/avisynth/avs/config.h
index a7d3e692ea..b0e3229a95 100644
--- a/compat/avisynth/avs/config.h
+++ b/compat/avisynth/avs/config.h
@@ -30,8 +30,8 @@
 // on Avisynth C Interface, such as 3rd-party filters, import and
 // export plugins, or graphical user interfaces.
 
-#ifndef AVS_CONFIG_H
-#define AVS_CONFIG_H
+#ifndef COMPAT_AVISYNTH_AVS_CONFIG_H
+#define COMPAT_AVISYNTH_AVS_CONFIG_H
 
 // Undefine this to get cdecl calling convention
 #define AVSC_USE_STDCALL 1
@@ -52,19 +52,53 @@
 #   error Unsupported CPU architecture.
 #endif
 
-#if   defined(_MSC_VER)
+//            VC++  LLVM-Clang-cl   MinGW-Gnu
+// MSVC        x          x
+// MSVC_PURE   x
+// CLANG                  x
+// GCC                                  x
+
+#if defined(__clang__)
+// Check clang first. clang-cl also defines __MSC_VER
+// We set MSVC because they are mostly compatible
+#   define CLANG
+#if defined(_MSC_VER)
 #   define MSVC
+#   define AVS_FORCEINLINE __attribute__((always_inline))
+#else
+#   define AVS_FORCEINLINE __attribute__((always_inline)) inline
+#endif
+#elif   defined(_MSC_VER)
+#   define MSVC
+#   define MSVC_PURE
+#   define AVS_FORCEINLINE __forceinline
 #elif defined(__GNUC__)
 #   define GCC
-#elif defined(__clang__)
-#   define CLANG
+#   define AVS_FORCEINLINE __attribute__((always_inline)) inline
 #else
 #   error Unsupported compiler.
-#endif
-
-#if   defined(GCC)
+#   define AVS_FORCEINLINE inline
 #   undef __forceinline
 #   define __forceinline inline
 #endif
 
-#endif //AVS_CONFIG_H
+#if defined(_WIN32)
+#   define AVS_WINDOWS
+#elif defined(__linux__)
+#   define AVS_LINUX
+#   define AVS_POSIX
+#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
+#   define AVS_BSD
+#   define AVS_POSIX
+#elif defined(__APPLE__)
+#   define AVS_MACOS
+#   define AVS_POSIX
+#else
+#   error Operating system unsupported.
+#endif
+
+#if defined(AVS_POSIX)
+#define NEW_AVSVALUE
+#endif
+
+#endif // COMPAT_AVISYNTH_AVS_CONFIG_H
diff --git a/compat/avisynth/avs/posix.h b/compat/avisynth/avs/posix.h
new file mode 100644
index 0000000000..841acb2e5d
--- /dev/null
+++ b/compat/avisynth/avs/posix.h
@@ -0,0 +1,111 @@
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
+// http://www.gnu.org/copyleft/gpl.html .
+//
+// Linking Avisynth statically or dynamically with other modules is making a
+// combined work based on Avisynth.  Thus, the terms and conditions of the GNU
+// General Public License cover the whole combination.
+//
+// As a special exception, the copyright holders of Avisynth give you
+// permission to link Avisynth with independent modules that communicate with
+// Avisynth solely through the interfaces defined in avisynth.h, regardless of the license
+// terms of these independent modules, and to copy and distribute the
+// resulting combined work under terms of your choice, provided that
+// every copy of the combined work is accompanied by a complete copy of
+// the source code of Avisynth (the version of Avisynth used to produce the
+// combined work), being distributed under the terms of the GNU General
+// Public License plus this exception.  An independent module is a module
+// which is not derived from or based on Avisynth, such as 3rd-party filters,
+// import and export plugins, or graphical user interfaces.
+
+#ifdef AVS_POSIX
+#ifndef COMPAT_AVISYNTH_AVS_POSIX_H
+#define COMPAT_AVISYNTH_AVS_POSIX_H
+
+#ifdef __cplusplus
+#include <cstring>
+#endif
+#include <strings.h>
+#include <unistd.h>
+
+// Define these MSVC-extension used in Avisynth
+#define __single_inheritance
+
+// These things don't exist in Linux
+#define __declspec(x)
+#define lstrlen strlen
+#define lstrcmp strcmp
+#define lstrcmpi strcasecmp
+#define _stricmp strcasecmp
+#define _strnicmp strncasecmp
+#define _strdup strdup
+#define SetCurrentDirectory(x) chdir(x)
+#define SetCurrentDirectoryW(x) chdir(x)
+#define GetCurrentDirectoryW(x) getcwd(x)
+#define _putenv putenv
+#define _alloca alloca
+
+// Borrowing some compatibility macros from AvxSynth, slightly modified
+#define UInt32x32To64(a, b) ((uint64_t)(((uint64_t)((uint32_t)(a))) * ((uint32_t)(b))))
+#define Int64ShrlMod32(a, b) ((uint64_t)((uint64_t)(a) >> (b)))
+#define Int32x32To64(a, b)  ((int64_t)(((int64_t)((long)(a))) * ((long)(b))))
+
+#define InterlockedIncrement(x) __sync_add_and_fetch((x), 1)
+#define InterlockedDecrement(x) __sync_sub_and_fetch((x), 1)
+#define MulDiv(nNumber, nNumerator, nDenominator)   (int32_t) (((int64_t) (nNumber) * (int64_t) (nNumerator) + (int64_t) ((nDenominator)/2)) / (int64_t) (nDenominator))
+
+#ifndef TRUE
+#define TRUE  true
+#endif
+
+#ifndef FALSE
+#define FALSE false
+#endif
+
+#define S_FALSE       (0x00000001)
+#define E_FAIL        (0x80004005)
+#define FAILED(hr)    ((hr) & 0x80000000)
+#define SUCCEEDED(hr) (!FAILED(hr))
+
+// Statuses copied from comments in exception.cpp
+#define STATUS_GUARD_PAGE_VIOLATION 0x80000001
+#define STATUS_DATATYPE_MISALIGNMENT 0x80000002
+#define STATUS_BREAKPOINT 0x80000003
+#define STATUS_SINGLE_STEP 0x80000004
+#define STATUS_ACCESS_VIOLATION 0xc0000005
+#define STATUS_IN_PAGE_ERROR 0xc0000006
+#define STATUS_INVALID_HANDLE 0xc0000008
+#define STATUS_NO_MEMORY 0xc0000017
+#define STATUS_ILLEGAL_INSTRUCTION 0xc000001d
+#define STATUS_NONCONTINUABLE_EXCEPTION 0xc0000025
+#define STATUS_INVALID_DISPOSITION 0xc0000026
+#define STATUS_ARRAY_BOUNDS_EXCEEDED 0xc000008c
+#define STATUS_FLOAT_DENORMAL_OPERAND 0xc000008d
+#define STATUS_FLOAT_DIVIDE_BY_ZERO 0xc000008e
+#define STATUS_FLOAT_INEXACT_RESULT 0xc000008f
+#define STATUS_FLOAT_INVALID_OPERATION 0xc0000090
+#define STATUS_FLOAT_OVERFLOW 0xc0000091
+#define STATUS_FLOAT_STACK_CHECK 0xc0000092
+#define STATUS_FLOAT_UNDERFLOW 0xc0000093
+#define STATUS_INTEGER_DIVIDE_BY_ZERO 0xc0000094
+#define STATUS_INTEGER_OVERFLOW 0xc0000095
+#define STATUS_PRIVILEGED_INSTRUCTION 0xc0000096
+#define STATUS_STACK_OVERFLOW 0xc00000fd
+
+// Calling convension
+#define __stdcall
+#define __cdecl
+
+#endif // COMPAT_AVISYNTH_AVS_POSIX_H
+#endif // AVS_POSIX
diff --git a/compat/avisynth/avs/types.h b/compat/avisynth/avs/types.h
index df15f1d8e5..276db60bf7 100644
--- a/compat/avisynth/avs/types.h
+++ b/compat/avisynth/avs/types.h
@@ -30,11 +30,12 @@
 // on Avisynth C Interface, such as 3rd-party filters, import and
 // export plugins, or graphical user interfaces.
 
-#ifndef AVS_TYPES_H
-#define AVS_TYPES_H
+#ifndef COMPAT_AVISYNTH_AVS_TYPES_H
+#define COMPAT_AVISYNTH_AVS_TYPES_H
 
 // Define all types necessary for interfacing with avisynth.dll
-
+#include <stdint.h>
+#include <stdbool.h>
 #ifdef __cplusplus
   #include <cstddef>
 #else
@@ -42,16 +43,10 @@
 #endif
 
 // Raster types used by VirtualDub & Avisynth
-typedef unsigned int    Pixel32;
-typedef unsigned char   BYTE;
+typedef uint32_t Pixel32;
+typedef uint8_t  BYTE;
 
 // Audio Sample information
 typedef float SFLOAT;
 
-#ifdef __GNUC__
-typedef long long int INT64;
-#else
-typedef __int64 INT64;
-#endif
-
-#endif //AVS_TYPES_H
+#endif // COMPAT_AVISYNTH_AVS_TYPES_H
diff --git a/tests/ref/fate/source b/tests/ref/fate/source
index 1158de1a06..0e2eae3c47 100644
--- a/tests/ref/fate/source
+++ b/tests/ref/fate/source
@@ -19,10 +19,6 @@ libswscale/log2_tab.c
 tools/uncoded_frame.c
 tools/yuvcmp.c
 Headers without standard inclusion guards:
-compat/avisynth/avisynth_c.h
-compat/avisynth/avs/capi.h
-compat/avisynth/avs/config.h
-compat/avisynth/avs/types.h
 compat/avisynth/avxsynth_c.h
 compat/avisynth/windowsPorts/basicDataTypeConversions.h
 compat/avisynth/windowsPorts/windows2linux.h
-- 
2.20.1



More information about the ffmpeg-devel mailing list