diff --git a/libvmaf/meson.build b/libvmaf/meson.build index cf20cecbd..81832000a 100644 --- a/libvmaf/meson.build +++ b/libvmaf/meson.build @@ -29,6 +29,16 @@ elif host_machine.system() == 'darwin' endif # Header checks +if cc.has_header('unistd.h', args: test_args) + add_project_arguments('-DHAVE_UNISTD_H', language: ['c', 'cpp']) +endif +if cc.has_header('direct.h', args: test_args) + add_project_arguments('-DHAVE_DIRECT_H', language: ['c', 'cpp']) +endif +if cc.has_header('corecrt_io.h', args: test_args) + add_project_arguments('-DHAVE_CORECRT_IO_H', language: ['c', 'cpp']) +endif + stdatomic_dependency = [] if not cc.check_header('stdatomic.h') if cc.get_id() == 'msvc' @@ -46,6 +56,15 @@ if not cc.check_header('stdatomic.h') endif endif +# Type checks +if cc.has_type('struct timespec', prefix: '#include ') + # Used by pthreads-win32 + add_project_arguments('-DHAVE_STRUCT_TIMESPEC', language: ['c', 'cpp']) +endif +if cc.has_type('mode_t', prefix: '#include ') + add_project_arguments('-DHAVE_MODE_T', language: ['c', 'cpp']) +endif + subdir('include') subdir('src') subdir('tools') diff --git a/libvmaf/src/feature/integer_adm.c b/libvmaf/src/feature/integer_adm.c index 269dbb5e8..8918e4c2f 100644 --- a/libvmaf/src/feature/integer_adm.c +++ b/libvmaf/src/feature/integer_adm.c @@ -31,6 +31,19 @@ #include #endif +#ifdef _MSC_VER +#include + +static inline int __builtin_clz(unsigned x) { + return (int)__lzcnt(x); +} + +static inline int __builtin_clzll(unsigned long long x) { + return (int)__lzcnt64(x); +} + +#endif + typedef struct AdmState { size_t integer_stride; AdmBuffer buf; diff --git a/libvmaf/src/feature/integer_vif.c b/libvmaf/src/feature/integer_vif.c index fd6a82317..352f85751 100644 --- a/libvmaf/src/feature/integer_vif.c +++ b/libvmaf/src/feature/integer_vif.c @@ -626,27 +626,27 @@ static int init(VmafFeatureExtractor *fex, enum VmafPixelFormat pix_fmt, const size_t data_sz = 2 * (pad_size + frame_size + pad_size) + 2 * (h * s->public.buf.stride_16) + 5 * (s->public.buf.stride_32) + 7 * s->public.buf.stride_tmp; - void *data = aligned_malloc(data_sz, MAX_ALIGN); + char *data = aligned_malloc(data_sz, MAX_ALIGN); if (!data) return -ENOMEM; memset(data, 0, data_sz); s->public.buf.data = data; data += pad_size; s->public.buf.ref = data; data += frame_size + pad_size + pad_size; s->public.buf.dis = data; data += frame_size + pad_size; - s->public.buf.mu1 = data; data += h * s->public.buf.stride_16; - s->public.buf.mu2 = data; data += h * s->public.buf.stride_16; - s->public.buf.mu1_32 = data; data += s->public.buf.stride_32; - s->public.buf.mu2_32 = data; data += s->public.buf.stride_32; - s->public.buf.ref_sq = data; data += s->public.buf.stride_32; - s->public.buf.dis_sq = data; data += s->public.buf.stride_32; - s->public.buf.ref_dis = data; data += s->public.buf.stride_32; - s->public.buf.tmp.mu1 = data; data += s->public.buf.stride_tmp; - s->public.buf.tmp.mu2 = data; data += s->public.buf.stride_tmp; - s->public.buf.tmp.ref = data; data += s->public.buf.stride_tmp; - s->public.buf.tmp.dis = data; data += s->public.buf.stride_tmp; - s->public.buf.tmp.ref_dis = data; data += s->public.buf.stride_tmp; - s->public.buf.tmp.ref_convol = data; data += s->public.buf.stride_tmp; - s->public.buf.tmp.dis_convol = data; + s->public.buf.mu1 = (uint16_t *)data; data += h * s->public.buf.stride_16; + s->public.buf.mu2 = (uint16_t *)data; data += h * s->public.buf.stride_16; + s->public.buf.mu1_32 = (uint32_t *)data; data += s->public.buf.stride_32; + s->public.buf.mu2_32 = (uint32_t *)data; data += s->public.buf.stride_32; + s->public.buf.ref_sq = (uint32_t *)data; data += s->public.buf.stride_32; + s->public.buf.dis_sq = (uint32_t *)data; data += s->public.buf.stride_32; + s->public.buf.ref_dis = (uint32_t *)data; data += s->public.buf.stride_32; + s->public.buf.tmp.mu1 = (uint32_t *)data; data += s->public.buf.stride_tmp; + s->public.buf.tmp.mu2 = (uint32_t *)data; data += s->public.buf.stride_tmp; + s->public.buf.tmp.ref = (uint32_t *)data; data += s->public.buf.stride_tmp; + s->public.buf.tmp.dis = (uint32_t *)data; data += s->public.buf.stride_tmp; + s->public.buf.tmp.ref_dis = (uint32_t *)data; data += s->public.buf.stride_tmp; + s->public.buf.tmp.ref_convol = (uint32_t *)data; data += s->public.buf.stride_tmp; + s->public.buf.tmp.dis_convol = (uint32_t *)data; s->feature_name_dict = vmaf_feature_name_dict_from_provided_features(fex->provided_features, diff --git a/libvmaf/src/feature/mkdirp.c b/libvmaf/src/feature/mkdirp.c index 16fe966b3..94c67cecf 100644 --- a/libvmaf/src/feature/mkdirp.c +++ b/libvmaf/src/feature/mkdirp.c @@ -6,7 +6,12 @@ // MIT licensed // +#ifdef HAVE_DIRECT_H +#include // mkdir() +#endif +#ifdef HAVE_UNISTD_H #include +#endif #include #include #include diff --git a/libvmaf/src/feature/mkdirp.h b/libvmaf/src/feature/mkdirp.h index 02371fb57..213eadeea 100644 --- a/libvmaf/src/feature/mkdirp.h +++ b/libvmaf/src/feature/mkdirp.h @@ -12,6 +12,10 @@ #include #include +#if !defined(HAVE_MODE_T) +typedef unsigned short mode_t; +#endif + /* * Recursively `mkdir(path, mode)` */ diff --git a/libvmaf/src/log.c b/libvmaf/src/log.c index f93c7379f..d588c0b5a 100644 --- a/libvmaf/src/log.c +++ b/libvmaf/src/log.c @@ -19,7 +19,12 @@ #include "libvmaf/libvmaf.h" #include +#ifdef HAVE_CORECRT_IO_H +#include // isatty() +#endif +#if HAVE_UNISTD_H #include +#endif static enum VmafLogLevel vmaf_log_level = VMAF_LOG_LEVEL_INFO; static int istty = 0; diff --git a/libvmaf/test/test_framesync.c b/libvmaf/test/test_framesync.c index c6104c0c9..8ea55c8cc 100644 --- a/libvmaf/test/test_framesync.c +++ b/libvmaf/test/test_framesync.c @@ -19,8 +19,10 @@ #include #include #ifdef _WIN32 -#include -#else +#define WIN32_LEAN_AND_MEAN +#include // Sleep() +#endif +#ifdef HAVE_UNISTD_H #include #endif diff --git a/libvmaf/tools/vmaf.c b/libvmaf/tools/vmaf.c index 8029eb39c..fd677a89b 100644 --- a/libvmaf/tools/vmaf.c +++ b/libvmaf/tools/vmaf.c @@ -1,7 +1,12 @@ #include #include #include +#ifdef HAVE_CORECRT_IO_H +#include // isatty() +#endif +#ifdef HAVE_UNISTD_H #include +#endif #include "cli_parse.h" #include "spinner.h"