diff mbox series

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

Message ID 20200312012155.31783-1-qyot27@gmail.com
State New
Headers show
Series [FFmpeg-devel,1/5] compat/avisynth: update headers
Related show

Checks

Context Check Description
andriy/ffmpeg-patchwork pending
andriy/ffmpeg-patchwork success Applied patch
andriy/ffmpeg-patchwork success Configure finished
andriy/ffmpeg-patchwork success Make finished
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Stephen Hutchinson March 12, 2020, 1:21 a.m. UTC
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

Comments

Marton Balint March 12, 2020, 8:46 a.m. UTC | #1
On Wed, 11 Mar 2020, Stephen Hutchinson wrote:

> 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.

Is it still required to include the headers in our source tree? AVISynth 
was frowned upon in the past beacuse generally we do not allow headers of 
external libraries in our tree.

If there is a way to completely remove the headers and keep the 
feature buildable with reasonable amount of work then I suggest 
we should do that.

Thanks,
Marton

> ---
> 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
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Stephen Hutchinson March 12, 2020, 11:30 p.m. UTC | #2
On 3/12/20 4:46 AM, Marton Balint wrote:
> 
> Is it still required to include the headers in our source tree? AVISynth 
> was frowned upon in the past beacuse generally we do not allow headers 
> of external libraries in our tree.
> 
> If there is a way to completely remove the headers and keep the feature 
> buildable with reasonable amount of work then I suggest we should do that.
> 

I had a feeling this would get brought up, which is why I did make sure 
the necessary changes occurred in AviSynth+ upstream so that FFmpeg 
could use the system headers.

I'll send the revised patches as a reply to this message.
diff mbox series

Patch

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