diff mbox series

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

Message ID 20200311105019.8553-2-qyot27@gmail.com
State Superseded
Headers show
Series Switch from AvxSynth to AviSynth+ on non-Windows | expand

Checks

Context Check Description
andriy/ffmpeg-patchwork fail Make fate failed

Commit Message

Stephen Hutchinson March 11, 2020, 10:50 a.m. UTC
AviSynth+ can now be used on Linux, which required some changes
to the headers.
---
 compat/avisynth/avisynth_c.h |  24 ++++----
 compat/avisynth/avs/capi.h   |  16 +++++
 compat/avisynth/avs/config.h |  46 +++++++++++++--
 compat/avisynth/avs/posix.h  | 111 +++++++++++++++++++++++++++++++++++
 compat/avisynth/avs/types.h  |  13 ++--
 5 files changed, 185 insertions(+), 25 deletions(-)
 create mode 100644 compat/avisynth/avs/posix.h

Comments

Michael Niedermayer March 11, 2020, 10:03 p.m. UTC | #1
On Wed, Mar 11, 2020 at 06:50:15AM -0400, Stephen Hutchinson wrote:
> AviSynth+ can now be used on Linux, which required some changes
> to the headers.
> ---
>  compat/avisynth/avisynth_c.h |  24 ++++----
>  compat/avisynth/avs/capi.h   |  16 +++++
>  compat/avisynth/avs/config.h |  46 +++++++++++++--
>  compat/avisynth/avs/posix.h  | 111 +++++++++++++++++++++++++++++++++++
>  compat/avisynth/avs/types.h  |  13 ++--
>  5 files changed, 185 insertions(+), 25 deletions(-)
>  create mode 100644 compat/avisynth/avs/posix.h

breaks fate-source

make fate-source
TEST    source
--- ./tests/ref/fate/source	2020-03-11 22:59:07.757862801 +0100
+++ tests/data/fate/source	2020-03-11 23:00:22.237644535 +0100
@@ -22,6 +22,7 @@
 compat/avisynth/avisynth_c.h
 compat/avisynth/avs/capi.h
 compat/avisynth/avs/config.h
+compat/avisynth/avs/posix.h
 compat/avisynth/avs/types.h
 compat/avisynth/avxsynth_c.h
 compat/avisynth/windowsPorts/basicDataTypeConversions.h
Test source failed. Look at tests/data/fate/source.err for details.
tests/Makefile:250: recipe for target 'fate-source' failed
make: *** [fate-source] Error 1

[...]
diff mbox series

Patch

diff --git a/compat/avisynth/avisynth_c.h b/compat/avisynth/avisynth_c.h
index 9ff9321552..03c3530ca9 100644
--- a/compat/avisynth/avisynth_c.h
+++ b/compat/avisynth/avisynth_c.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 // AVS_WINDOWS
+
 #endif
diff --git a/compat/avisynth/avs/capi.h b/compat/avisynth/avs/capi.h
index 8799bf1fbb..4e31a5de48 100644
--- a/compat/avisynth/avs/capi.h
+++ b/compat/avisynth/avs/capi.h
@@ -33,12 +33,20 @@ 
 #ifndef AVS_CAPI_H
 #define 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"
 #else
 #  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
diff --git a/compat/avisynth/avs/config.h b/compat/avisynth/avs/config.h
index a7d3e692ea..896dae20ff 100644
--- a/compat/avisynth/avs/config.h
+++ b/compat/avisynth/avs/config.h
@@ -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
 
+#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 //AVS_CONFIG_H
diff --git a/compat/avisynth/avs/posix.h b/compat/avisynth/avs/posix.h
new file mode 100644
index 0000000000..9c938b26ea
--- /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 AVSCORE_POSIX_H
+#define AVSCORE_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 // AVSCORE_POSIX_H
+#endif // AVS_POSIX
diff --git a/compat/avisynth/avs/types.h b/compat/avisynth/avs/types.h
index df15f1d8e5..ba451c6fae 100644
--- a/compat/avisynth/avs/types.h
+++ b/compat/avisynth/avs/types.h
@@ -34,7 +34,8 @@ 
 #define 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