---
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-requ...@ffmpeg.org with subject "unsubscribe".