[vlc-devel] [PATCH 1/1] [RFC] Meson: Add meson build system

Marvin Scholz epirat07 at gmail.com
Thu Aug 1 12:08:47 CEST 2019


---
 bin/meson.build                        |  33 ++
 compat/meson.build                     |  13 +
 config.h.meson                         | 638 +++++++++++++++++++++
 extras/buildsystem/gen-vlc-about.py    |  34 ++
 include/meson.build                    | 126 ++++
 lib/meson.build                        |  26 +
 meson.build                            | 759 +++++++++++++++++++++++++
 meson_options.txt                      | 333 +++++++++++
 modules/access/http/meson.build        |  93 +++
 modules/access/meson.build             | 182 ++++++
 modules/audio_filter/meson.build       | 215 +++++++
 modules/audio_mixer/meson.build        |  13 +
 modules/audio_output/meson.build       |  61 ++
 modules/codec/meson.build              | 584 +++++++++++++++++++
 modules/control/meson.build            |  49 ++
 modules/demux/meson.build              | 473 +++++++++++++++
 modules/gui/meson.build                |  30 +
 modules/gui/qt/meson.build             | 265 +++++++++
 modules/keystore/meson.build           |  47 ++
 modules/logger/meson.build             |  31 +
 modules/meson.build                    | 157 +++++
 modules/meta_engine/meson.build        |  15 +
 modules/misc/meson.build               | 160 ++++++
 modules/packetizer/meson.build         |  98 ++++
 modules/services_discovery/meson.build |  71 +++
 modules/text_renderer/meson.build      |  11 +
 modules/video_chroma/meson.build       |  20 +
 modules/video_filter/meson.build       |  25 +
 modules/video_output/meson.build       | 164 ++++++
 modules/video_splitter/meson.build     |  24 +
 modules/visualization/meson.build      |  29 +
 src/meson.build                        | 268 +++++++++
 src/revision.c.in                      |   2 +
 33 files changed, 5049 insertions(+)
 create mode 100644 bin/meson.build
 create mode 100644 compat/meson.build
 create mode 100644 config.h.meson
 create mode 100644 extras/buildsystem/gen-vlc-about.py
 create mode 100644 include/meson.build
 create mode 100644 lib/meson.build
 create mode 100644 meson.build
 create mode 100644 meson_options.txt
 create mode 100644 modules/access/http/meson.build
 create mode 100644 modules/access/meson.build
 create mode 100644 modules/audio_filter/meson.build
 create mode 100644 modules/audio_mixer/meson.build
 create mode 100644 modules/audio_output/meson.build
 create mode 100644 modules/codec/meson.build
 create mode 100644 modules/control/meson.build
 create mode 100644 modules/demux/meson.build
 create mode 100644 modules/gui/meson.build
 create mode 100644 modules/gui/qt/meson.build
 create mode 100644 modules/keystore/meson.build
 create mode 100644 modules/logger/meson.build
 create mode 100644 modules/meson.build
 create mode 100644 modules/meta_engine/meson.build
 create mode 100644 modules/misc/meson.build
 create mode 100644 modules/packetizer/meson.build
 create mode 100644 modules/services_discovery/meson.build
 create mode 100644 modules/text_renderer/meson.build
 create mode 100644 modules/video_chroma/meson.build
 create mode 100644 modules/video_filter/meson.build
 create mode 100644 modules/video_output/meson.build
 create mode 100644 modules/video_splitter/meson.build
 create mode 100644 modules/visualization/meson.build
 create mode 100644 src/meson.build
 create mode 100644 src/revision.c.in

diff --git a/bin/meson.build b/bin/meson.build
new file mode 100644
index 0000000000..db8ba9dcd5
--- /dev/null
+++ b/bin/meson.build
@@ -0,0 +1,33 @@
+vlc_sources = []
+
+vlc_deps = [m_lib, dl_lib, threads_dep]
+
+if host_system == 'darwin'
+    vlc_sources += ['darwinvlc.m']
+    vlc_deps += corefoundation_dep
+    vlc_deps += dependency('Cocoa', required: true)
+elif host_system == 'windows'
+    vlc_sources += ['winvlc.c']
+else
+    vlc_sources += ['vlc.c', 'override.c']
+endif
+
+executable('vlc',
+    vlc_sources,
+    link_with: [libvlc],
+    include_directories: [vlc_include_dirs],
+    dependencies: vlc_deps,
+    install: true
+)
+
+vlc_top_builddir_def = '-DTOP_BUILDDIR="@0@"'.format(vlc_build_root)
+vlc_top_srcdir_def = '-DTOP_SRCDIR="@0@"'.format(vlc_src_root)
+
+executable('vlc-static',
+    vlc_sources,
+    link_with: [libvlc],
+    include_directories: [vlc_include_dirs],
+    dependencies: vlc_deps,
+    c_args: [vlc_top_builddir_def, vlc_top_srcdir_def],
+    objc_args: [vlc_top_builddir_def, vlc_top_srcdir_def]
+)
diff --git a/compat/meson.build b/compat/meson.build
new file mode 100644
index 0000000000..e371c4d8f9
--- /dev/null
+++ b/compat/meson.build
@@ -0,0 +1,13 @@
+vlc_libcompat = []
+
+if libcompat_sources.length() > 0
+    vlc_libcompat = static_library(
+        'compat',
+        libcompat_sources,
+        include_directories: [vlc_include_dirs],
+        dependencies: [m_lib],
+        pic: true,
+        install: true,
+        install_dir: get_option('libdir') / 'vlc'
+    )
+endif
diff --git a/config.h.meson b/config.h.meson
new file mode 100644
index 0000000000..a421389e6b
--- /dev/null
+++ b/config.h.meson
@@ -0,0 +1,638 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define so that reentrant versions of several functions get declared. */
+#ifndef _REENTRANT
+#mesondefine _REENTRANT
+#endif
+
+/* Same as _REENTANT for some other OSes. */
+#ifndef _THREAD_SAFE
+#mesondefine _THREAD_SAFE
+#endif
+
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+#mesondefine _GNU_SOURCE
+#endif
+
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+#mesondefine _POSIX_PTHREAD_SEMANTICS
+#endif
+
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+#mesondefine __EXTENSIONS__
+#endif
+
+/* Define if the zvbi module is built */
+// #undef ZVBI_COMPILED
+
+/* ISO C, POSIX, and 4.3BSD things. */
+#mesondefine _BSD_SOURCE
+
+/* Define to 64 for large files support. */
+#mesondefine _FILE_OFFSET_BITS
+
+/* Define to 2 to get glibc warnings. */
+#mesondefine _FORTIFY_SOURCE
+
+/* Define to 1 is X display is not avaliable */
+#mesondefine X_DISPLAY_MISSING
+
+#ifdef _WIN32
+
+/* Define to limit the scope of <windows.h>. */
+#define WIN32_LEAN_AND_MEAN 1
+
+/* Define to 1 for Unicode (Wide Chars) APIs. */
+#mesondefine UNICODE
+#mesondefine _UNICODE
+
+# ifndef _WIN32_WINNT
+/* Define for Windows 7 APIs. */
+#mesondefine _WIN32_WINNT
+# endif
+
+# ifndef _WIN32_IE
+/* Define for IE 6.0 (and shell) APIs. */
+#mesondefine _WIN32_IE
+# endif
+
+/* Extensions to ISO C89 from ISO C99. */
+#mesondefine _ISOC99_SOURCE
+
+/* Extensions to ISO C99 from ISO C11. */
+#mesondefine _ISOC11_SOURCE
+
+/* IEEE Std 1003.1. */
+#mesondefine _POSIX_SOURCE
+
+/* IEEE Std 1003.1. */
+#mesondefine _POSIX_C_SOURCE
+
+/* POSIX and XPG 7th edition */
+#mesondefine _XOPEN_SOURCE
+
+/* TODO: Still needed? XPG things and X/Open Unix extensions. */
+#mesondefine _XOPEN_SOURCE_EXTENDED
+
+/* ISO C, POSIX, and 4.3BSD things. */
+#mesondefine _BSD_SOURCE
+
+/* ISO C, POSIX, and SVID things. */
+#mesondefine _SVID_SOURCE
+
+/* Define to 1 to force use of MinGW provided C99 *printf over msvcrt */
+#mesondefine __USE_MINGW_ANSI_STDIO
+
+#endif /* _WIN32 */
+
+/* Define within the LibVLC source code tree. */
+#define __LIBVLC__
+
+/* Define to the libdir */
+#mesondefine LIBDIR
+
+/* Define to the libexecdir */
+#mesondefine LIBEXECDIR
+
+/* Define to the pkgdatadir */
+#mesondefine PKGDATADIR
+
+/* Define to the pkglibdir */
+#mesondefine PKGLIBDIR
+
+/* Define to the pkglibexecdir */
+#mesondefine PKGLIBEXECDIR
+
+/* Define to the sysdatadir */
+#mesondefine SYSDATADIR
+
+/* Define to the localedir */
+#mesondefine LOCALEDIR
+
+/* Default font family */
+#mesondefine DEFAULT_FAMILY
+
+/* Default font */
+#mesondefine DEFAULT_FONT_FILE
+
+/* Default monospace font family */
+#mesondefine DEFAULT_MONOSPACE_FAMILY
+
+/* Default monospace font */
+#mesondefine DEFAULT_MONOSPACE_FONT_FILE
+
+/* Define to 1 to allow running VLC as root (uid 0). */
+#mesondefine ALLOW_RUN_AS_ROOT
+
+/* Binary specific version */
+#mesondefine DISTRO_VERSION
+
+/* Define to 1 for stream output support. */
+#mesondefine ENABLE_SOUT
+
+/* Define to 1 for VideoLAN manager support */
+#mesondefine ENABLE_VLM
+
+/* Define if you want to optimize memory usage over performance */
+#mesondefine OPTIMIZE_MEMORY
+
+/* TODO: assembler capability tests below: */
+
+/* Define to 1 if 3D Now! inline assembly is available. */
+#undef CAN_COMPILE_3DNOW
+
+/* Define to 1 if AltiVec inline assembly is available. */
+#undef CAN_COMPILE_ALTIVEC
+
+/* Define to 1 if C AltiVec extensions are available. */
+#undef CAN_COMPILE_C_ALTIVEC
+
+/* Define to 1 inline MMX assembly is available. */
+#undef CAN_COMPILE_MMX
+
+/* Define to 1 if MMX EXT inline assembly is available. */
+#undef CAN_COMPILE_MMXEXT
+
+/* Define to 1 if SSE inline assembly is available. */
+#undef CAN_COMPILE_SSE
+
+/* Define to 1 if SSE2 inline assembly is available. */
+#undef CAN_COMPILE_SSE2
+
+/* Define to 1 if SSE3 inline assembly is available. */
+#undef CAN_COMPILE_SSE3
+
+/* Define to 1 if SSE4A inline assembly is available. */
+#undef CAN_COMPILE_SSE4A
+
+/* Define to 1 if SSE4_1 inline assembly is available. */
+#undef CAN_COMPILE_SSE4_1
+
+/* Define to 1 if SSE4_2 inline assembly is available. */
+#undef CAN_COMPILE_SSE4_2
+
+/* Define to 1 if SSSE3 inline assembly is available. */
+#undef CAN_COMPILE_SSSE3
+
+/* TODO Define to 1 if SSE2 intrinsics are available. */
+#undef HAVE_SSE2_INTRINSICS
+
+/* The ./configure command line (not supported with meson for now) */
+#define CONFIGURE_LINE "[unsupported with meson]"
+
+/* The copyright years */
+#mesondefine COPYRIGHT_YEARS
+
+/* Copyright string */
+#mesondefine COPYRIGHT_MESSAGE
+
+/* Dynamic object extension */
+#mesondefine LIBEXT
+
+/* Define to 1 if translation of program messages to the user's native
+   language is requested. */
+#mesondefine ENABLE_NLS
+
+
+/*
+ *   Type/attributes/etc macros
+ */
+
+/* Support for __attribute__((packed)) for structs */
+#mesondefine HAVE_ATTRIBUTE_PACKED
+
+/* Define to 1 if C++ headers define locale_t */
+#mesondefine HAVE_CXX_LOCALE_T
+
+/* Defined to 1 if C11 _Thread_local storage qualifier is supported */
+#mesondefine HAVE_THREAD_LOCAL
+
+/* TODO: For NetBSD VCD support */
+#undef HAVE_SCSIREQ_IN_SYS_SCSIIO_H
+
+/* TODO: Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+
+/*
+ * Library check macros
+ */
+
+/* Define to 1 if you have GNU libidn. */
+#undef HAVE_IDN
+
+
+/*
+ * Header check macros
+ */
+
+/* Hardcode for now, not sure why these 4 header checks exist
+ * as the code does not even work fine if one of them is
+ * not defined, apparently.
+ */
+#define HAVE_LIBAVUTIL_AVUTIL_H 1
+#define HAVE_LIBAVCODEC_AVCODEC_H 1
+#define HAVE_LIBAVFORMAT_AVFORMAT_H 1
+#define HAVE_LIBAVFORMAT_AVIO_H 1
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#mesondefine HAVE_EXECINFO_H
+
+/* Define to 1 if you have the <features.h> header file. */
+#mesondefine HAVE_FEATURES_H
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#mesondefine HAVE_GETOPT_H
+
+/* Define to 1 if you have the <linux/dccp.h> header file. */
+#mesondefine HAVE_LINUX_DCCP_H
+
+/* Define to 1 if you have the <linux/magic.h> header file. */
+#mesondefine HAVE_LINUX_MAGIC_H
+
+/* Define to 1 if you have the <netinet/tcp.h> header file. */
+#mesondefine HAVE_NETINET_TCP_H
+
+/* Define to 1 if you have the <netinet/udplite.h> header file. */
+#mesondefine HAVE_NETINET_UDPLITE_H
+
+/* Define to 1 if you have the <net/if.h> header file. */
+#mesondefine HAVE_NET_IF_H
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#mesondefine HAVE_PTHREAD_H
+
+/* Define to 1 if you have the <search.h> header file. */
+#mesondefine HAVE_SEARCH_H
+
+/* Define to 1 if you have the <sys/eventfd.h> header file. */
+#mesondefine HAVE_SYS_EVENTFD_H
+
+/* Define to 1 if you have the <sys/mount.h> header file. */
+#mesondefine HAVE_SYS_MOUNT_H
+
+/* Define to 1 if you have the <sys/shm.h> header file. */
+#mesondefine HAVE_SYS_SHM_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#mesondefine HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/soundcard.h> header file. */
+#mesondefine HAVE_SYS_SOUNDCARD_H
+
+/* Define to 1 if you have the <sys/uio.h> header file. */
+#mesondefine HAVE_SYS_UIO_H
+
+/* Define to 1 if you have the <threads.h> header file. */
+#mesondefine HAVE_THREADS_H
+
+/* Define to 1 if you have the <valgrind/valgrind.h> header file. */
+#mesondefine HAVE_VALGRIND_VALGRIND_H
+
+/* Define to 1 if you have the <X11/Xlib.h> header file. */
+#mesondefine HAVE_X11_XLIB_H
+
+/* Define to 1 if you have the <xlocale.h> header file. */
+#mesondefine HAVE_XLOCALE_H
+
+/* Define to 1 if you have the <zlib.h> header file. */
+#mesondefine HAVE_ZLIB_H
+
+
+/*
+ *   Function check macros
+ */
+
+/* Define to 1 if you have the `accept4' function. */
+#mesondefine HAVE_ACCEPT4
+
+/* Define to 1 if you have the `aligned_alloc' function. */
+#mesondefine HAVE_ALIGNED_ALLOC
+
+/* Define to 1 if you have asprintf function */
+#mesondefine HAVE_ASPRINTF
+
+/* Define to 1 if you have the `atof' function. */
+#mesondefine HAVE_ATOF
+
+/* Define to 1 if you have the `atoll' function. */
+#mesondefine HAVE_ATOLL
+
+/* Define to 1 if you have the `qsort_r' function. */
+#mesondefine HAVE_QSORT_R
+
+/* Define to 1 if you have the `backtrace' function. */
+#mesondefine HAVE_BACKTRACE
+
+/* Define to 1 if you have the `daemon' function. */
+#mesondefine HAVE_DAEMON
+
+/* Define to 1 if you have the `dirfd' function. */
+#mesondefine HAVE_DIRFD
+
+/* Define to 1 if you have the `eventfd' function. */
+#mesondefine HAVE_EVENTFD
+
+/* Define to 1 if you have the `fcntl' function. */
+#mesondefine HAVE_FCNTL
+
+/* Define to 1 if you have the `fdopendir' function. */
+#mesondefine HAVE_FDOPENDIR
+
+/* Define to 1 if you have the `HAVE_SIGWAIT' function */
+#mesondefine HAVE_SIGWAIT
+
+/* Define to 1 if you have the `flock' function. */
+#mesondefine HAVE_FLOCK
+
+/* Define to 1 if you have the `flockfile' function. */
+#mesondefine HAVE_FLOCKFILE
+
+/* Define to 1 if you have the `fork' function. */
+#mesondefine HAVE_FORK
+
+/* Define to 1 if you have the `fstatvfs' function. */
+#mesondefine HAVE_FSTATVFS
+
+/* Define to 1 if you have the `fsync' function. */
+#mesondefine HAVE_FSYNC
+
+/* Define to 1 if you have the `getdelim' function. */
+#mesondefine HAVE_GETDELIM
+
+/* Define to 1 if you have the `getenv' function. */
+#mesondefine HAVE_GETENV
+
+/* Define to 1 if you have the `getpid' function. */
+#mesondefine HAVE_GETPID
+
+/* Define to 1 if you have the `getpwuid_r' function. */
+#mesondefine HAVE_GETPWUID_R
+
+/* TODO: Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#mesondefine HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have gmtime_r function */
+#mesondefine HAVE_GMTIME_R
+
+/* TODO: Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define to 1 if you have the `if_nameindex' function. */
+#mesondefine HAVE_IF_NAMEINDEX
+
+/* Define to 1 if you have the `if_nametoindex' function. */
+#mesondefine HAVE_IF_NAMETOINDEX
+
+/* Define to 1 if you have inet_pton function */
+#mesondefine HAVE_INET_PTON
+
+/* Define to 1 if you have the `isatty' function. */
+#mesondefine HAVE_ISATTY
+
+/* Define to 1 if you have the `lldiv' function. */
+#mesondefine HAVE_LLDIV
+
+/* Define to 1 if you have localtime_r function */
+#mesondefine HAVE_LOCALTIME_R
+
+/* Define to 1 if the system has the type `max_align_t'. */
+#mesondefine HAVE_MAX_ALIGN_T
+
+/* Define to 1 if you have the `memalign' function. */
+#mesondefine HAVE_MEMALIGN
+
+/* Define to 1 if you have the `memfd_create' function. */
+#mesondefine HAVE_MEMFD_CREATE
+
+/* Define to 1 if you have the `memrchr' function. */
+#mesondefine HAVE_MEMRCHR
+
+/* Define to 1 if you have the `mkostemp' function. */
+#mesondefine HAVE_MKOSTEMP
+
+/* Define to 1 if you have the `mmap' function. */
+#mesondefine HAVE_MMAP
+
+/* Define to 1 if you have the `nanf' function */
+#mesondefine HAVE_NANF
+
+/* Define to 1 if you have the `newlocale' function. */
+#mesondefine HAVE_NEWLOCALE
+
+/* Define to 1 if you have the `nrand48' function. */
+#mesondefine HAVE_NRAND48
+
+/* Define to 1 if you have the `openat' function. */
+#mesondefine HAVE_OPENAT
+
+/* Define to 1 if you have the `open_memstream' function. */
+#mesondefine HAVE_OPEN_MEMSTREAM
+
+/* Define to 1 if you have the `pathconf' function. */
+#mesondefine HAVE_PATHCONF
+
+/* Define to 1 if you have the `pipe2' function. */
+#mesondefine HAVE_PIPE2
+
+/* Define to 1 if you have the `poll' function. */
+#mesondefine HAVE_POLL
+
+/* Define to 1 if you have the `posix_fadvise' function. */
+#mesondefine HAVE_POSIX_FADVISE
+
+/* Define to 1 if you have the `posix_memalign' function. */
+#mesondefine HAVE_POSIX_MEMALIGN
+
+/* TODO: Define to 1 if the system has the type
+   `PROCESS_MITIGATION_IMAGE_LOAD_POLICY'. */
+#undef HAVE_PROCESS_MITIGATION_IMAGE_LOAD_POLICY
+
+/* Define to 1 if you have realpath function */
+#mesondefine HAVE_REALPATH
+
+/* Define to 1 if you have the `recvmmsg' function. */
+#mesondefine HAVE_RECVMMSG
+
+/* Define to 1 if you have the `recvmsg' function. */
+#mesondefine HAVE_RECVMSG
+
+/* Define to 1 if you have the `rewind' function. */
+#mesondefine HAVE_REWIND
+
+/* Define to 1 if you have the `sched_getaffinity' function. */
+#mesondefine HAVE_SCHED_GETAFFINITY
+
+/* Define to 1 if you have the `sendmsg' function. */
+#mesondefine HAVE_SENDMSG
+
+/* Define to 1 if you have the `setenv' function. */
+#mesondefine HAVE_SETENV
+
+/* Define to 1 if you have the sincos function. */
+#mesondefine HAVE_SINCOS
+
+/* Define to 1 if <assert.h> defines static_assert. */
+#mesondefine HAVE_STATIC_ASSERT
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#mesondefine HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strcasestr' function. */
+#mesondefine HAVE_STRCASESTR
+
+/* Define to 1 if you have the `strcoll' function */
+#mesondefine HAVE_STRCOLL
+
+/* Define to 1 if you have the `strdup' function. */
+#mesondefine HAVE_STRDUP
+
+/* Define to 1 if you have the `stricmp' function. */
+#mesondefine HAVE_STRICMP
+
+/* Define to 1 if you have the `strlcpy' function. */
+#mesondefine HAVE_STRLCPY
+
+/* Define to 1 if you have the `strndup' function. */
+#mesondefine HAVE_STRNDUP
+
+/* Define to 1 if you have the `strnlen' function. */
+#mesondefine HAVE_STRNLEN
+
+/* Define to 1 if you have the `strnstr' function. */
+#mesondefine HAVE_STRNSTR
+
+/* Define to 1 if you have the `strsep' function. */
+#mesondefine HAVE_STRSEP
+
+/* Define to 1 if you have the `strtof' function. */
+#mesondefine HAVE_STRTOF
+
+/* Define to 1 if you have the `strtok_r' function. */
+#mesondefine HAVE_STRTOK_R
+
+/* Define to 1 if you have the `strtoll' function. */
+#mesondefine HAVE_STRTOLL
+
+/* Define to 1 if the system has the type `struct pollfd'. */
+#mesondefine HAVE_STRUCT_POLLFD
+
+/* Define to 1 if the system has the type `struct timespec'. */
+#mesondefine HAVE_STRUCT_TIMESPEC
+
+/* Define to 1 if you have the `strverscmp' function. */
+#mesondefine HAVE_STRVERSCMP
+
+/* Define to 1 if you have the `swab' function. */
+#mesondefine HAVE_SWAB
+
+/* Define to 1 if you have the `tdestroy' function. */
+#mesondefine HAVE_TDESTROY
+
+/* Define to 1 if you have the `tfind' function. */
+#mesondefine HAVE_TFIND
+
+/* Define to 1 if you have the `timegm' function. */
+#mesondefine HAVE_TIMEGM
+
+/* Define to 1 if you have the `timespec_get' function. */
+#mesondefine HAVE_TIMESPEC_GET
+
+/* Define to 1 if you have the `uselocale' function. */
+#mesondefine HAVE_USELOCALE
+
+/* Define to 1 if you have vasprintf function */
+#mesondefine HAVE_VASPRINTF
+
+/* Define to 1 if you have the `vmsplice' function. */
+#undef HAVE_VMSPLICE
+
+/* Define to 1 if you have the `_lock_file' function. */
+#undef HAVE__LOCK_FILE
+
+/* Defined to 1 if the qsort_r() prototype contradicts the upcoming POSIX
+   standard. */
+#mesondefine HAVE_BROKEN_QSORT_R
+
+/* Name of package */
+#mesondefine PACKAGE
+
+/* Define to the full name of this package. */
+#mesondefine PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#mesondefine PACKAGE_STRING
+
+/* Define to the version of this package. */
+#mesondefine PACKAGE_VERSION
+
+/* version development string */
+#undef PACKAGE_VERSION_DEV
+
+/* version extra number */
+#undef PACKAGE_VERSION_EXTRA
+
+/* version major number */
+#undef PACKAGE_VERSION_MAJOR
+
+/* version minor number */
+#undef PACKAGE_VERSION_MINOR
+
+/* version revision number */
+#undef PACKAGE_VERSION_REVISION
+
+/* Version number of package */
+#mesondefine VERSION
+
+/* Simple version string */
+#mesondefine VERSION_MESSAGE
+
+/* compiler */
+#mesondefine VLC_COMPILER
+
+/* user who ran configure */
+#mesondefine VLC_COMPILE_BY
+
+/* host which ran configure */
+#mesondefine VLC_COMPILE_HOST
+
+/* TODO: Define to 1 if you want to build for Windows Store apps */
+#undef VLC_WINSTORE_APP
+
+/* Define to 1 if build machine is big endian */
+#mesondefine WORDS_BIGENDIAN
+
+/* Alias fdatasync() to fsync() if missing. */
+#mesondefine fdatasync
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+   nothing if this is not supported.  Do not define if restrict is
+   supported directly.  */
+#mesondefine restrict
+
+/* Define to `sockaddr' if <sys/socket.h> does not define. */
+#mesondefine sockaddr_storage
+
+/* Define to `sa_family' if <sys/socket.h> does not define. */
+#mesondefine ss_family
+
+/* Define to `int' if <sys/types.h> does not define. */
+#mesondefine ssize_t
+
+#include <vlc_fixups.h>
+
+#if defined(_MSC_VER) && !defined(__clang__)
+# pragma fenv_access(off)
+# pragma fp_contract(on)
+#elif defined(__GNUC__)
+/* Not supported so far */
+#else
+# pragma STDC FENV_ACCESS OFF
+# pragma STDC FP_CONTRACT ON
+#endif
diff --git a/extras/buildsystem/gen-vlc-about.py b/extras/buildsystem/gen-vlc-about.py
new file mode 100644
index 0000000000..f683eb4ae7
--- /dev/null
+++ b/extras/buildsystem/gen-vlc-about.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+import os, re, argparse
+
+parser = argparse.ArgumentParser()
+# Input files
+parser.add_argument("copying", type=argparse.FileType('r', encoding='UTF-8'))
+parser.add_argument("thanks", type=argparse.FileType('r', encoding='UTF-8'))
+parser.add_argument("authors", type=argparse.FileType('r', encoding='UTF-8'))
+# Output files
+parser.add_argument("output", type=argparse.FileType('w', encoding='UTF-8'))
+args = parser.parse_args()
+
+# Regex to remove emails in thanks and authors files
+email_regex = re.compile(r'<.*.>')
+
+output_str = '/* Automatically generated file - DO NOT EDIT */\n\n'
+
+with args.copying:
+    output_str += 'static const char psz_license[] =\n"'
+    output_str += args.copying.read().replace('"', '\\"').replace('\r', '').replace('\n', '\\n"\n"')
+    output_str += '";\n\n'
+
+with args.thanks:
+    output_str += 'static const char psz_thanks[] =\n"'
+    output_str += email_regex.sub('', args.thanks.read().replace('"', '\\"').replace('\r', '').replace('\n', '\\n"\n"'))
+    output_str += '";\n\n'
+
+with args.authors:
+    output_str += 'static const char psz_authors[] =\n"'
+    output_str += email_regex.sub('', args.authors.read().replace('"', '\\"').replace('\r', '').replace('\n', '\\n"\n"'))
+    output_str += '";\n\n'
+
+with args.output:
+    args.output.write(output_str)
diff --git a/include/meson.build b/include/meson.build
new file mode 100644
index 0000000000..b3e2a2fa3d
--- /dev/null
+++ b/include/meson.build
@@ -0,0 +1,126 @@
+# Generate LibVLC version header
+libvlc_version_h = configure_file(
+    input: 'vlc/libvlc_version.h.in',
+    output: 'libvlc_version.h',
+    configuration: cdata
+)
+
+# Install LibVLC headers
+install_headers(
+    'vlc/vlc.h',
+    'vlc/libvlc.h',
+    'vlc/libvlc_dialog.h',
+    'vlc/libvlc_events.h',
+    'vlc/libvlc_media.h',
+    'vlc/libvlc_media_discoverer.h',
+    'vlc/libvlc_media_list.h',
+    'vlc/libvlc_media_list_player.h',
+    'vlc/libvlc_media_player.h',
+    'vlc/libvlc_picture.h',
+    'vlc/libvlc_renderer_discoverer.h',
+    'vlc/deprecated.h',
+    libvlc_version_h,
+    subdir : 'vlc')
+
+# Install VLC plugin headers
+install_headers(
+    'vlc_access.h',
+    'vlc_actions.h',
+    'vlc_addons.h',
+    'vlc_aout.h',
+    'vlc_aout_volume.h',
+    'vlc_arrays.h',
+    'vlc_atomic.h',
+    'vlc_avcodec.h',
+    'vlc_bits.h',
+    'vlc_block.h',
+    'vlc_block_helper.h',
+    'vlc_boxes.h',
+    'vlc_charset.h',
+    'vlc_codec.h',
+    'vlc_codecs.h',
+    'vlc_common.h',
+    'vlc_config.h',
+    'vlc_config_cat.h',
+    'vlc_configuration.h',
+    'vlc_cpu.h',
+    'vlc_cxx_helpers.hpp',
+    'vlc_decoder.h',
+    'vlc_demux.h',
+    'vlc_dialog.h',
+    'vlc_epg.h',
+    'vlc_es.h',
+    'vlc_es_out.h',
+    'vlc_events.h',
+    'vlc_extensions.h',
+    'vlc_filter.h',
+    'vlc_fingerprinter.h',
+    'vlc_fixups.h',
+    'vlc_fourcc.h',
+    'vlc_fs.h',
+    'vlc_gcrypt.h',
+    'vlc_http.h',
+    'vlc_httpd.h',
+    'vlc_image.h',
+    'vlc_inhibit.h',
+    'vlc_input.h',
+    'vlc_input_item.h',
+    'vlc_interface.h',
+    'vlc_interrupt.h',
+    'vlc_intf_strings.h',
+    'vlc_iso_lang.h',
+    'vlc_keystore.h',
+    'vlc_list.h',
+    'vlc_md5.h',
+    'vlc_media_library.h',
+    'vlc_media_source.h',
+    'vlc_memstream.h',
+    'vlc_messages.h',
+    'vlc_meta.h',
+    'vlc_meta_fetcher.h',
+    'vlc_mime.h',
+    'vlc_modules.h',
+    'vlc_mouse.h',
+    'vlc_network.h',
+    'vlc_objects.h',
+    'vlc_opengl.h',
+    'vlc_pgpkey.h',
+    'vlc_picture.h',
+    'vlc_picture_fifo.h',
+    'vlc_picture_pool.h',
+    'vlc_player.h',
+    'vlc_playlist.h',
+    'vlc_playlist_export.h',
+    'vlc_plugin.h',
+    'vlc_probe.h',
+    'vlc_rand.h',
+    'vlc_renderer_discovery.h',
+    'vlc_services_discovery.h',
+    'vlc_sort.h',
+    'vlc_sout.h',
+    'vlc_spu.h',
+    'vlc_stream.h',
+    'vlc_stream_extractor.h',
+    'vlc_strings.h',
+    'vlc_subpicture.h',
+    'vlc_text_style.h',
+    'vlc_threads.h',
+    'vlc_thumbnailer.h',
+    'vlc_tick.h',
+    'vlc_timestamp_helper.h',
+    'vlc_tls.h',
+    'vlc_update.h',
+    'vlc_url.h',
+    'vlc_variables.h',
+    'vlc_vector.h',
+    'vlc_video_splitter.h',
+    'vlc_viewpoint.h',
+    'vlc_vlm.h',
+    'vlc_vod.h',
+    'vlc_vout.h',
+    'vlc_vout_display.h',
+    'vlc_vout_osd.h',
+    'vlc_vout_window.h',
+    'vlc_xlib.h',
+    'vlc_xml.h',
+    subdir : 'vlc/plugins')
diff --git a/lib/meson.build b/lib/meson.build
new file mode 100644
index 0000000000..8d8b026a81
--- /dev/null
+++ b/lib/meson.build
@@ -0,0 +1,26 @@
+libvlc_sources = [
+    'core.c',
+    'dialog.c',
+    'renderer_discoverer.c',
+    'error.c',
+    'log.c',
+    'playlist.c',
+    'picture.c',
+    'video.c',
+    'audio.c',
+    'event.c',
+    'media.c',
+    'media_player.c',
+    'media_list.c',
+    'media_list_path.h',
+    'media_list_player.c',
+    'media_discoverer.c',
+]
+
+libvlc = library('vlc',
+    libvlc_sources, rev_target, libvlc_version_h,
+    include_directories: [vlc_include_dirs],
+    link_with: [vlc_libcompat, libvlccore],
+    dependencies: [m_lib, threads_dep],
+    install: true
+)
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000000..9eb7551c65
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,759 @@
+project('VLC', ['c', 'cpp'],
+    version : '4.0.0-dev',
+    default_options : ['c_std=gnu11', 'cpp_std=gnu++11'],
+    meson_version : '>=0.49.0')
+
+vlc_copyright_years = '1996-2018'
+vlc_version_codename = 'Otto Chriek'
+
+vlc_version = meson.project_version()
+version_arr = vlc_version.split('.')
+version_arr_last = version_arr[2].split('-')
+
+vlc_version_major = version_arr.get(0).to_int()
+vlc_version_minor = version_arr.get(1).to_int()
+vlc_version_revision = version_arr_last.get(0).to_int()
+vlc_version_type  = version_arr_last.get(1, '')
+
+vlc_src_root = meson.current_source_dir()
+vlc_build_root = meson.current_build_dir()
+
+cdata = configuration_data()
+vlc_include_dirs = include_directories('.', 'include')
+
+gen_vlc_about = find_program('extras/buildsystem/gen-vlc-about.py')
+vlc_about = custom_target('vlc_about.h',
+                        input:   ['COPYING', 'THANKS', 'AUTHORS'],
+                        output:  ['vlc_about.h'],
+                        command: [gen_vlc_about,
+                                   '@INPUT0@',
+                                   '@INPUT1@',
+                                   '@INPUT2@',
+                                   '@OUTPUT@'])
+
+add_project_arguments('-DHAVE_CONFIG_H=1', language : ['c', 'cpp', 'objc'])
+
+cc = meson.get_compiler('c')
+cpp = meson.get_compiler('cpp')
+host_system = host_machine.system()
+
+if host_system == 'darwin'
+    add_languages('objc')
+    add_project_arguments('-mmacosx-version-min=10.10',
+        language: ['c', 'cpp', 'objc'])
+    add_project_link_arguments('-mmacosx-version-min=10.10',
+        language: ['c', 'cpp', 'objc'])
+endif
+
+#
+# General feature defines
+#
+vlc_conf_prefix = ''
+
+feature_defines = [
+    ['_GNU_SOURCE', 1], # Enable GNU extensions on systems that have them
+]
+
+if host_system == 'darwin'
+    feature_defines += [
+        ['_INTL_REDIRECT_MACROS', 1] # Define to use macros for libintl
+                                     # prefixed functions (see libgnuintl.h)
+    ]
+endif
+
+foreach d : feature_defines
+    cdata.set(d.get(0), d.get(1))
+    vlc_conf_prefix = vlc_conf_prefix + '#define @0@ @1@\n'.format(d.get(0), d.get(1))
+endforeach
+
+#
+# Check for global dependencies
+# These are dependencies needed by libvlc or
+# libvlccore and by some modules too.
+#
+# ATTENTION: Take care to follow the naming convetions:
+# - Libraries found with find_lirary() must be named `name_lib`
+# - Libraries (or Frameworks) found with dependency() must be
+#   named `name_dep`
+#
+
+# zlib library
+z_lib = cc.find_library('z', required: false)
+
+# Math library
+m_lib = cc.find_library('m', required: false)
+
+# Dynamic library loading library
+dl_lib = cc.find_library('dl', required: false)
+
+# Iconv library
+iconv_lib = cc.find_library('iconv', required: false)
+
+if host_system == 'darwin'
+    corefoundation_dep = dependency('CoreFoundation', required: true)
+    foundation_dep = dependency('Foundation', required: true)
+else
+    corefoundation_dep = []
+    foundation_dep = []
+endif
+
+# Gettext
+if cc.has_function('ngettext', prefix : '#include <libintl.h>')
+    libintl_lib = []
+    cdata.set('HAVE_GETTEXT', 1)
+    cdata.set('ENABLE_NLS', 1)
+else
+    libintl_lib = cc.find_library('intl', required : false)
+    if libintl_lib.found()
+        cdata.set('ENABLE_NLS', 1)
+    endif
+endif
+
+# Threads
+threads_dep = dependency('threads', required: true)
+
+# TODO:
+# The libraries below are not needed by libvlc or libvlccore
+# and should be moved to the modules meson.build file.
+
+# Check for X11
+x11_dep = dependency('x11', required: false)
+if not x11_dep.found()
+    cdata.set('X_DISPLAY_MISSING', 1)
+endif
+
+# Check for X C bindings (XCB)
+if (host_system != 'darwin' and host_system != 'windows') or get_option('xcb').enabled()
+    xcb_dep = dependency('xcb', version : '>= 1.6', required : get_option('xcb'))
+    xcb_composite_dep = dependency('xcb-composite', required : get_option('xcb'))
+    xcb_randr_dep = dependency('xcb-randr', version : '>= 1.3', required : get_option('xcb'))
+    xcb_render_dep = dependency('xcb-render', required : get_option('xcb'))
+    xcb_shm_dep = dependency('xcb-shm', version : '>= 1.9.2', required : get_option('xcb'))
+    xcb_xkb_dep = dependency('xcb-xkb', required : get_option('xcb'))
+    xcb_keysyms_dep = dependency('xcb-keysyms', version : '>= 0.3.4', required : get_option('xcb'))
+    xproto_dep = dependency('xproto', required : get_option('xcb'))
+else
+    xcb_dep = dependency('', required : false)
+endif
+
+# Check for Wayland
+if (host_system != 'darwin' and host_system != 'windows') or get_option('xcb').enabled()
+    wayland_scanner_dep = dependency('wayland-scanner', version : '>= 1.15',
+        required : get_option('wayland'), native : true)
+
+    wayland_protocols_dep = dependency('wayland-protocols', version: '>= 1.15',
+        required : get_option('wayland'))
+
+    wayland_deps = [
+        dependency('wayland-client', version : '>= 1.5.91', required : get_option('wayland')),
+        dependency('wayland-cursor', required : get_option('wayland')),
+        dependency('wayland-egl', required : get_option('wayland')),
+        wayland_scanner_dep,
+        wayland_protocols_dep
+    ]
+
+    have_wayland = true
+    foreach iter_wayland_dep : wayland_deps
+        if (iter_wayland_dep.found() == false)
+            message('Wayland disabled. (not all needed dependencies found)')
+            have_wayland = false
+            break
+        endif
+    endforeach
+
+    if have_wayland
+        wayland_scanner = find_program(
+            wayland_scanner_dep.get_pkgconfig_variable('wayland_scanner'),
+            native: true
+        )
+        wayland_protocols_dir = wayland_protocols_dep.get_pkgconfig_variable('pkgdatadir')
+    endif
+else
+    have_wayland = false
+endif
+
+#
+# Check for headers
+#
+
+check_headers = [
+    'threads.h',
+    'netinet/tcp.h',
+    'search.h',
+    'sys/uio.h',
+    'sys/socket.h',
+    'net/if.h',
+    'execinfo.h',
+    'features.h',
+    'getopt.h',
+    'linux/dccp.h',
+    'linux/magic.h',
+    'netinet/udplite.h',
+    'pthread.h',
+    'sys/eventfd.h',
+    'sys/mount.h',
+    'sys/shm.h',
+    'sys/socket.h',
+    'sys/soundcard.h',
+    'sys/uio.h',
+    'valgrind/valgrind.h',
+    'X11/Xlib.h',
+    'xlocale.h',
+    'zlib.h',
+]
+
+foreach header : check_headers
+    if cc.check_header(header)
+        cdata.set('HAVE_' + header.underscorify().to_upper(), 1)
+    endif
+endforeach
+
+
+#
+# Darwin specific checks
+#
+
+if host_system == 'darwin'
+
+    # Check if compiling for iOS
+    have_ios = cc.get_define('TARGET_OS_IPHONE',
+        prefix : '#include <TargetConditionals.h>') == '1'
+
+    # Check if compiling for tvOS
+    have_tvos = cc.get_define('TARGET_OS_TV',
+        prefix : '#include <TargetConditionals.h>') == '1'
+
+    # If none of the above, assume compiling for macOS
+    have_osx = not have_ios and not have_tvos
+
+else
+    have_ios = false
+    have_tvos = false
+    have_osx = false
+endif
+
+
+#
+# Windows and MinGW checks
+#
+
+have_mingw = false
+mingw_libs = []
+
+if host_system == 'windows'
+
+    # Defines needed for Windows
+    windows_defines = [
+        ['UNICODE',      1], # Define to 1 for Unicode (Wide Chars) APIs
+        ['_WIN32_WINNT', '0x0601'], # Define for Windows 7 APIs
+    ]
+
+    foreach d : windows_defines
+        cdata.set(d.get(0), d.get(1))
+        vlc_conf_prefix = vlc_conf_prefix + '#define @0@ @1@\n'.format(d.get(0), d.get(1))
+    endforeach
+
+    mingw_check = '''
+    #ifndef __MINGW32__
+    # error Not compiling with mingw
+    #endif
+    '''
+
+    # Check if MinGW is used at all
+    if cc.compiles(mingw_check)
+
+        # Check which kind of MinGW
+        mingw_version_major = cc.get_define('__MINGW64_VERSION_MAJOR',
+            prefix : '#include <_mingw.h>')
+
+        if mingw_version_major == ''
+            error('Cannot compile with MinGW, use MinGW-w64 >= 5.0 instead.')
+        endif
+
+        # Check that MinGW w64 is at least 5.0
+        if mingw_version_major.to_int() < 5
+            error('MinGW-w64 5.0 or higher required!')
+        endif
+
+        have_mingw = true
+
+        mingw_version_minor = cc.get_define('__MINGW64_VERSION_MINOR',
+            prefix : '#include <_mingw.h>')
+
+        mingw_version = '@0 at .@1@'.format(mingw_version_major, mingw_version_minor)
+        message('Using MinGW-w64 ' + mingw_version)
+
+        # Defines needed for MinGW
+
+        mingw_defines = [
+            ['__USE_MINGW_ANSI_STDIO',      1], # Define to force use of MinGW printf
+            ['_ISOC99_SOURCE',              1], # Extensions to ISO C89 from ISO C99
+            ['_ISOC11_SOURCE',              1], # Extensions to ISO C99 from ISO C11
+            ['_POSIX_SOURCE',               1], # IEEE Std 1003.1
+            ['_POSIX_C_SOURCE',             '200809L'], #IEEE Std 1003.1
+            ['_XOPEN_SOURCE',               700], # POSIX and XPG 7th edition
+            ['_XOPEN_SOURCE_EXTENDED',      1], # XPG things and X/Open Unix extensions
+            ['_BSD_SOURCE',                 1], # ISO C, POSIX, and 4.3BSD things
+            ['_SVID_SOURCE',                1], # ISO C, POSIX, and SVID things
+        ]
+
+        foreach d : mingw_defines
+            cdata.set(d.get(0), d.get(1))
+            vlc_conf_prefix = vlc_conf_prefix + '#define @0@ @1@\n'.format(d.get(0), d.get(1))
+        endforeach
+
+        # Check for the need to link to the mingwex lib for MinGW-w64 32bit
+        mingwex_lib = cc.find_library('mingwex', required : false)
+
+        if mingwex_lib.found() and not cc.find_library('mingw32', required: false).found()
+            mingw_libs += mingwex_lib
+        endif
+
+        # Check for fnative-struct or mms-bitfields support for MinGW
+        if cc.has_argument('-mms-bitfields')
+            add_project_arguments('-mms-bitfields',
+                language : ['c', 'cpp'])
+            # Check for the warning flag without "-Wno-", GCC accepts
+            # -Wno-<anything> for unsupported warnings, which can trigger
+            # other warnings instead.
+            if cc.has_argument('-Wincompatible-ms-struct')
+                add_project_arguments('-Wno-incompatible-ms-struct',
+                    language : ['c', 'cpp'])
+            endif
+        elif cc.has_argument('-fnative-struct')
+            add_project_arguments('-fnative-struct',
+                    language : ['c', 'cpp'])
+        endif
+
+        # DEP, ASLR, NO SEH
+        add_project_link_arguments('-Wl,--nxcompat', '-Wl,--no-seh', '-Wl,--dynamicbase',
+            language: ['c', 'cpp'])
+    endif
+
+endif
+
+
+#
+# Check for functions
+# Entry format: [TO_DEFINE_IF_TRUE, function_name, prefix]
+
+# General functions
+check_functions = [
+    ['HAVE_ACCEPT4',        'accept4',          '#include <sys/socket.h>'],
+    ['HAVE_DAEMON',         'daemon',           '#include <stdlib.h>'],
+    ['HAVE_QSORT_R',        'qsort_r',          '#include <stdlib.h>'],
+    ['HAVE_FCNTL',          'fcntl',            '#include <fcntl.h>'],
+    ['HAVE_FLOCK',          'flock',            '#include <sys/file.h>'],
+    ['HAVE_FSTATVFS',       'fstatvfs',         '#include <sys/statvfs.h>'],
+    ['HAVE_FORK',           'fork',             '#include <unistd.h>'],
+    ['HAVE_GETPWUID_R',     'getpwuid_r',       '#include <pwd.h>'],
+    ['HAVE_ISATTY',         'isatty',           '#include <unistd.h>'],
+    ['HAVE_MEMALIGN',       'memalign',         '#include <malloc.h>'],
+    ['HAVE_MKOSTEMP',       'mkostemp',         '#include <unistd.h>'],
+    ['HAVE_MMAP',           'mmap',             '#include <sys/mman.h>'],
+    ['HAVE_OPEN_MEMSTREAM', 'open_memstream',   '#include <stdio.h>'],
+    ['HAVE_OPENAT',         'openat',           '#include <fcntl.h>'],
+    ['HAVE_PIPE2',          'pipe2',            '#include <unistd.h>'],
+    ['HAVE_POSIX_FADVISE',  'posix_fadvise',    '#include <fcntl.h>'],
+    ['HAVE_STRICMP',        'stricmp',          '#include <string.h>'],
+    ['HAVE_STRCOLL',        'strcoll',          '#include <string.h>'],
+
+    ['HAVE_USELOCALE',      'uselocale',        '#include <locale.h>'],
+    ['HAVE_USELOCALE',      'uselocale',        '#include <xlocale.h>'],
+    ['HAVE_NEWLOCALE',      'newlocale',        '#include <locale.h>'],
+    ['HAVE_NEWLOCALE',      'newlocale',        '#include <xlocale.h>'],
+
+    ['HAVE_GETENV',         'getenv',           '#include <stdlib.h>'],
+    ['HAVE_POSIX_MEMALIGN', 'posix_memalign',   '#include <stdlib.h>'],
+
+    ['HAVE_IF_NAMETOINDEX', 'if_nametoindex',   '#include <net/if.h>'],
+    ['HAVE_IF_NAMEINDEX',   'if_nameindex',     '#include <net/if.h>'],
+
+    ['HAVE_SIGWAIT',        'sigwait',          '#include <signal.h>'],
+    ['HAVE_BACKTRACE',      'backtrace',        '#include <execinfo.h>'],
+    ['HAVE__LOCK_FILE',     '_lock_file',       '#include <stdio.h>'],
+]
+
+# Linux specific functions
+if host_system == 'linux'
+    check_functions += [
+        ['HAVE_EVENTFD',            'eventfd',              '#include <sys/eventfd.h>'],
+        ['HAVE_VMSPLICE',           'vmsplice',             '#include <fcntl.h>'],
+        ['HAVE_SCHED_GETAFFINITY',  'sched_getaffinity',    '#include <sched.h>'],
+        ['HAVE_RECVMMSG',           'recvmmsg',             '#include <sys/socket.h>'],
+        ['HAVE_MEMFD_CREATE',       'memfd_create',         '#include <sys/memfd.h>'],
+    ]
+endif
+
+foreach f : check_functions
+    if cc.has_function(f.get(1), prefix : vlc_conf_prefix + f.get(2))
+        cdata.set(f.get(0), 1)
+    endif
+endforeach
+
+# Libcompat functions (if missing, provided in compat)
+# Entry format: [TO_DEFINE_IF_TRUE, function_name, prefix]
+libcompat_functions = [
+    ['HAVE_ALIGNED_ALLOC',  'aligned_alloc',    '#include <stdlib.h>'],
+    ['HAVE_ATOF',           'atof',             '#include <stdlib.h>'],
+    ['HAVE_ATOLL',          'atoll',            '#include <stdlib.h>'],
+    ['HAVE_DIRFD',          'dirfd',            '#include <dirent.h>'],
+    ['HAVE_FDOPENDIR',      'fdopendir',        '#include <dirent.h>'],
+    ['HAVE_FLOCKFILE',      'flockfile',        '#include <stdio.h>'],
+    ['HAVE_FSYNC',          'fsync',            '#include <unistd.h>'],
+    ['HAVE_GETDELIM',       'getdelim',         '#include <stdio.h>'],
+    ['HAVE_GETPID',         'getpid',           '#include <unistd.h>'],
+    ['HAVE_GETTIMEOFDAY',   'gettimeofday',     '#include <sys/time.h>'],
+    ['HAVE_INET_PTON',      'inet_pton',        '#include <arpa/inet.h>'],
+    ['HAVE_LLDIV',          'lldiv',            '#include <stdlib.h>'],
+    ['HAVE_MEMRCHR',        'memrchr',          '#include <string.h>'],
+    ['HAVE_NRAND48',        'nrand48',          '#include <stdlib.h>'],
+    ['HAVE_POLL',           'poll',             '#include <poll.h>'],
+    ['HAVE_RECVMSG',        'recvmsg',          '#include <sys/socket.h>'],
+    ['HAVE_REWIND',         'rewind',           '#include <stdio.h>'],
+    ['HAVE_SENDMSG',        'sendmsg',          '#include <sys/socket.h>'],
+    ['HAVE_SETENV',         'setenv',           '#include <stdlib.h>'],
+    ['HAVE_PATHCONF',       'pathconf',         '#include <unistd.h>'],
+
+    ['HAVE_TIMESPEC_GET',   'timespec_get',     '#include <time.h>'],
+    ['HAVE_TIMEGM',         'timegm',           '#include <time.h>'],
+
+    ['HAVE_TFIND',          'tfind',            '#include <search.h>'],
+    ['HAVE_TDESTROY',       'tdestroy',         '#include <search.h>'],
+
+    ['HAVE_STRTOF',         'strtof',           '#include <stdlib.h>'],
+    ['HAVE_STRTOLL',        'strtoll',          '#include <stdlib.h>'],
+
+    ['HAVE_STRNDUP',        'strndup',          '#include <string.h>'],
+    ['HAVE_STRDUP',         'strdup',           '#include <string.h>'],
+    ['HAVE_STRSEP',         'strsep',           '#include <string.h>'],
+    ['HAVE_STRLCPY',        'strlcpy',          '#include <string.h>'],
+    ['HAVE_STRNLEN',        'strnlen',          '#include <string.h>'],
+    ['HAVE_STRNSTR',        'strnstr',          '#include <string.h>'],
+    ['HAVE_STRTOK_R',       'strtok_r',         '#include <string.h>'],
+    ['HAVE_STRVERSCMP',     'strverscmp',       '#include <string.h>'],
+    ['HAVE_STRCASESTR',     'strcasestr',       '#include <string.h>'],
+
+    ['HAVE_SWAB',           'swab',             '#include <unistd.h>'],
+
+    ['HAVE_STRCASECMP',     'strcasecmp',       '#include <strings.h>'],
+]
+
+libcompat_sources = []
+
+# Check all functions in libcompat_functions array
+foreach f : libcompat_functions
+    if cc.has_function(f.get(1), prefix : vlc_conf_prefix + f.get(2))
+        cdata.set(f.get(0), 1)
+    else
+        libcompat_sources += f.get(1) + '.c'
+    endif
+endforeach
+
+# These functions need to be checked with has_header_symbol as
+# MinGW-w64 implements those as static inline, not functions with C linkage
+libcompat_functions = [
+    ['HAVE_GMTIME_R',       'gmtime_r',         'time.h'],
+    ['HAVE_REALPATH',       'realpath',         'stdlib.h'],
+    ['HAVE_ASPRINTF',       'asprintf',         'stdio.h'],
+    ['HAVE_VASPRINTF',      'vasprintf',        'stdio.h'],
+    ['HAVE_LOCALTIME_R',    'localtime_r',      'time.h'],
+]
+
+foreach f : libcompat_functions
+    if cc.has_header_symbol(f.get(2), f.get(1), prefix : vlc_conf_prefix)
+        cdata.set(f.get(0), 1)
+    else
+        libcompat_sources += f.get(1) + '.c'
+    endif
+endforeach
+
+# Check for function 'nanf' (optionally link with libm if it exists)
+if cc.has_function('nanf', prefix: vlc_conf_prefix + '#include <math.h>', dependencies: m_lib)
+    cdata.set('HAVE_NANF', 1)
+endif
+
+# Check for function 'sincos' (optionally link with libm if it exists)
+if cc.has_function('sincos', prefix: vlc_conf_prefix + '#include <math.h>', dependencies: m_lib)
+    cdata.set('HAVE_SINCOS', 1)
+else
+    libcompat_sources += 'sincos.c'
+endif
+
+# Check for function 'fdatasync' (define it to 'fsync' if missing)
+if not cc.has_function('fdatasync', prefix: vlc_conf_prefix + '#include <unistd.h>')
+    cdata.set('fdatasync', 'fsync')
+endif
+
+#
+# Socket library checks
+#
+
+# Check for socket library
+socket_libs = cc.find_library('socket', required: false)
+
+# Check for function 'connect' (optionally link with socket lib if it exists)
+if not cc.has_function('connect', prefix: vlc_conf_prefix + '#include <sys/socket.h>', dependencies: socket_libs)
+    
+    if host_system == 'windows'
+        # If not found and on windows:
+        socket_libs = []
+        socket_libs += cc.find_library('iphlpapi', required: true)
+        socket_libs += cc.find_library('ws2_32', required: true)
+    endif
+endif
+
+#
+# Additional checks
+#
+
+# Set FORTIFY_SOURCE only if no sanitizers are enabled
+# TODO: Only enable if optimizations are on!
+#if get_option('b_sanitize') == 'none'
+#    cdata.set('_FORTIFY_SOURCE', 2)
+#endif
+
+# Check which kind of restrict keyword is supported
+# Program based on autoconf c.m4
+#
+# Copyright (C) 2001-2012 Free Software Foundation, Inc.
+#
+# Written by David MacKenzie, with help from
+# Akim Demaille, Paul Eggert,
+# Franc,ois Pinard, Karl Berry, Richard Pixley, Ian Lance Taylor,
+# Roland McGrath, Noah Friedman, david d zuhn, and many others.
+restrict_test = '''
+    #define restrict_kw @0@
+    typedef int * int_ptr;
+    int foo (int_ptr restrict_kw ip) { return ip[0]; }
+
+    int main() {
+        int s[1];
+        int * restrict_kw t = s;
+        t[0] = 0;
+        return foo(t);
+    }
+'''
+
+# Order is the same as in AC_C_RESTRICT
+
+# Check for __restrict support
+if cc.compiles(restrict_test.format('__restrict'), name: 'Test __restrict support')
+    cdata.set('restrict', '__restrict')
+
+# Check for __restrict__ support
+elif cc.compiles(restrict_test.format('__restrict__'), name: 'Test __restrict__ support')
+    cdata.set('restrict', '__restrict__')
+
+# Check for _Restrict support
+elif cc.compiles(restrict_test.format('_Restrict'), name: 'Test _Restrict support')
+    cdata.set('restrict', '_Restrict')
+
+# Check for restrict support
+elif not cc.compiles(restrict_test.format('restrict'), name: 'Test restrict support')
+    cdata.set('restrict', '')
+endif
+
+# Check for __attribute__((packed)) support
+if cc.compiles('struct __attribute__((packed)) foo { int bar; };',
+               name : '__attribute__((packed))')
+    cdata.set('HAVE_ATTRIBUTE_PACKED', 1)
+endif
+
+# Check for C11 _Thread_local storage qualifier support
+if cc.compiles('_Thread_local int foo = 0;', name: 'Test _Thread_local support')
+    cdata.set('HAVE_THREAD_LOCAL', 1)
+endif
+
+# Check for wrong (non-POSIX) qsort_r prototype
+qsort_r_test = '''
+    #define _GNU_SOURCE
+    #include <stdlib.h>
+    _Static_assert(_Generic((qsort_r),
+        void (*)(void *, size_t, size_t, void *,
+                 int (*)(void *, const void *, const void *)) : 1, default: 0),
+        "Bad prototype not matched");
+'''
+if not cc.compiles(qsort_r_test, name: 'Test qsort_r non-POSIX prototype')
+    cdata.set('HAVE_BROKEN_QSORT_R', 1)
+endif
+
+# Check for max_align_t type
+if cc.has_type('max_align_t', prefix: '#include <stddef.h>')
+    cdata.set('HAVE_MAX_ALIGN_T', 1)
+endif
+
+# Check for struct timespec
+if cc.has_type('struct timespec', prefix: '#include <time.h>')
+    cdata.set('HAVE_STRUCT_TIMESPEC', 1)
+endif
+
+# Add -fvisibility=hidden if compiler supports those
+add_project_arguments(
+    cc.get_supported_arguments('-fvisibility=hidden'),
+    language : ['c'])
+
+# Check for struct sockaddr_storage type
+# Define it to `sockaddr` if missing
+have_sockaddr_storage = cc.has_type('struct sockaddr_storage', prefix: '#include <sys/socket.h>')
+
+if not have_sockaddr_storage
+    have_sockaddr_storage = cc.has_type('struct sockaddr_storage', prefix: '#include <winsock2.h>')
+endif
+
+if not have_sockaddr_storage
+    cdata.set('sockaddr_storage', 'sockaddr')
+endif
+
+# Check for struct ss_family type
+# Define it to `sa_family` if missing
+if not cc.has_type('struct ss_family', prefix: '#include <sys/socket.h>')
+    cdata.set('ss_family', 'sa_family')
+endif
+
+# Check for ssize_t type
+# Define it to `int` if missing
+if not cc.has_type('ssize_t', prefix: '#include <sys/types.h>')
+    cdata.set('ssize_t', 'int')
+endif
+
+# Check for struct pollfd type
+pollfd_prefix = '#include <sys/types.h>\n'
+if cdata.get('HAVE_POLL', 0) == 1
+    pollfd_prefix += '#include <poll.h>'
+elif host_system == 'windows'
+    pollfd_prefix += '#include <winsock2.h>'
+endif
+
+if cc.has_type('struct pollfd', prefix: pollfd_prefix)
+    cdata.set('HAVE_STRUCT_POLLFD', 1)
+endif
+
+# Check for locale_t type in C++ locale header 
+if cpp.has_type('locale_t', prefix : '#include <locale>')
+    cdata.set('HAVE_CXX_LOCALE_T', 1)
+endif
+
+# Check if assert.h has static_assert
+if cc.has_header_symbol('assert.h', 'static_assert')
+    cdata.set('HAVE_STATIC_ASSERT', 1)
+endif
+
+# Check if build machine is big endian
+if build_machine.endian() == 'big'
+    cdata.set('WORDS_BIGENDIAN', 1)
+endif
+
+# Define the shared library extension
+if host_system == 'windows'
+    cdata.set_quoted('LIBEXT', '.dll')
+elif host_system == 'darwin'
+    cdata.set_quoted('LIBEXT', '.dylib')
+else
+    cdata.set_quoted('LIBEXT', '.so')
+endif
+
+#
+# Populate config.h with additional infos
+#
+
+cdata.set_quoted('VERSION', meson.project_version())
+cdata.set('VERSION_MAJOR', vlc_version_major)
+cdata.set('VERSION_MINOR', vlc_version_minor)
+cdata.set('VERSION_REVISION', vlc_version_revision)
+
+cdata.set_quoted('PACKAGE_VERSION', meson.project_version())
+cdata.set_quoted('VERSION_MESSAGE', meson.project_version() + ' ' + vlc_version_codename)
+cdata.set_quoted('PACKAGE', meson.project_name())
+cdata.set_quoted('PACKAGE_NAME', meson.project_name())
+cdata.set_quoted('PACKAGE_STRING', meson.project_name())
+cdata.set_quoted('COPYRIGHT_YEARS', vlc_copyright_years)
+cdata.set_quoted('COPYRIGHT_MESSAGE', 'Copyright © ' + vlc_copyright_years + ' the VideoLAN team')
+
+
+
+cdata.set_quoted('VLC_COMPILER', cc.get_id() + ' ' + cc.version())
+
+# Paths
+cdata.set_quoted('LIBDIR', get_option('libdir'))
+cdata.set_quoted('LIBEXECDIR', get_option('libexecdir'))
+cdata.set_quoted('PKGDATADIR', join_paths(get_option('datadir'), meson.project_name()))
+cdata.set_quoted('PKGLIBDIR', join_paths(get_option('libdir'), meson.project_name()))
+cdata.set_quoted('PKGLIBEXECDIR', join_paths(get_option('libexecdir'), meson.project_name()))
+cdata.set_quoted('SYSDATADIR', get_option('datadir'))
+cdata.set_quoted('LOCALEDIR', get_option('localedir'))
+
+# TODO:
+cdata.set_quoted('VLC_COMPILE_BY', 'A Cone')
+cdata.set_quoted('VLC_COMPILE_HOST', '[currently not implemented with meson]')
+
+# Enable stream outputs
+if get_option('stream_outputs')
+    cdata.set('ENABLE_SOUT', 1)
+endif
+
+# Enable VLM
+if get_option('videolan_manager')
+    if not get_option('stream_outputs')
+        error('The VideoLAN manager requires stream outputs.')
+    endif
+    cdata.set('ENABLE_VLM', 1)
+endif
+
+# Allow running as root
+# (useful for people running on embedded platforms)
+if get_option('run_as_root')
+    cdata.set('ALLOW_RUN_AS_ROOT', 1)
+endif
+
+# Optimize for memory usage vs speed
+if get_option('optimize_memory')
+    cdata.set('OPTIMIZE_MEMORY', 1)
+endif
+
+# Allow binary package maintainer to pass a custom string
+# to avoid cache problem
+if get_option('binary_version') != ''
+    cdata.set_quoted('DISTRO_VERSION', get_option('binary_version'))
+endif
+
+
+# Font options
+if get_option('default_font_path') != ''
+    cdata.set_quoted('DEFAULT_FONT_FILE', get_option('default_font_path'))
+endif
+
+if get_option('default_monospace_font_path') != ''
+    cdata.set_quoted('DEFAULT_MONOSPACE_FONT_FILE', get_option('default_monospace_font_path'))
+endif
+
+if get_option('default_font_family') != ''
+    cdata.set_quoted('DEFAULT_FAMILY', get_option('default_font_family'))
+endif
+
+if get_option('default_monospace_font_family') != ''
+    cdata.set_quoted('DEFAULT_MONOSPACE_FAMILY', get_option('default_monospace_font_family'))
+endif
+
+# Generate config.h
+configure_file(input : 'config.h.meson',
+  output : 'config.h',
+  configuration : cdata)
+
+# Some missing functions are implemented in compat
+subdir('compat')
+
+# Headers
+subdir('include')
+
+# libvlccore
+subdir('src')
+
+# LibVLC
+subdir('lib')
+
+# VLC binaries
+subdir('bin')
+
+# VLC plugins
+subdir('modules')
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 0000000000..d3de8d47d7
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,333 @@
+# General options
+
+option('optimize_memory',
+    type : 'boolean',
+    value : false,
+    description : 'Optimize memory usage over performance')
+
+option('binary_version',
+    type : 'string',
+    value : '',
+    description : 'To avoid plugins cache problem between binary version')
+
+option('stream_outputs',
+    type : 'boolean',
+    value : true,
+    description : 'Build the VLC stream output modules')
+
+option('videolan_manager',
+    type : 'boolean',
+    value : true,
+    description : 'Build the VideoLAN manager')
+
+option('addon_manager',
+    type : 'boolean',
+    value : true,
+    description : 'Build the VLC add-on manager modules')
+
+option('run_as_root',
+    type : 'boolean',
+    value : false,
+    description : 'Allow running VLC as root')
+
+
+# Font options
+
+option('default_font_path',
+    type : 'string',
+    value : '',
+    description : 'Path to the default font')
+
+option('default_monospace_font_path',
+    type : 'string',
+    value : '',
+    description : 'Path to the default monospace font')
+
+option('default_font_family',
+    type : 'string',
+    value : '',
+    description : 'Name of the default font family')
+
+option('default_monospace_font_family',
+    type : 'string',
+    value : '',
+    description : 'Name of the default monospace font family')
+
+# Module options
+
+option('vcd_module',
+    type : 'boolean',
+    value : true,
+    description : 'Built-in VCD and CD-DA support')
+
+# Dependency options
+
+option('dbus',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable D-Bus message bus support')
+
+option('wayland',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable wayland support')
+
+option('xcb',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable X11 support with XCB')
+
+option('avcodec',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable avcodec support')
+
+option('avformat',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable avformat support')
+
+option('alsa',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable ALSA support')
+
+option('pulse',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable Pulseaudio support')
+
+option('ogg',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libogg support')
+
+option('dca',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libdca support')
+
+option('mpg123',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libmpg123 support')
+
+option('mpeg2',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libmpeg2 support')
+
+option('schroedinger',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable schroedinger support')
+
+option('rsvg',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable librsvg support')
+
+option('cairo',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libcairo support')
+
+option('flac',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libflac support')
+
+option('opus',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libopus support')
+
+option('theoraenc',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable theoraenc support')
+
+option('theoradec',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable theoradec support')
+
+option('daaladec',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable daaladec support')
+
+option('daalaenc',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable daalaenc support')
+
+option('x265',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libx265 support')
+
+option('x264',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libx264 support')
+
+option('x262',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libx262 support')
+
+option('fdk-aac',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable fdk-aac support')
+
+option('shine',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable shine support')
+
+option('aom',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libaom support')
+
+option('dav1d',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libdav1d support')
+
+option('twolame',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable twolame support')
+
+option('mfx',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libmfx support')
+
+option('spatialaudio',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libspatialaudio support')
+
+option('samplerate',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libsamplerate support')
+
+option('soxr',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable soxr support')
+
+option('speexdsp',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable speexdsp support')
+
+option('caca',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable caca support')
+
+option('drm',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libdrm support')
+
+option('goom2',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable goom2 visualization plugin')
+
+option('avahi',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable zeroconf (avahi) services discovery plugin')
+
+option('mtp',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable MTP devices support')
+
+option('upnp',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable UPnP plugin (Intel SDK)')
+
+option('libxml2',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable XML support')
+
+option('medialibrary',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable medialibrary support')
+
+option('a52',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable a52 support')
+
+option('faad',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable faad support')
+
+option('fluidsynth',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable fluidsynth/fluidlite support')
+
+option('microdns',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable microdns support')
+
+option('gnutls',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable GnuTLS support')
+
+option('libsecret',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libsecret support')
+
+option('matroska',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable matroska (MKV) support')
+
+option('libdvbpsi',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libdvbpsi support')
+
+option('aribb24',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable aribb24 support')
+
+option('libmodplug',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libmodplug support')
+
+option('taglib',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable taglib support')
+
+option('libcddb',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libcddb support')
+
+option('libass',
+    type : 'feature',
+    value : 'auto',
+    description : 'Enable/disable libass support')
diff --git a/modules/access/http/meson.build b/modules/access/http/meson.build
new file mode 100644
index 0000000000..959628dfd4
--- /dev/null
+++ b/modules/access/http/meson.build
@@ -0,0 +1,93 @@
+#
+# HTTP(S) lib
+#
+vlc_http_lib = static_library('vlc_http',
+    files(
+        'message.c',
+        'resource.c',
+        'file.c',
+        'live.c',
+        'hpack.c',
+        'hpackenc.c',
+        'h2frame.c',
+        'h2output.c',
+        'h2conn.c',
+        'h1conn.c',
+        'chunked.c',
+        'tunnel.c',
+        'connmgr.c',
+    ),
+    dependencies: [threads_dep, socket_libs],
+    link_with: [vlc_libcompat, libvlccore],
+    install: false,
+    include_directories : [vlc_include_dirs],
+)
+
+#
+# Tests
+#
+hpack_test = executable('hpack_test',
+    files('hpack.c'),
+    c_args : ['-DDEC_TEST'],
+    include_directories : [vlc_include_dirs])
+hpackenc_test = executable('hpackenc_test',
+    files('hpack.c', 'hpackenc.c'),
+    c_args : ['-DENC_TEST'],
+    include_directories : [vlc_include_dirs])
+h2frame_test = executable('h2frame_test',
+    files(
+        'h2frame_test.c',
+        'hpack.c',
+        'hpackenc.c',
+        'h2frame.c',
+    ),
+    include_directories : [vlc_include_dirs])
+h2output_test = executable('h2output_test',
+    files('h2output_test.c'),
+    link_with : vlc_http_lib,
+    include_directories : [vlc_include_dirs])
+h2conn_test = executable('h2conn_test',
+    files('h2conn_test.c'),
+    link_with : vlc_http_lib,
+    include_directories : [vlc_include_dirs])
+h1conn_test = executable('h1conn_test',
+    files('h1conn_test.c'),
+    link_with : vlc_http_lib,
+    include_directories : [vlc_include_dirs])
+h1chunked_test = executable('h1chunked_test',
+    files('chunked_test.c'),
+    link_with : vlc_http_lib,
+    include_directories : [vlc_include_dirs])
+http_msg_test = executable('http_msg_test',
+    files('message_test.c', 'message.c'),
+    link_with : vlc_http_lib,
+    include_directories : [vlc_include_dirs])
+http_file_test = executable('http_file_test',
+    files('file_test.c', 'message.c', 'resource.c', 'file.c'),
+    link_with : vlc_http_lib,
+    include_directories : [vlc_include_dirs])
+http_tunnel_test = executable('http_tunnel_test',
+    files('tunnel_test.c'),
+    link_with : vlc_http_lib,
+    include_directories : [vlc_include_dirs])
+
+test('http_hpack', hpack_test, suite : 'http')
+test('http_hpackenc', hpackenc_test, suite : 'http')
+test('http_h2frame_test', h2frame_test, suite : 'http')
+test('http_h2output_test', h2output_test, suite : 'http')
+test('http_h2conn_test', h2conn_test, suite : 'http')
+test('http_h1conn_test', h1conn_test, suite : 'http')
+test('http_h1chunked_test', h1chunked_test, suite : 'http')
+test('http_msg_test', http_msg_test, suite : 'http')
+test('http_file_test', http_file_test, suite : 'http')
+test('http_tunnel_test', http_tunnel_test, suite : 'http', timeout : 90)
+
+
+#
+# HTTP(S) module
+#
+vlc_modules += {
+    'name' : 'https',
+    'sources' : files('access.c'),
+    'link_with' : [vlc_http_lib]
+}
diff --git a/modules/access/meson.build b/modules/access/meson.build
new file mode 100644
index 0000000000..053609c526
--- /dev/null
+++ b/modules/access/meson.build
@@ -0,0 +1,182 @@
+#
+# File access modules
+#
+
+# Filesystem access module
+filesystem_extra_deps = []
+if host_system == 'windows'
+    filesystem_extra_deps += cc.find_library('shlwapi', required: true)
+endif
+vlc_modules += {
+    'name' : 'filesystem',
+    'sources' : files(['file.c', 'directory.c', 'fs.c']),
+    'dependencies' : filesystem_extra_deps
+}
+
+# Dummy access module
+vlc_modules += {
+    'name' : 'idummy',
+    'sources' : files('idummy.c')
+}
+
+# In-memory bitstream input module
+vlc_modules += {
+    'name' : 'imem',
+    'sources' : files('imem-access.c'),
+    'dependencies' : [m_lib]
+}
+
+# Memory input module
+vlc_modules += {
+    'name' : 'access_imem',
+    'sources' : files('imem.c')
+}
+
+# Fake sdp:// scheme input module
+vlc_modules += {
+    'name' : 'sdp',
+    'sources' : files('sdp.c')
+}
+
+# Timecode sub-picture generator module
+vlc_modules += {
+    'name' : 'timecode',
+    'sources' : files('timecode.c')
+}
+
+# VDR recordings access module
+vlc_modules += {
+    'name' : 'vdr',
+    'sources' : files('vdr.c')
+}
+
+# VCD and CD-DA access module
+
+if get_option('vcd_module')
+    vcd_cdda_flags = []
+
+    libcddb_dep = dependency('libcddb', version : '>= 0.9.5', required : get_option('libcddb'))
+    if libcddb_dep.found()
+        vcd_cdda_flags += '-DHAVE_LIBCDDB'
+    endif
+
+    if cc.has_header_symbol('linux/cdrom.h', 'struct cdrom_msf0')
+        needed_vcd_unix_headers_present = true
+    elif cc.has_header_symbol('sys/scsiio.h', 'struct scsireq')
+        needed_vcd_unix_headers_present = true
+        vcd_cdda_flags += '-DHAVE_SCSIREQ_IN_SYS_SCSIIO_H'
+    elif cc.has_header_symbol('sys/cdio.h', 'struct ioc_toc_header')
+        needed_vcd_unix_headers_present = true
+        vcd_cdda_flags += '-DHAVE_IOC_TOC_HEADER_IN_SYS_CDIO_H'
+    else
+        needed_vcd_unix_headers_present = false
+    endif
+
+    if (needed_vcd_unix_headers_present or 
+        host_system == 'darwin' or  host_system == 'windows')
+
+        vcd_cdda_darwin_deps = []
+        if host_system == 'darwin'
+            vcd_cdda_darwin_deps = [iokit_dep, corefoundation_dep]
+        endif
+
+        vlc_modules += {
+            'name' : 'cdda',
+            'sources' : files(
+                'cdda.c',
+                'vcd/cdrom.c',
+                '../misc/webservices/json.c',
+                '../misc/webservices/musicbrainz.c',
+            ),
+            'c_args' : vcd_cdda_flags,
+            'dependencies' : [libcddb_dep, vcd_cdda_darwin_deps]
+        }
+
+        vlc_modules += {
+            'name' : 'vcd',
+            'sources' : files(
+                'vcd/vcd.c',
+                'vcd/cdrom.c',
+            ),
+            'c_args' : vcd_cdda_flags,
+            'dependencies' : [libcddb_dep, vcd_cdda_darwin_deps]
+        }
+
+    endif
+endif
+
+
+#
+# Audio capture access modules
+#
+
+# ALSA input module
+if alsa_dep.found()
+    vlc_modules += {
+        'name' : 'access_alsa',
+        'sources' : files('alsa.c'),
+        'dependencies' : [alsa_dep]
+    }
+endif
+
+# JACK input module
+if jack_dep.found()
+    vlc_modules += {
+        'name' : 'access_jack',
+        'sources' : files('jack.c'),
+        'dependencies' : [jack_dep]
+    }
+endif
+
+# Pulseaudio module
+if pulse_dep.found()
+    vlc_modules += {
+        'name' : 'pulsesrc',
+        'sources' : files('pulse.c'),
+        'dependencies' : [pulse_dep],
+        'link_with' : [libvlc_pulse],
+    }
+endif
+
+# avio access module
+if avformat_dep.found()
+    vlc_modules += {
+        'name' : 'avio',
+        'sources' : files('avio.c'),
+        'dependencies' : [avutil_dep, avformat_dep]
+    }
+endif
+
+#
+# Network stream access modules
+#
+
+# FTP
+vlc_modules += {
+    'name' : 'ftp',
+    'sources' : files('ftp.c'),
+    'dependencies' : [socket_libs]
+}
+
+# Old HTTP
+vlc_modules += {
+    'name' : 'http',
+    'sources' : files('http.c'),
+    'dependencies' : [socket_libs]
+}
+
+# New HTTP(S)
+subdir('http')
+
+#
+# Screen grab plugins
+#
+
+# XCB screen grab
+if xcb_dep.found() and xcb_shm_dep.found() and xcb_composite_dep.found()
+    vlc_modules += {
+        'name' : 'xcb_screen',
+        'sources' : files('screen/xcb.c'),
+        'dependencies' : [xcb_dep, xcb_shm_dep, xcb_composite_dep]
+    }
+endif
diff --git a/modules/audio_filter/meson.build b/modules/audio_filter/meson.build
new file mode 100644
index 0000000000..70af736ec9
--- /dev/null
+++ b/modules/audio_filter/meson.build
@@ -0,0 +1,215 @@
+#
+# Audio filter modules
+#
+
+include_dir = include_directories('.')
+
+# Audio bar graph a module
+vlc_modules += {
+    'name' : 'audiobargraph_a',
+    'sources' : files('audiobargraph_a.c'),
+    'dependencies' : [m_lib]
+}
+
+# Chorus flanger module
+vlc_modules += {
+    'name' : 'chorus_flanger',
+    'sources' : files('chorus_flanger.c'),
+    'dependencies' : [m_lib]
+}
+
+# Compressor module
+vlc_modules += {
+    'name' : 'compressor',
+    'sources' : files('compressor.c'),
+    'dependencies' : [m_lib]
+}
+
+# Equalizer filter module
+vlc_modules += {
+    'name' : 'equalizer',
+    'sources' : files('equalizer.c'),
+    'dependencies' : [m_lib]
+}
+
+# Karaoke filter module
+vlc_modules += {
+    'name' : 'karaoke',
+    'sources' : files('karaoke.c')
+}
+
+# Volume normalization module
+vlc_modules += {
+    'name' : 'normvol',
+    'sources' : files('normvol.c'),
+    'dependencies' : [m_lib]
+}
+
+# Gain module
+vlc_modules += {
+    'name' : 'gain',
+    'sources' : files('gain.c')
+}
+
+# Parametrical Equalizer module
+vlc_modules += {
+    'name' : 'param_eq',
+    'sources' : files('param_eq.c'),
+    'dependencies' : [m_lib]
+}
+
+# Scaletempo module
+scaletempo_sources = files('scaletempo.c')
+scaletempo_deps = [m_lib]
+
+vlc_modules += {
+    'name' : 'scaletempo',
+    'sources' : scaletempo_sources,
+    'dependencies' : scaletempo_deps
+}
+
+# Scaletempo pitch module
+vlc_modules += {
+    'name' : 'scaletempo_pitch',
+    'sources' : scaletempo_sources,
+    'dependencies' : scaletempo_deps,
+    'c_args' : ['-DPITCH_SHIFTER']
+}
+
+# Stereo widen module
+vlc_modules += {
+    'name' : 'stereo_widen',
+    'sources' : files('stereo_widen.c')
+}
+
+# Spatializer module
+vlc_modules += {
+    'name' : 'spatializer',
+    'sources' : files(
+        'spatializer/spatializer.cpp',
+        'spatializer/allpass.cpp',
+        'spatializer/comb.cpp',
+        'spatializer/denormals.c',
+        'spatializer/revmodel.cpp'),
+    'dependencies' : [m_lib]
+}
+
+#
+# Channel mixer
+#
+
+# Dolby surround module
+vlc_modules += {
+    'name' : 'dolby_surround_decoder',
+    'sources' : files('channel_mixer/dolby.c')
+}
+
+# Headphone mixer module
+vlc_modules += {
+    'name' : 'headphone_channel_mixer',
+    'sources' : files('channel_mixer/headphone.c'),
+    'dependencies' : [m_lib]
+}
+
+# Mono mixer module
+vlc_modules += {
+    'name' : 'mono',
+    'sources' : files('channel_mixer/mono.c'),
+    'dependencies' : [m_lib]
+}
+
+# Channel remap mixer module
+vlc_modules += {
+    'name' : 'remap',
+    'sources' : files('channel_mixer/remap.c')
+}
+
+# Trivial channel mixer module
+vlc_modules += {
+    'name' : 'trivial_channel_mixer',
+    'sources' : files('channel_mixer/trivial.c')
+}
+
+# Simple channel mixer module
+vlc_modules += {
+    'name' : 'simple_channel_mixer',
+    'sources' : files('channel_mixer/simple.c')
+}
+
+# TODO IF NEON
+# simple_channel_mixer_plugin_arm_neon
+
+# Spatial audio (ambisonics/binaural) mixer
+spatial_dep = dependency('spatialaudio', required : get_option('spatialaudio'))
+if spatial_dep.found()
+    vlc_modules += {
+        'name' : 'spatialaudio',
+        'sources' : files('channel_mixer/spatialaudio.cpp'),
+        'dependencies' : [spatial_dep]
+    }
+endif
+
+#
+# Converters
+#
+
+# Format converter module
+vlc_modules += {
+    'name' : 'audio_format',
+    'sources' : files('converter/format.c'),
+    'dependencies' : [m_lib]
+}
+
+# SPDIF converter module
+vlc_modules += {
+    'name' : 'tospdif',
+    'sources' : files('converter/tospdif.c',
+        '../packetizer/dts_header.c'),
+    'include_directories' : include_dir
+}
+
+#
+# Resampler
+#
+
+# Band-limited resampler module
+#vlc_modules += {
+#    'name' : 'bandlimited_resampler',
+#    'sources' : files('resampler/bandlimited.c')
+#}
+
+# Ugly resampler module
+vlc_modules += {
+    'name' : 'ugly_resampler',
+    'sources' : files('resampler/ugly.c')
+}
+
+# libsamplerate resampler
+samplerate_dep = dependency('samplerate', required : get_option('samplerate'))
+if samplerate_dep.found()
+    vlc_modules += {
+        'name' : 'samplerate',
+        'sources' : files('resampler/src.c'),
+        'dependencies' : [m_lib, samplerate_dep]
+    }
+endif
+
+# SoX resampler
+soxr_dep = dependency('soxr', version : ['>= 0.1.2'], required : get_option('soxr'))
+if soxr_dep.found()
+    vlc_modules += {
+        'name' : 'soxr',
+        'sources' : files('resampler/soxr.c'),
+        'dependencies' : [m_lib, soxr_dep]
+    }
+endif
+
+# Speex resampler
+speexdsp_dep = dependency('speexdsp', required : get_option('speexdsp'))
+if speexdsp_dep.found()
+    vlc_modules += {
+        'name' : 'speex_resampler',
+        'sources' : files('resampler/speex.c'),
+        'dependencies' : [speexdsp_dep]
+    }
+endif
diff --git a/modules/audio_mixer/meson.build b/modules/audio_mixer/meson.build
new file mode 100644
index 0000000000..b99b157c79
--- /dev/null
+++ b/modules/audio_mixer/meson.build
@@ -0,0 +1,13 @@
+# Float mixer
+vlc_modules += {
+    'name' : 'float_mixer',
+    'sources' : files('float.c'),
+    'dependencies' : [m_lib]
+}
+
+# Integer mixer
+vlc_modules += {
+    'name' : 'integer_mixer',
+    'sources' : files('integer.c'),
+    'dependencies' : [m_lib]
+}
diff --git a/modules/audio_output/meson.build b/modules/audio_output/meson.build
new file mode 100644
index 0000000000..723cc409a2
--- /dev/null
+++ b/modules/audio_output/meson.build
@@ -0,0 +1,61 @@
+#
+# Audio output modules
+#
+
+# Dummy audio output
+vlc_modules += {
+    'name' : 'adummy',
+    'sources' : files('adummy.c')
+}
+
+# File audio output
+vlc_modules += {
+    'name' : 'afile',
+    'sources' : files('file.c')
+}
+
+# Memory audio output
+vlc_modules += {
+    'name' : 'amem',
+    'sources' : files('amem.c')
+}
+
+
+# AUHAL output module (macOS only)
+if have_osx
+    vlc_modules += {
+        'name' : 'auhal',
+        'sources' : files(['auhal.c', 'coreaudio_common.c']),
+        'dependencies' : [
+            m_lib, corefoundation_dep, audiounit_dep, audiotoolbox_dep,
+            dependency('CoreAudio', required: true)
+        ]
+    }
+endif
+
+# Pulseaudio out module
+if pulse_dep.found()
+    vlc_modules += {
+        'name' : 'pulse',
+        'sources' : files('pulse.c'),
+        'dependencies' : [m_lib, pulse_dep],
+        'link_with' : [libvlc_pulse],
+    }
+endif
+
+# ALSA output module
+if alsa_dep.found()
+    vlc_modules += {
+        'name' : 'alsa',
+        'sources' : files('alsa.c'),
+        'dependencies' : [m_lib, alsa_dep]
+    }
+endif
+
+if jack_dep.found()
+    vlc_modules += {
+        'name' : 'jack',
+        'sources' : files('jack.c'),
+        'dependencies' : [jack_dep]
+    }
+endif
diff --git a/modules/codec/meson.build b/modules/codec/meson.build
new file mode 100644
index 0000000000..8bf3c31638
--- /dev/null
+++ b/modules/codec/meson.build
@@ -0,0 +1,584 @@
+#
+# Encoder and decoder modules
+#
+
+# Dummy codec
+vlc_modules += {
+    'name' : 'ddummy',
+    'sources' : files('ddummy.c')
+}
+
+# Dummy codec
+vlc_modules += {
+    'name' : 'edummy',
+    'sources' : files('edummy.c')
+}
+
+# SPDIF codec
+vlc_modules += {
+    'name' : 'spdif',
+    'sources' : files('spdif.c')
+}
+
+# a52 codec
+a52_lib = cc.find_library('a52', required: get_option('a52'))
+if a52_lib.found()
+    vlc_modules += {
+        'name' : 'a52',
+        'sources' : files('a52.c'),
+        'dependencies' : [a52_lib]
+    }
+endif
+
+# DTS Coherent Acoustics decoder
+dca_dep = dependency('libdca', version : '>= 0.0.5', required : get_option('dca'))
+if dca_dep.found()
+    vlc_modules += {
+        'name' : 'dca',
+        'sources' : files('dca.c'),
+        'dependencies' : [dca_dep, m_lib]
+    }
+endif
+
+# adpcm codec
+vlc_modules += {
+    'name' : 'adpcm',
+    'sources' : files('adpcm.c')
+}
+
+# AES3 codec
+vlc_modules += {
+    'name' : 'aes3',
+    'sources' : files('aes3.c')
+}
+
+# faad decoder plugin
+faad_lib = cc.find_library('faad', required: get_option('faad'))
+if faad_lib.found()
+    vlc_modules += {
+        'name' : 'faad',
+        'sources' : files('faad.c'),
+        'dependencies' : [faad_lib, m_lib]
+    }
+endif
+
+# g711 codec
+vlc_modules += {
+    'name' : 'g711',
+    'sources' : files('g711.c')
+}
+
+# libfluidsynth (MIDI synthetizer) plugin
+fluidsynth_option = get_option('fluidsynth')
+fluidsynth_module_flags = []
+if not fluidsynth_option.disabled()
+    fluidsynth_dep = dependency('fluidsynth', version : '>= 1.1.2', required : false)
+    if not fluidsynth_dep.found()
+        fluidsynth_dep = dependency('fluidlite', required : false)
+        if fluidsynth_dep.found()
+            fluidsynth_module_flags += '-DHAVE_FLUIDLITE_H'
+        endif
+    endif
+
+    if fluidsynth_option.enabled() and not fluidsynth_dep.found()
+        error('Neither fluidsynth or fluidlite were found.')
+    endif
+else
+    fluidsynth_dep = dependency('', required : false)
+endif
+
+if fluidsynth_dep.found()
+    vlc_modules += {
+        'name' : 'fluidsynth',
+        'sources' : files('fluidsynth.c'),
+        'dependencies' : [fluidsynth_dep, m_lib],
+        'c_args' : fluidsynth_module_flags
+    }
+endif
+
+# Audiotoolbox MIDI plugin (Darwin only)
+if host_system == 'darwin'
+    vlc_modules += {
+        'name' : 'audiotoolboxmidi',
+        'sources' : files('audiotoolbox_midi.c'),
+        'dependencies' : [corefoundation_dep, audiounit_dep, audiotoolbox_dep]
+    }
+endif
+
+# LPCM codec
+vlc_modules += {
+    'name' : 'lpcm',
+    'sources' : files('lpcm.c')
+}
+
+# TODO libmad codec
+
+# Ulead DV Audio codec
+vlc_modules += {
+    'name' : 'uleaddvaudio',
+    'sources' : files('uleaddvaudio.c')
+}
+
+# Raw PCM demux module
+vlc_modules += {
+    'name' : 'araw',
+    'sources' : files(['araw.c']),
+}
+
+# libmpg123 decoder
+mpg123_dep = dependency('libmpg123', required : get_option('mpg123'))
+if mpg123_dep.found()
+    vlc_modules += {
+        'name' : 'mpg123',
+        'sources' : files('mpg123.c'),
+        'dependencies' : [mpg123_dep]
+    }
+endif
+
+#
+# Video codecs
+#
+
+# CDG codec
+vlc_modules += {
+    'name' : 'cdg',
+    'sources' : files('cdg.c')
+}
+
+# libmpeg2 decoder
+mpeg2_dep = dependency('libmpeg2', version : '> 0.3.2', required : get_option('mpeg2'))
+if mpeg2_dep.found()
+    vlc_modules += {
+        'name' : 'libmpeg2',
+        'sources' : files('libmpeg2.c', 'synchro.c'),
+        'dependencies' : [mpeg2_dep]
+    }
+endif
+
+# Raw video codec
+vlc_modules += {
+    'name' : 'rawvideo',
+    'sources' : files('rawvideo.c')
+}
+
+# RTP video codec
+vlc_modules += {
+    'name' : 'rtpvideo',
+    'sources' : files('rtpvideo.c')
+}
+
+# Dirac decoder and encoder using schroedinger
+schroedinger_dep = dependency('schroedinger-1.0', version : '>= 1.0.10', required : get_option('schroedinger'))
+if schroedinger_dep.found()
+    vlc_modules += {
+        'name' : 'schroedinger',
+        'sources' : files('schroedinger.c'),
+        'dependencies' : [schroedinger_dep]
+    }
+endif
+
+#
+# Image codecs
+#
+
+# TODO PNG codec
+
+# TODO JPEG codec
+
+# TODO BPG codec
+
+# SVG image decoder
+rsvg_dep = dependency('librsvg-2.0', version : '>= 2.9.0', required : get_option('rsvg'))
+cairo_dep = dependency('cairo', version : '>= 1.13.1', required : get_option('cairo'))
+if rsvg_dep.found() and cairo_dep.found()
+    vlc_modules += {
+        'name' : 'svgdec',
+        'sources' : files('svg.c'),
+        'dependencies' : [rsvg_dep, cairo_dep]
+    }
+endif
+
+# TODO SDL image codec
+
+# TODO xwd
+
+
+#
+# SPU codecs
+#
+
+# Substation Alpha subtitle decoder (libass)
+# TODO: Needs freetype if available  and for winstore -ldwrite
+libass_dep = dependency('libass', version : '>= 0.9.8', required : get_option('libass'))
+if libass_dep.found()
+    vlc_modules += {
+        'name' : 'libass',
+        'sources' : files('libass.c'),
+        'dependencies' : [libass_dep]
+    }
+endif
+
+# Closed captioning decoder
+vlc_modules += {
+    'name' : 'cc',
+    'sources' : files('cc.c', 'cea708.c')
+}
+
+# cvdsub decoder
+vlc_modules += {
+    'name' : 'cvdsub',
+    'sources' : files('cvdsub.c')
+}
+
+# dvbsub decoder
+vlc_modules += {
+    'name' : 'dvbsub',
+    'sources' : files('dvbsub.c')
+}
+
+# TODO aribsub
+
+# scte18 decoder
+vlc_modules += {
+    'name' : 'scte18',
+    'sources' : files('scte18.c', 'atsc_a65.c')
+}
+
+# scte27 decoder
+vlc_modules += {
+    'name' : 'scte27',
+    'sources' : files('scte27.c')
+}
+
+# SPU decoder
+vlc_modules += {
+    'name' : 'spudec',
+    'sources' : files('spudec/spudec.c', 'spudec/parse.c')
+}
+
+# STL codec
+vlc_modules += {
+    'name' : 'stl',
+    'sources' : files('stl.c')
+}
+
+# subsdec
+vlc_modules += {
+    'name' : 'subsdec',
+    'sources' : files('subsdec.c')
+}
+
+# subsusf
+vlc_modules += {
+    'name' : 'subsusf',
+    'sources' : files('subsusf.c')
+}
+
+# TTML decoder
+vlc_modules += {
+    'name' : 'ttml',
+    'sources' : files('ttml/substtml.c', 'ttml/ttml.c', '../demux/ttml.c'),
+    'include_directories' : include_directories('.')
+}
+
+# TODO WebVTT
+
+# svcdsub
+vlc_modules += {
+    'name' : 'svcdsub',
+    'sources' : files('svcdsub.c')
+}
+
+# t140
+vlc_modules += {
+    'name' : 't140',
+    'sources' : files('t140.c')
+}
+
+# telx
+vlc_modules += {
+    'name' : 'telx',
+    'sources' : files('telx.c')
+}
+
+# textst
+vlc_modules += {
+    'name' : 'textst',
+    'sources' : files('textst.c')
+}
+
+# TODO zvbi
+
+# substx3g
+vlc_modules += {
+    'name' : 'substx3g',
+    'sources' : files('substx3g.c')
+}
+
+#
+# Xiph.org codecs
+#
+
+ogg_dep = dependency('ogg', required : get_option('ogg'))
+
+# FLAC codec
+flac_dep = dependency('flac', required : get_option('flac'))
+if flac_dep.found()
+    vlc_modules += {
+        'name' : 'flac',
+        'sources' : files('flac.c'),
+        'dependencies' : [flac_dep]
+    }
+endif
+
+# TODO Kate codec
+#kate_dep = dependency('kate', version : '>= 0.3.0', required : false)
+#if kate_dep.found()
+#    vlc_modules += {
+#        'name' : 'kate',
+#        'sources' : files('kate.c')
+#    }
+#endif
+
+# Opus codec
+opus_dep = dependency('opus', version : '>= 1.0.3', required : get_option('opus'))
+if opus_dep.found() and ogg_dep.found()
+    vlc_modules += {
+        'name' : 'opus',
+        'sources' : files('opus.c', 'opus_header.c'),
+        'dependencies' : [opus_dep, ogg_dep]
+    }
+endif
+
+# TODO speex
+
+# Theora codec
+theoraenc_dep = dependency('theoraenc', required : get_option('theoraenc'))
+theoradec_dep = dependency('theoradec', version : '>= 1.0', required : get_option('theoradec'))
+if theoraenc_dep.found() and theoradec_dep.found() and ogg_dep.found()
+    vlc_modules += {
+        'name' : 'theora',
+        'sources' : files('theora.c'),
+        'dependencies' : [theoraenc_dep, theoradec_dep, ogg_dep]
+    }
+endif
+
+# Daala decoder plugin
+daaladec_dep = dependency('daaladec', required : get_option('daaladec'))
+daalaenc_dep = dependency('daalaenc', required : get_option('daalaenc'))
+if daaladec_dep.found() and daalaenc_dep.found()
+    vlc_modules += {
+        'name' : 'daala',
+        'sources' : files('daala.c'),
+        'dependencies' : [daaladec_dep, daalaenc_dep]
+    }
+endif
+
+# TODO tremor
+
+# TODO vorbis
+
+# OggSpots decoder
+if ogg_dep.found()
+    vlc_modules += {
+        'name' : 'oggspots',
+        'sources' : files('oggspots.c')
+    }
+endif
+
+# VideoToolbox
+if host_system == 'darwin'
+    vlc_modules += {
+        'name' : 'videotoolbox',
+        'sources' : files(
+            'vt_utils.c',
+            'videotoolbox.m',
+            'hxxx_helper.c',
+            '../packetizer/hxxx_nal.c',
+            '../packetizer/hxxx_sei.c',
+            '../packetizer/h264_slice.c',
+            '../packetizer/h264_nal.c',
+            '../packetizer/hevc_nal.c'
+        ),
+        'dependencies' : [videotoolbox_dep, foundation_dep, coremedia_dep, corevideo_dep],
+        'objc_args' : ['-fobjc-arc']
+    }
+endif
+
+# FFmpeg common helper library
+avutil_dep = dependency('libavutil', version : '>= 55.9.0', required : false)
+avcodec_dep = dependency('libavcodec', version : '>= 57.37.100', required : get_option('avcodec'))
+
+if avcodec_dep.found()
+    libavcodec_common = static_library('avcodec_common',
+        files('avcodec/fourcc.c', 'avcodec/chroma.c'),
+        dependencies: [avutil_dep, avcodec_dep],
+        install: false,
+        include_directories : [
+            vlc_include_dirs,
+            include_directories('avcodec')
+        ],
+    )
+endif
+
+# FFmpeg codec module
+if avcodec_dep.found()
+
+    avcodec_extra_sources = []
+    if get_option('stream_outputs')
+        avcodec_extra_sources += 'avcodec/encoder.c'
+    endif
+
+    # TODO: merge-ffmpeg option
+
+    vlc_modules += {
+        'name' : 'avcodec',
+        'sources' : files(
+                'avcodec/video.c',
+                'avcodec/subtitle.c',
+                'avcodec/audio.c',
+                'avcodec/va.c',
+                'avcodec/avcodec.c',
+                avcodec_extra_sources
+        ),
+        'dependencies' : [avutil_dep, avcodec_dep],
+        'link_with' : [libavcodec_common]
+    }
+endif
+
+# TODO avcodec hardware acceleration
+
+# TODO omxil
+
+
+#
+# x26x encoders
+#
+
+# x265 encoder
+x265_dep = dependency('x265', required : get_option('x265'))
+if x265_dep.found()
+    vlc_modules += {
+        'name' : 'x265',
+        'sources' : files('x265.c'),
+        'dependencies' : [x265_dep]
+    }
+endif
+
+# x262 encoder
+x262_dep = dependency('x262', required : get_option('x262'))
+if x262_dep.found()
+    vlc_modules += {
+        'name' : 'x262',
+        'sources' : files('x264.c'),
+        'dependencies' : [x262_dep],
+        'c_args' : ['-DMODULE_NAME_IS_x262']
+    }
+endif
+
+# x264 10-bit encoder (requires x264 >= 0.153)
+x26410b_dep = dependency('x264', version : '>= 0.153', required : get_option('x264'))
+if x26410b_dep.found()
+    vlc_modules += {
+        'name' : 'x26410b',
+        'sources' : files('x264.c'),
+        'dependencies' : [x26410b_dep],
+        'c_args' : ['-DMODULE_NAME_IS_x26410b']
+    }
+endif
+
+# x264 encoder
+x264_dep = dependency('x264', version : '>= 0.148', required : get_option('x264'))
+if x264_dep.found()
+    vlc_modules += {
+        'name' : 'x264',
+        'sources' : files('x264.c'),
+        'dependencies' : [x264_dep],
+        'c_args' : ['-DMODULE_NAME_IS_x264']
+    }
+endif
+
+#
+# Misc codecs
+#
+
+# fdkaac encoder
+fdkaac_dep = dependency('fdk-aac', required : get_option('fdk-aac'))
+if fdkaac_dep.found()
+    vlc_modules += {
+        'name' : 'fdkaac',
+        'sources' : files('fdkaac.c'),
+        'dependencies' : [fdkaac_dep]
+    }
+endif
+
+# Shine MPEG Audio Layer 3 encoder
+shine_dep = dependency('shine', version : '>= 3.0.0', required : get_option('shine'))
+if shine_dep.found()
+    vlc_modules += {
+        'name' : 'shine',
+        'sources' : files('shine.c'),
+        'dependencies' : [shine_dep]
+    }
+endif
+
+# TODO libvpx
+
+# Experimental AV1 codec
+aom_dep = dependency('aom', required : get_option('aom'))
+if aom_dep.found()
+    vlc_modules += {
+        'name' : 'aom',
+        'sources' : files('aom.c'),
+        'dependencies' : [aom_dep]
+    }
+endif
+
+# dav1d AV1 decoder
+dav1d_dep = dependency('dav1d', required : get_option('dav1d'))
+if dav1d_dep.found()
+    vlc_modules += {
+        'name' : 'dav1d',
+        'sources' : files('dav1d.c'),
+        'dependencies' : [dav1d_dep]
+    }
+endif
+
+# Twolame MPEG Audio Layer 2 encoder
+twolame_dep = dependency('twolame', required : get_option('twolame'))
+if twolame_dep.found()
+    vlc_modules += {
+        'name' : 'twolame',
+        'sources' : files('twolame.c'),
+        'dependencies' : [twolame_dep],
+        'c_args' : ['-DLIBTWOLAME_STATIC']
+    }
+endif
+
+
+#
+# Hardware encoders
+#
+
+# TODO crystalhd
+
+# QSV encoder
+qsv_dep = dependency('libmfx', required : get_option('mfx'))
+if qsv_dep.found()
+    vlc_modules += {
+        'name' : 'qsv',
+        'sources' : files('qsv.c'),
+        'dependencies' : [qsv_dep]
+    }
+endif
+
+
+#
+# External frameworks
+#
+
+# TODO dmo
+
+# TODO mft
+
+# TODO gstdecode
diff --git a/modules/control/meson.build b/modules/control/meson.build
new file mode 100644
index 0000000000..1b845f955c
--- /dev/null
+++ b/modules/control/meson.build
@@ -0,0 +1,49 @@
+# Dummy interface module
+vlc_modules += {
+    'name' : 'dummy',
+    'sources' : files(['dummy.c']),
+}
+
+# Gestures
+vlc_modules += {
+    'name' : 'gestures',
+    'sources' : files('gestures.c')
+}
+
+# Hotkeys
+vlc_modules += {
+    'name' : 'hotkeys',
+    'sources' : files('hotkeys.c'),
+    'dependencies' : [m_lib]
+}
+
+# Remote control
+vlc_modules += {
+    'name' : 'rc',
+    'sources' : files('rc.c'),
+    'dependencies' : [socket_libs, m_lib]
+}
+
+# XCB hotkeys
+if xcb_dep.found() and xcb_keysyms_dep.found()
+    vlc_modules += {
+        'name' : 'xcb_hotkeys',
+        'sources' : files('globalhotkeys/xcb.c'),
+        'dependencies' : [xcb_dep, xcb_keysyms_dep]
+    }
+endif
+
+# DBUS
+dbus_dep = dependency('dbus-1', version : '>= 1.6.0', required : get_option('dbus'))
+if dbus_dep.found()
+    vlc_modules += {
+        'name' : 'dbus',
+        'sources' : files(
+            'dbus/dbus_root.c',
+            'dbus/dbus_player.c',
+            'dbus/dbus_tracklist.c',
+            'dbus/dbus.c',
+        ),
+        'dependencies' : [dbus_dep, m_lib]
+    }
+endif
diff --git a/modules/demux/meson.build b/modules/demux/meson.build
new file mode 100644
index 0000000000..f5d6a5b448
--- /dev/null
+++ b/modules/demux/meson.build
@@ -0,0 +1,473 @@
+#
+# Demux modules
+#
+
+# Common Xiph metadata library
+xiph_meta_lib = static_library('xiph_metadata',
+    sources : files('xiph_metadata.c'),
+    include_directories : [vlc_include_dirs],
+    install : false,
+    pic : true
+)
+
+# FLAC demux
+vlc_modules += {
+    'name' : 'flacsys',
+    'sources' : files('flac.c'),
+    'include_directories' : include_directories('../packetizer'),
+    'link_with' : [xiph_meta_lib]
+}
+
+# OGG demux
+ogg_dep = dependency('ogg', version : '>= 1.0', required : get_option('ogg'))
+if ogg_dep.found()
+    vlc_modules += {
+        'name' : 'ogg',
+        'sources' : files('ogg.c', 'oggseek.c', 'ogg_granule.c'),
+        'link_with' : [xiph_meta_lib],
+        'dependencies' : [ogg_dep]
+    }
+endif
+
+# Demux dump
+vlc_modules += {
+    'name' : 'demuxdump',
+    'sources' : files('demuxdump.c')
+}
+
+# Raw DV demux
+vlc_modules += {
+    'name' : 'rawdv',
+    'sources' : files('rawdv.c')
+}
+
+# Raw Vid demux
+vlc_modules += {
+    'name' : 'rawvid',
+    'sources' : files('rawvid.c')
+}
+
+# au demux
+vlc_modules += {
+    'name' : 'au',
+    'sources' : files('au.c')
+}
+
+# Raw AUD demux
+vlc_modules += {
+    'name' : 'rawaud',
+    'sources' : files('rawaud.c')
+}
+
+# WAV demux module
+vlc_modules += {
+    'name' : 'wav',
+    'sources' : files(['wav.c']),
+}
+
+# NSV demux
+vlc_modules += {
+    'name' : 'nsv',
+    'sources' : files('nsv.c')
+}
+
+# MPEG PS demux
+vlc_modules += {
+    'name' : 'ps',
+    'sources' : files('mpeg/ps.c')
+}
+
+# libmodplug
+libmodplug_dep = dependency('libmodplug', version : ['>= 0.8.4', '!= 0.8.8'],
+    required : get_option('libmodplug'))
+if libmodplug_dep.found()
+    vlc_modules += {
+        'name' : 'mod',
+        'sources' : files('mod.c'),
+        'dependencies' : [libmodplug_dep]
+    }
+endif
+
+# PVA demux
+vlc_modules += {
+    'name' : 'pva',
+    'sources' : files('pva.c')
+}
+
+# AIFF demux
+vlc_modules += {
+    'name' : 'aiff',
+    'sources' : files('aiff.c')
+}
+
+# MJPEG demux
+vlc_modules += {
+    'name' : 'mjpeg',
+    'sources' : files('mjpeg.c')
+}
+
+# Subtitle demux
+vlc_modules += {
+    'name' : 'subtitle',
+    'sources' : files(['subtitle.c']),
+}
+
+# ty demux
+vlc_modules += {
+    'name' : 'ty',
+    'sources' : files('ty.c')
+}
+
+# vobsub demux
+vlc_modules += {
+    'name' : 'vobsub',
+    'sources' : files('vobsub.c')
+}
+
+# voc demux
+vlc_modules += {
+    'name' : 'voc',
+    'sources' : files('voc.c')
+}
+
+# xa demux
+vlc_modules += {
+    'name' : 'xa',
+    'sources' : files('xa.c')
+}
+
+# nuv demux
+vlc_modules += {
+    'name' : 'nuv',
+    'sources' : files('nuv.c')
+}
+
+# nsc demux
+vlc_modules += {
+    'name' : 'nsc',
+    'sources' : files('nsc.c')
+}
+
+# TODO mpc demux plugin
+
+# tta demux
+vlc_modules += {
+    'name' : 'tta',
+    'sources' : files('tta.c')
+}
+
+# VC1 demux
+vlc_modules += {
+    'name' : 'vc1',
+    'sources' : files('vc1.c')
+}
+
+# CDG demux
+vlc_modules += {
+    'name' : 'demux_cdg',
+    'sources' : files('cdg.c')
+}
+
+# SMF demux
+vlc_modules += {
+    'name' : 'smf',
+    'sources' : files('smf.c')
+}
+
+# TODO GME demux
+
+# TODO SID demux
+
+# Image demux
+vlc_modules += {
+    'name' : 'image',
+    'sources' : files('image.c')
+}
+
+# STL demux
+vlc_modules += {
+    'name' : 'demux_stl',
+    'sources' : files('stl.c')
+}
+
+# ASF demux
+vlc_modules += {
+    'name' : 'asf',
+    'sources' : files('asf/asf.c', 'asf/libasf.c', 'asf/asfpacket.c')
+}
+
+# AVI demux
+vlc_modules += {
+    'name' : 'avi',
+    'sources' : files('avi/avi.c', 'avi/libavi.c')
+}
+
+# CAF demux
+vlc_modules += {
+    'name' : 'caf',
+    'sources' : files('caf.c'),
+    'dependencies' : [m_lib]
+}
+
+# avformat demux
+avformat_dep = dependency('libavformat', version : '>= 53.21.0', required : get_option('avformat'))
+if avformat_dep.found()
+
+    avformat_extra_sources = []
+    if get_option('stream_outputs')
+        avformat_extra_sources += 'avformat/mux.c'
+    endif
+
+    vlc_modules += {
+        'name' : 'avformat',
+        'sources' : files(
+            'avformat/demux.c',
+            'avformat/avformat.c',
+            avformat_extra_sources
+        ),
+        'dependencies' : [avformat_dep, avutil_dep],
+        'link_with' : [libavcodec_common]
+    }
+endif
+
+# Directory demuxer
+vlc_modules += {
+    'name' : 'directory_demux',
+    'sources' : files('directory.c')
+}
+
+# ES demux
+vlc_modules += {
+    'name' : 'es',
+    'sources' : files('mpeg/es.c', '../packetizer/dts_header.c')
+}
+
+# h.26x demux
+vlc_modules += {
+    'name' : 'h26x',
+    'sources' : files('mpeg/h26x.c', '../packetizer/h264_nal.c')
+}
+
+# MKV demux
+libebml_dep = dependency('libebml', required : get_option('matroska'))
+libmatroska_dep = dependency('libmatroska', required : get_option('matroska'))
+if libebml_dep.found() and libmatroska_dep.found()
+    vlc_modules += {
+        'name' : 'mkv',
+        'sources' : files(
+            'mkv/mkv.cpp',
+            'mkv/util.cpp',
+            'mkv/virtual_segment.cpp',
+            'mkv/matroska_segment.cpp',
+            'mkv/matroska_segment_parse.cpp',
+            'mkv/matroska_segment_seeker.cpp',
+            'mkv/demux.cpp',
+            'mkv/events.cpp',
+            'mkv/Ebml_parser.cpp',
+            'mkv/chapters.cpp',
+            'mkv/chapter_command.cpp',
+            'mkv/stream_io_callback.cpp',
+            'mp4/libmp4.c',
+            '../packetizer/dts_header.c',
+        ),
+        'dependencies' : [libebml_dep, libmatroska_dep, z_lib]
+    }
+endif
+
+# MP4 demux
+vlc_modules += {
+    'name' : 'mp4',
+    'sources' : files(
+        'mp4/mp4.c',
+        'mp4/fragments.c',
+        'mp4/libmp4.c',
+        'mp4/heif.c',
+        'mp4/essetup.c',
+        'mp4/meta.c',
+        'asf/asfpacket.c',
+    ),
+    'dependencies' : [m_lib, z_lib]
+}
+
+
+# mpgv demux
+vlc_modules += {
+    'name' : 'mpgv',
+    'sources' : files('mpeg/mpgv.c')
+}
+
+# Playlist demux
+vlc_modules += {
+    'name' : 'playlist',
+    'sources' : files(
+        'playlist/asx.c',
+        'playlist/b4s.c',
+        'playlist/bdmv.c',
+        'playlist/dvb.c',
+        'playlist/ifo.c',
+        'playlist/itml.c',
+        'playlist/m3u.c',
+        'playlist/pls.c',
+        'playlist/podcast.c',
+        'playlist/qtl.c',
+        'playlist/ram.c',
+        'playlist/sgimb.c',
+        'playlist/wpl.c',
+        'playlist/wms.c',
+        'playlist/xspf.c',
+        'playlist/playlist.c')
+}
+
+# TS demux
+aribb24_dep = dependency('aribb24', version : '>= 1.0.1', required : get_option('aribb24'))
+libdvbpsi_dep = dependency('libdvbpsi', version : '>= 1.2.0', required : get_option('libdvbpsi'))
+if libdvbpsi_dep.found()
+    arrib24_define = []
+    if aribb24_dep.found()
+        arrib24_define += '-DHAVE_ARIBB24=1'
+    endif
+
+    vlc_modules += {
+        'name' : 'ts',
+        'sources' : files(
+            'mpeg/ts.c',
+            'mpeg/ts_pid.c',
+            'mpeg/ts_psi.c',
+            'mpeg/ts_si.c',
+            'mpeg/ts_psip.c',
+            'mpeg/ts_psip_dvbpsi_fixes.c',
+            'mpeg/ts_decoders.c',
+            'mpeg/ts_streams.c',
+            'mpeg/ts_scte.c',
+            'mpeg/sections.c',
+            'mpeg/mpeg4_iod.c',
+            'mpeg/ts_arib.c',
+            'mpeg/ts_sl.c',
+            'mpeg/ts_metadata.c',
+            'mpeg/ts_hotfixes.c',
+            '../mux/mpeg/csa.c',
+            '../mux/mpeg/tables.c',
+            '../mux/mpeg/tsutil.c',
+            '../codec/atsc_a65.c',
+            '../codec/opus_header.c',
+        ),
+        'dependencies' : [libdvbpsi_dep, aribb24_dep],
+        'c_args' : arrib24_define
+    }
+endif
+
+# adaptive demux
+adaptive_dash_sources = [
+    'dash/mpd/AdaptationSet.cpp',
+    'dash/mpd/DASHCommonAttributesElements.cpp',
+    'dash/mpd/DASHSegment.cpp',
+    'dash/mpd/ContentDescription.cpp',
+    'dash/mpd/IsoffMainParser.cpp',
+    'dash/mpd/MPD.cpp',
+    'dash/mpd/Period.cpp',
+    'dash/mpd/Profile.cpp',
+    'dash/mpd/ProgramInformation.cpp',
+    'dash/mpd/Representation.cpp',
+    'dash/mpd/TemplatedUri.cpp',
+    'dash/mp4/IndexReader.cpp',
+    'dash/DASHManager.cpp',
+    'dash/DASHStream.cpp',
+]
+
+adaptive_hls_sources = [
+    'hls/playlist/M3U8.cpp',
+    'hls/playlist/Parser.cpp',
+    'hls/playlist/Representation.cpp',
+    'hls/playlist/HLSSegment.cpp',
+    'hls/playlist/Tags.cpp',
+    'hls/HLSManager.cpp',
+    'hls/HLSStreams.cpp',
+]
+
+adaptive_smooth_sources = [
+    'smooth/mp4/IndexReader.cpp',
+    'smooth/playlist/ForgedInitSegment.cpp',
+    'smooth/playlist/Manifest.cpp',
+    'smooth/playlist/MemoryChunk.cpp',
+    'smooth/playlist/Parser.cpp',
+    'smooth/playlist/Representation.cpp',
+    'smooth/playlist/SmoothSegment.cpp',
+    'smooth/SmoothManager.cpp',
+    'smooth/SmoothStream.cpp',
+    '../mux/mp4/libmp4mux.c',
+    '../packetizer/h264_nal.c',
+    '../packetizer/hevc_nal.c',
+]
+
+vlc_modules += {
+    'name' : 'adaptive',
+    'sources' : files(
+        adaptive_dash_sources,
+        adaptive_hls_sources,
+        adaptive_smooth_sources,
+        'adaptive/adaptive.cpp',
+        'adaptive/playlist/AbstractPlaylist.cpp',
+        'adaptive/playlist/BaseAdaptationSet.cpp',
+        'adaptive/playlist/BasePeriod.cpp',
+        'adaptive/playlist/BaseRepresentation.cpp',
+        'adaptive/playlist/CommonAttributesElements.cpp',
+        'adaptive/playlist/Inheritables.cpp',
+        'adaptive/playlist/Role.cpp',
+        'adaptive/playlist/Segment.cpp',
+        'adaptive/playlist/SegmentBase.cpp',
+        'adaptive/playlist/SegmentChunk.cpp',
+        'adaptive/playlist/SegmentInfoCommon.cpp',
+        'adaptive/playlist/SegmentList.cpp',
+        'adaptive/playlist/SegmentTimeline.cpp',
+        'adaptive/playlist/SegmentInformation.cpp',
+        'adaptive/playlist/SegmentTemplate.cpp',
+        'adaptive/playlist/Url.cpp',
+        'adaptive/playlist/Templates.hpp',
+        'adaptive/encryption/CommonEncryption.cpp',
+        'adaptive/encryption/Keyring.cpp',
+        'adaptive/logic/AbstractAdaptationLogic.cpp',
+        'adaptive/logic/AlwaysBestAdaptationLogic.cpp',
+        'adaptive/logic/AlwaysLowestAdaptationLogic.cpp',
+        'adaptive/logic/NearOptimalAdaptationLogic.cpp',
+        'adaptive/logic/PredictiveAdaptationLogic.cpp',
+        'adaptive/logic/RateBasedAdaptationLogic.cpp',
+        'adaptive/logic/Representationselectors.cpp',
+        'adaptive/mp4/AtomsReader.cpp',
+        'adaptive/http/AuthStorage.cpp',
+        'adaptive/http/BytesRange.cpp',
+        'adaptive/http/Chunk.cpp',
+        'adaptive/http/ConnectionParams.cpp',
+        'adaptive/http/Downloader.cpp',
+        'adaptive/http/HTTPConnection.cpp',
+        'adaptive/http/HTTPConnectionManager.cpp',
+        'adaptive/http/Transport.cpp',
+        'adaptive/plumbing/CommandsQueue.cpp',
+        'adaptive/plumbing/Demuxer.cpp',
+        'adaptive/plumbing/FakeESOut.cpp',
+        'adaptive/plumbing/FakeESOutID.cpp',
+        'adaptive/plumbing/SourceStream.cpp',
+        'adaptive/ID.cpp',
+        'adaptive/PlaylistManager.cpp',
+        'adaptive/SegmentTracker.cpp',
+        'adaptive/SharedResources.cpp',
+        'adaptive/StreamFormat.cpp',
+        'adaptive/Streams.cpp',
+        'adaptive/tools/Conversions.cpp',
+        'adaptive/tools/FormatNamespace.cpp',
+        'adaptive/tools/Helper.cpp',
+        'adaptive/tools/Retrieve.cpp',
+        'adaptive/xml/DOMHelper.cpp',
+        'adaptive/xml/DOMParser.cpp',
+        'adaptive/xml/Node.cpp',
+        'mp4/libmp4.c',
+    ),
+    'include_directories' : include_directories('adaptive'),
+    'dependencies' : [socket_libs, m_lib, z_lib]
+    # TODO: Add optional GCRYPT dependency!
+}
+
+# noseek demux
+vlc_modules += {
+    'name' : 'noseek',
+    'sources' : files('filter/noseek.c')
+}
diff --git a/modules/gui/meson.build b/modules/gui/meson.build
new file mode 100644
index 0000000000..12e2287863
--- /dev/null
+++ b/modules/gui/meson.build
@@ -0,0 +1,30 @@
+#
+# Graphical user interface (GUI) modules
+#
+
+# Qt interface module
+subdir('qt')
+
+# ncurses text-based interface
+ncurses_dep = dependency('ncursesw', required : false)
+if ncurses_dep.found()
+    vlc_modules += {
+        'name' : 'ncurses',
+        'sources' : files('ncurses.c'),
+        'dependencies' : [m_lib, threads_dep, ncurses_dep]
+    }
+endif
+
+# Minimal macOS interface
+if have_osx
+    vlc_modules += {
+        'name' : 'minimal_macosx',
+        'sources' : files(
+            'minimal_macosx/intf.m',
+            'minimal_macosx/misc.m',
+            'minimal_macosx/VLCMinimalVoutWindow.m',
+            'minimal_macosx/macosx.c'),
+        'dependencies' : [cocoa_dep],
+        'objc_args' : ['-fobjc-arc', '-fobjc-exceptions']
+    }
+endif
diff --git a/modules/gui/qt/meson.build b/modules/gui/qt/meson.build
new file mode 100644
index 0000000000..21a9e86212
--- /dev/null
+++ b/modules/gui/qt/meson.build
@@ -0,0 +1,265 @@
+#
+# Qt-based interface module
+#
+
+qt5 = import('qt5')
+
+include_dir = include_directories('.')
+
+qt5_dep = dependency('qt5',
+    modules : [ 
+        'Core', 'Gui', 'Widgets', 'Svg', 'Qml',
+        'Quick', 'QuickWidgets', 'QuickControls2'
+        ],
+    required: false)
+
+moc_headers = files(
+    'main_interface.hpp',
+    'menus.hpp',
+    'dialogs_provider.hpp',
+    'extensions_manager.hpp',
+    'managers/addons_manager.hpp',
+    'managers/renderer_manager.hpp',
+    'recents.hpp',
+    'adapters/chromaprint.hpp',
+    'adapters/variables.hpp',
+    'adapters/var_choice_model.hpp',
+    'dialogs/bookmarks.hpp',
+    'dialogs/mediainfo.hpp',
+    'dialogs/extended.hpp',
+    'dialogs/messages.hpp',
+    'dialogs/epg.hpp',
+    'dialogs/errors.hpp',
+    'dialogs/plugins.hpp',
+    'dialogs/preferences.hpp',
+    'dialogs/sout.hpp',
+    'dialogs/convert.hpp',
+    'dialogs/help.hpp',
+    'dialogs/gototime.hpp',
+    'dialogs/toolbar.hpp',
+    'dialogs/open.hpp',
+    'dialogs/openurl.hpp',
+    'dialogs/podcast_configuration.hpp',
+    'dialogs/firstrun.hpp',
+    'dialogs/extensions.hpp',
+    'dialogs/fingerprintdialog.hpp',
+    'dialogs/vlm.hpp',
+    'components/qml_main_context.hpp',
+    'components/aboutmodel.hpp',
+    'components/dialogmodel.hpp',
+    'components/extended_panels.hpp',
+    'components/info_panels.hpp',
+    'components/info_widgets.hpp',
+    'components/player_controller.hpp',
+    'components/preferences_widgets.hpp',
+    'components/complete_preferences.hpp',
+    'components/simple_preferences.hpp',
+    'components/open_panels.hpp',
+    'components/interface_widgets.hpp',
+    'components/navigation_history.hpp',
+    'components/controller.hpp',
+    'components/playercontrolbarmodel.hpp',
+    'components/controller_widget.hpp',
+    'components/custom_menus.hpp',
+    'components/settings.hpp',
+    'components/selectable_list_model.hpp',
+    'components/recent_media_model.hpp',
+    'components/audio_device_model.hpp',
+    'components/voutwindow/videosurface.hpp',
+    'components/voutwindow/qvoutwindow.hpp',
+    'components/voutwindow/qvoutwindowdummy.hpp',
+    'components/epg/EPGChannels.hpp',
+    'components/epg/EPGProgram.hpp',
+    'components/epg/EPGRuler.hpp',
+    'components/epg/EPGView.hpp',
+    'components/epg/EPGWidget.hpp',
+    'components/mediacenter/mcmedialib.hpp',
+    'components/mediacenter/mlqmltypes.hpp',
+    'components/mediacenter/mlbasemodel.hpp',
+    'components/mediacenter/mlalbum.hpp',
+    'components/mediacenter/mlalbummodel.hpp',
+    'components/mediacenter/mlalbumtrack.hpp',
+    'components/mediacenter/mlalbumtrackmodel.hpp',
+    'components/mediacenter/mlartist.hpp',
+    'components/mediacenter/mlartistmodel.hpp',
+    'components/mediacenter/mlgenre.hpp',
+    'components/mediacenter/mlgenremodel.hpp',
+    'components/mediacenter/mlnetworkmodel.hpp',
+    'components/mediacenter/mlvideo.hpp',
+    'components/mediacenter/mlvideomodel.hpp',
+    'components/playlist/playlist_common.hpp',
+    'components/playlist/playlist_item.hpp',
+    'components/playlist/playlist_model.hpp',
+    'components/playlist/playlist_controller.hpp',
+    'components/sout/profile_selector.hpp',
+    'components/sout/sout_widgets.hpp',
+    'util/animators.hpp',
+    'util/input_slider.hpp',
+    'util/input_models.hpp',
+    'util/timetooltip.hpp',
+    'util/customwidgets.hpp',
+    'util/qmleventfilter.hpp',
+    'util/searchlineedit.hpp',
+    'util/qvlcapp.hpp',
+    'util/vlctick.hpp',
+    'util/validators.hpp',
+    'util/buttons/RoundButton.hpp',
+    'util/buttons/DeckButtonsLayout.hpp',
+    'util/buttons/BrowseButton.hpp',
+    'styles/seekstyle.hpp',
+    )
+
+if host_system == 'windows'
+    moc_headers += files('main_interface_win32.hpp')
+endif
+
+some_sources = files(
+    'qt.cpp',
+    'menus.cpp',
+    'main_interface.cpp',
+    'dialogs_provider.cpp',
+    'extensions_manager.cpp',
+    'managers/addons_manager.cpp',
+    'managers/renderer_manager.cpp',
+    'recents.cpp',
+    'adapters/chromaprint.cpp',
+    'adapters/variables.cpp',
+    'adapters/var_choice_model.cpp',
+    'dialogs/bookmarks.cpp',
+    'dialogs/preferences.cpp',
+    'dialogs/mediainfo.cpp',
+    'dialogs/epg.cpp',
+    'dialogs/extended.cpp',
+    'dialogs/messages.cpp',
+    'dialogs/errors.cpp',
+    'dialogs/plugins.cpp',
+    'dialogs/sout.cpp',
+    'dialogs/convert.cpp',
+    'dialogs/help.cpp',
+    'dialogs/gototime.cpp',
+    'dialogs/toolbar.cpp',
+    'dialogs/open.cpp',
+    'dialogs/openurl.cpp',
+    'dialogs/vlm.cpp',
+    'dialogs/firstrun.cpp',
+    'dialogs/podcast_configuration.cpp',
+    'dialogs/extensions.cpp',
+    'dialogs/fingerprintdialog.cpp',
+    'components/qml_main_context.cpp',
+    'components/aboutmodel.cpp',
+    'components/dialogmodel.cpp',
+    'components/extended_panels.cpp',
+    'components/info_panels.cpp',
+    'components/info_widgets.cpp',
+    'components/navigation_history.cpp',
+    'components/player_controller.cpp',
+    'components/preferences_widgets.cpp',
+    'components/complete_preferences.cpp',
+    'components/simple_preferences.cpp',
+    'components/open_panels.cpp',
+    'components/interface_widgets.cpp',
+    'components/controller.cpp',
+    'components/playercontrolbarmodel.cpp',
+    'components/controller_widget.cpp',
+    'components/recent_media_model.cpp',
+    'components/selectable_list_model.cpp',
+    'components/audio_device_model.cpp',
+    'components/voutwindow/videosurface.cpp',
+    'components/voutwindow/qvoutwindow.cpp',
+    'components/voutwindow/qvoutwindowdummy.cpp',
+    'components/custom_menus.cpp',
+    'components/settings.cpp',
+    'components/epg/EPGChannels.cpp',
+    'components/epg/EPGItem.cpp',
+    'components/epg/EPGProgram.cpp',
+    'components/epg/EPGRuler.cpp',
+    'components/epg/EPGView.cpp',
+    'components/epg/EPGWidget.cpp',
+    'components/mediacenter/mcmedialib.cpp',
+    'components/mediacenter/mlbasemodel.cpp',
+    'components/mediacenter/mlalbum.cpp',
+    'components/mediacenter/mlalbummodel.cpp',
+    'components/mediacenter/mlalbumtrack.cpp',
+    'components/mediacenter/mlalbumtrackmodel.cpp',
+    'components/mediacenter/mlartist.cpp',
+    'components/mediacenter/mlartistmodel.cpp',
+    'components/mediacenter/mlgenre.cpp',
+    'components/mediacenter/mlgenremodel.cpp',
+    'components/mediacenter/mlnetworkmodel.cpp',
+    'components/mediacenter/mlvideo.cpp',
+    'components/mediacenter/mlvideomodel.cpp',
+    'components/playlist/playlist_common.cpp',
+    'components/playlist/playlist_controller.cpp',
+    'components/playlist/playlist_item.cpp',
+    'components/playlist/playlist_model.cpp',
+    'components/sout/profile_selector.cpp',
+    'components/sout/sout_widgets.cpp',
+    'util/animators.cpp',
+    'util/input_slider.cpp',
+    'util/input_models.cpp',
+    'util/timetooltip.cpp',
+    'util/customwidgets.cpp',
+    'util/searchlineedit.cpp',
+    'util/registry.cpp',
+    'util/qt_dirs.cpp',
+    'util/validators.cpp',
+    'util/buttons/BrowseButton.cpp',
+    'util/buttons/DeckButtonsLayout.cpp',
+    'util/buttons/RoundButton.cpp',
+    'util/qmleventfilter.cpp',
+    'util/vlctick.cpp',
+    'util/imagehelper.cpp',
+    'styles/seekstyle.cpp',
+)
+
+if host_system == 'windows'
+    some_sources += files('main_interface_win32.cpp')
+endif
+
+ui_sources = files(
+    'ui/equalizer.ui',
+    'ui/video_effects.ui',
+    'ui/open_file.ui',
+    'ui/open_disk.ui',
+    'ui/open_net.ui',
+    'ui/open_capture.ui',
+    'ui/open.ui',
+    'ui/podcast_configuration.ui',
+    'ui/profiles.ui',
+    'ui/sprefs_audio.ui',
+    'ui/sprefs_input.ui',
+    'ui/sprefs_interface.ui',
+    'ui/sprefs_subtitles.ui',
+    'ui/sprefs_video.ui',
+    'ui/streampanel.ui',
+    'ui/messages_panel.ui',
+    'ui/about.ui',
+    'ui/update.ui',
+    'ui/sout.ui',
+    'ui/vlm.ui',
+    'ui/fingerprintdialog.ui')
+
+if qt5_dep.found()
+    qt5pre_files = qt5.preprocess(ui_files : ui_sources,
+        moc_headers : moc_headers,
+        qresources : files('vlc.qrc'))
+
+    qt_sources = files('qt.cpp')
+
+    # TODO: Properly implement LIBCOM for Windows!
+    qt_extra_deps = []
+    if host_system == 'windows'
+        qt_extra_deps += [
+            cc.find_library('ole32', required: true),
+            cc.find_library('comctl32', required: true),
+            cc.find_library('uuid', required: true)
+        ]
+    endif
+
+    vlc_modules += {
+        'name' : 'qt',
+        'sources' : [qt5pre_files, qt_sources, some_sources],
+        'dependencies' : [qt5_dep, x11_dep, qt_extra_deps],
+        'include_directories' : include_dir
+    }
+endif
diff --git a/modules/keystore/meson.build b/modules/keystore/meson.build
new file mode 100644
index 0000000000..1f22d36e34
--- /dev/null
+++ b/modules/keystore/meson.build
@@ -0,0 +1,47 @@
+# Memory keystore
+vlc_modules += {
+    'name' : 'memory_keystore',
+    'sources' : files('memory.c', 'list_util.c')
+}
+
+# File keystore
+file_keystore_extra_sources = []
+file_keystore_extra_deps = []
+if host_system == 'windows'
+    file_keystore_extra_sources += 'file_crypt_win32.c'
+    file_keystore_extra_deps += cc.find_library('crypt32', required: true)
+endif
+vlc_modules += {
+    'name' : 'file_keystore',
+    'sources' : files('file.c', 'list_util.c', file_keystore_extra_sources),
+    'dependencies' : file_keystore_extra_deps
+}
+
+# KWallet keystore
+if dbus_dep.found()
+    vlc_modules += {
+        'name' : 'kwallet',
+        'sources' : files('kwallet.c'),
+        'dependencies' : [dbus_dep, m_lib]
+    }
+endif
+
+# libsecret keystore
+libsecret_dep = dependency('libsecret-1', version : '>= 0.18', required : get_option('libsecret'))
+if libsecret_dep.found()
+    vlc_modules += {
+        'name' : 'secret',
+        'sources' : files('secret.c'),
+        'dependencies' : [libsecret_dep]
+    }
+endif
+
+# Keychain (for appleOSes)
+if host_system == 'darwin'
+    vlc_modules += {
+        'name' : 'keychain',
+        'sources' : files('keychain.m', 'list_util.c'),
+        'objc_args' : ['-fobjc-arc'],
+        'dependencies' : [foundation_dep, security_dep]
+    }
+endif
diff --git a/modules/logger/meson.build b/modules/logger/meson.build
new file mode 100644
index 0000000000..dad2f52d26
--- /dev/null
+++ b/modules/logger/meson.build
@@ -0,0 +1,31 @@
+# Console logger module
+vlc_modules += {
+    'name' : 'console_logger',
+    'sources' : files(['console.c']),
+}
+
+# File logger
+vlc_modules += {
+    'name' : 'file_logger',
+    'sources' : files('file.c')
+}
+
+# Syslog logger
+if cc.check_header('syslog.h')
+    vlc_modules += {
+        'name' : 'syslog',
+        'sources' : files('syslog.c')
+    }
+endif
+
+# Systemd journal logger
+libsystemd_dep = dependency('libsystemd', required : false)
+if libsystemd_dep.found()
+    vlc_modules += {
+        'name' : 'sd_journal',
+        'sources' : files('journal.c'),
+        'dependencies' : [libsystemd_dep]
+    }
+endif
+
+# TODO Android logger
diff --git a/modules/meson.build b/modules/meson.build
new file mode 100644
index 0000000000..bffdbcc722
--- /dev/null
+++ b/modules/meson.build
@@ -0,0 +1,157 @@
+#
+# VLC plugins
+# This file contains the top-level build definition for VLC
+# plugins, in the subdirectories are the actual build definitions
+# for the individual plugins.
+#
+
+# Module dependencies
+# The following section contains dependencies that are needed
+# by multiple module types. (There is no need to put dependencies
+# here that are used by multiple modules in the same subdirectory)
+
+# Pulse audio
+pulse_dep = dependency('libpulse', version: '>= 1.0', required: get_option('pulse'))
+
+# ALSA
+alsa_dep = dependency('alsa', version : '>= 1.0.24', required : get_option('alsa'))
+
+# JACK (TODO: set required based on a get_option())
+jack_dep = dependency('jack', version : '>= 1.9.7', required : false)
+if not jack_dep.found()
+    # Try jack1 instead
+    jack_dep = dependency('jack', version : ['>= 0.120.1', '< 1.0'],
+        required : false)
+endif
+
+# Darwin-specific dependencies
+if host_system == 'darwin'
+    cocoa_dep = dependency('Cocoa', required: true)
+    security_dep = dependency('Security', required : true)
+    coremedia_dep = dependency('CoreMedia', required : true)
+    corevideo_dep = dependency('CoreVideo', required : true)
+    videotoolbox_dep = dependency('VideoToolbox', required : true)
+    audiounit_dep = dependency('AudioUnit', required: true)
+    audiotoolbox_dep = dependency('AudioToolbox', required : true)
+    iokit_dep = dependency('IOKit', required : true)
+endif
+
+# Helper libraries for modules
+# These are helper libraries used by some modules
+if pulse_dep.found()
+    libvlc_pulse = library('vlc_pulse',
+        files('audio_output/vlcpulse.c'),
+        include_directories: [include_directories('audio_output'), vlc_include_dirs],
+        dependencies: [pulse_dep],
+        link_with: [vlc_libcompat, libvlccore],
+    )
+endif
+
+# Array that holds all enabled VLC module dicts
+vlc_modules = []
+
+# codec modules
+subdir('codec')
+
+# demux modules
+subdir('demux')
+
+# access modules
+subdir('access')
+
+# audio filter modules
+subdir('audio_filter')
+
+# audio mixer
+subdir('audio_mixer')
+
+# audio output modules
+subdir('audio_output')
+
+# control modules
+subdir('control')
+
+# gui modules
+subdir('gui')
+
+# keystore modules
+subdir('keystore')
+
+# logger modules
+subdir('logger')
+
+# misc modules
+subdir('misc')
+
+# meta engine modules
+subdir('meta_engine')
+
+# packetizer modules
+subdir('packetizer')
+
+# service discovery modules
+subdir('services_discovery')
+
+# text renderer modules
+subdir('text_renderer')
+
+# video chroma modules
+subdir('video_chroma')
+
+# video filter modules
+subdir('video_filter')
+
+# video output modules
+subdir('video_output')
+
+# video splitter modules
+subdir('video_splitter')
+
+# visualization modules
+subdir('visualization')
+
+# Qt check executable
+# This has to be declared here as it needs to end up
+# in the modules folder, not in gui/qt/ subfolder as
+# vlc-static would not find it there.
+if qt5_dep.found()
+    executable('vlc-qt-check',
+        files('gui/qt/vlc-qt-check.cpp'),
+        dependencies: [qt5_dep],
+        include_directories: [vlc_include_dirs],
+        build_by_default: true,
+        install: true,
+        install_dir: get_option('libexecdir')
+    )
+endif
+
+#
+# Common module handling code
+#
+# In order to reduce boilerplate code, plugins are defined by a
+# dictionary which is added to the `vlc_modules` array. This
+# array is then iterated over and a library is defined for each
+# entry with the needed build definition for a VLC plugin.
+#
+foreach module : vlc_modules
+    common_args = [
+        '-DMODULE_STRING="@0@"'.format(module['name']),
+        '-D__PLUGIN__'
+    ]
+
+    library(module['name'] + '_plugin',
+        module['sources'],
+        link_with: [module.get('link_with', []), vlc_libcompat, libvlccore],
+        link_args: module.get('link_args', []),
+        link_depends: module.get('link_depends', []),
+        #link_language: module.get('link_language', []),
+        include_directories: [module.get('include_directories', []), vlc_include_dirs],
+        dependencies: module.get('dependencies', []),
+        c_args: [module.get('c_args', []), common_args],
+        cpp_args: [module.get('cpp_args', []), common_args],
+        objc_args: [module.get('objc_args', []), common_args],
+        build_by_default: true,
+        install: true,
+        install_dir: get_option('libdir') / 'vlc/plugins'
+    )
+endforeach
diff --git a/modules/meta_engine/meson.build b/modules/meta_engine/meson.build
new file mode 100644
index 0000000000..b745251edc
--- /dev/null
+++ b/modules/meta_engine/meson.build
@@ -0,0 +1,15 @@
+# Folder
+vlc_modules += {
+    'name' : 'folder',
+    'sources' : files('folder.c')
+}
+
+# Taglib
+taglib_dep = dependency('taglib', version : '>= 1.11', required : get_option('taglib'))
+if taglib_dep.found()
+    vlc_modules += {
+        'name' : 'taglib',
+        'sources' : files('taglib.cpp', '../demux/xiph_metadata.c'),
+        'dependencies' : [taglib_dep, z_lib]
+    }
+endif
diff --git a/modules/misc/meson.build b/modules/misc/meson.build
new file mode 100644
index 0000000000..2edb66818f
--- /dev/null
+++ b/modules/misc/meson.build
@@ -0,0 +1,160 @@
+# stats module
+vlc_modules += {
+    'name' : 'stats',
+    'sources' : files('stats.c')
+}
+
+# audioscrobbler module
+vlc_modules += {
+    'name' : 'audioscrobbler',
+    'sources' : files('audioscrobbler.c'),
+    'dependencies' : [threads_dep, socket_libs]
+}
+
+# audio fingerprinter module
+vlc_modules += {
+    'name' : 'fingerprinter',
+    'sources' : files(
+        'fingerprinter.c',
+        'webservices/json.c',
+        'webservices/acoustid.c',
+    ),
+    'dependencies' : [m_lib]
+}
+
+# export module
+vlc_modules += {
+    'name' : 'export',
+    'sources' : files(
+        'playlist/export.c',
+        'playlist/html.c',
+        'playlist/m3u.c',
+        'playlist/xspf.c',
+    )
+}
+
+# libxml2 module
+libxml2_dep = dependency('libxml-2.0', version : '>= 2.5', required : get_option('libxml2'))
+if libxml2_dep.found()
+    vlc_modules += {
+        'name' : 'xml',
+        'sources' : files('xml/libxml.c'),
+        'dependencies' : [libxml2_dep]
+    }
+endif
+
+# medialibrary module
+medialibrary_dep = dependency('medialibrary', required : get_option('medialibrary'), method : 'pkg-config')
+if medialibrary_dep.found()
+    vlc_modules += {
+        'name' : 'medialibrary',
+        'sources' : files(
+            'medialibrary/medialib.cpp',
+            'medialibrary/MetadataExtractor.cpp',
+            'medialibrary/entities.cpp',
+            'medialibrary/Thumbnailer.cpp',
+            'medialibrary/fs/device.cpp',
+            'medialibrary/fs/directory.cpp',
+            'medialibrary/fs/file.cpp',
+            'medialibrary/fs/fs.cpp',
+            'medialibrary/fs/util.cpp',
+        ),
+        'dependencies' : [medialibrary_dep]
+    }
+endif
+
+# Securetransport
+if host_system == 'darwin'
+    vlc_modules += {
+        'name' : 'securetransport',
+        'sources' : files('securetransport.c'),
+        'link_args' : ['-Wl,-U,_SSLCopyALPNProtocols,-U,_SSLSetALPNProtocols'],
+        'dependencies' : [security_dep, corefoundation_dep]
+    }
+endif
+
+# GnuTLS module
+# If there are errors with this, probably due to lack of:
+# https://github.com/mesonbuild/meson/pull/5656
+gnutls_dep = dependency('gnutls', version : '>= 3.5.0', required : get_option('gnutls'))
+if gnutls_dep.found()
+    vlc_modules += {
+        'name' : 'gnutls',
+        'sources' : files('gnutls.c'),
+        'dependencies' : [gnutls_dep]
+    }
+endif
+
+# IOKit inhibit module (macOS only)
+if have_osx
+    vlc_modules += {
+        'name' : 'iokit_inhibit',
+        'sources' : files('inhibit/iokit-inhibit.c'),
+        'dependencies' : [corefoundation_dep, iokit_dep]
+    }
+endif
+
+if get_option('addon_manager')
+    # Add-on manager module
+    vlc_modules += {
+        'name' : 'addonsvorepository',
+        'sources' : files('addons/vorepository.c')
+    }
+    # Add-on filesystem storage module
+    vlc_modules += {
+        'name' : 'addonsfsstorage',
+        'sources' : files('addons/fsstorage.c')
+    }
+endif
+
+vlc_modules += {
+    'name' : 'vod_rtsp',
+    'sources' : files('rtsp.c'),
+    'dependencies' : [socket_libs]
+}
+
+# Wayland inhibit module
+if have_wayland
+    # FIXME: Includes are currently set up in a way that they will not
+    # include this file correctly. This needs to be fixed.
+    wl_inhibit_client_proto = custom_target(
+        'idle-inhibit-client-protocol-generator',
+        output : 'idle-inhibit-client-protocol.h',
+        input : wayland_protocols_dir / 'unstable/idle-inhibit/idle-inhibit-unstable-v1.xml',
+        command : [wayland_scanner, 'client-header', '@INPUT@', '@OUTPUT@'],
+    )
+    wl_inhibit_proto = custom_target(
+        'idle-inhibit-protocol-generator',
+        output : 'idle-inhibit-protocol.c',
+        input : wayland_protocols_dir / 'unstable/idle-inhibit/idle-inhibit-unstable-v1.xml',
+        command : [wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@'],
+    )
+
+    vlc_modules += {
+        'name' : 'wl_idle_inhibit',
+        'sources' : [
+            files('inhibit/wl-idle-inhibit.c'),
+            wl_inhibit_client_proto,
+            wl_inhibit_proto,
+        ],
+        'dependencies' : [wayland_deps],
+    }
+endif
+
+# XCB screensaver inhibit module
+if xcb_dep.found()
+    vlc_modules += {
+        'name' : 'xdg_screensaver',
+        'sources' : files('inhibit/xdg.c'),
+        'dependencies' : [xcb_dep]
+    }
+endif
+
+# DBUS
+if dbus_dep.found()
+    vlc_modules += {
+        'name' : 'dbus_screensaver',
+        'sources' : files('inhibit/dbus.c'),
+        'dependencies' : [dbus_dep]
+    }
+endif
diff --git a/modules/packetizer/meson.build b/modules/packetizer/meson.build
new file mode 100644
index 0000000000..413957aea7
--- /dev/null
+++ b/modules/packetizer/meson.build
@@ -0,0 +1,98 @@
+# AV1 packetizer
+vlc_modules += {
+    'name' : 'packetizer_av1',
+    'sources' : files('av1.c', 'av1_obu.c')
+}
+
+# Copy packetizer
+vlc_modules += {
+    'name' : 'packetizer_copy',
+    'sources' : files('copy.c')
+}
+
+# MPEG-I/II video packetizer
+vlc_modules += {
+    'name' : 'packetizer_mpegvideo',
+    'sources' : files('mpegvideo.c')
+}
+
+# MPEG audio layer I/II/III packetizer
+vlc_modules += {
+    'name' : 'packetizer_mpegaudio',
+    'sources' : files('mpegaudio.c')
+}
+
+# MPEG4 video packetizer
+vlc_modules += {
+    'name' : 'packetizer_mpeg4video',
+    'sources' : files('mpeg4video.c')
+}
+
+# MPEG4 audio packetizer
+vlc_modules += {
+    'name' : 'packetizer_mpeg4audio',
+    'sources' : files('mpeg4audio.c')
+}
+
+# H.264 packetizer
+vlc_modules += {
+    'name' : 'packetizer_h264',
+    'sources' : files(
+        'h264.c',
+        'h264_nal.c',
+        'h264_slice.c',
+        'hxxx_sei.c',
+        'hxxx_common.c'
+    )
+}
+
+# VC-1 packetizer
+vlc_modules += {
+    'name' : 'packetizer_vc1',
+    'sources' : files('vc1.c')
+}
+
+# Meridian Lossless Packing packetizer
+vlc_modules += {
+    'name' : 'packetizer_mlp',
+    'sources' : files('mlp.c')
+}
+
+# FLAC packetizer
+vlc_modules += {
+    'name' : 'packetizer_flac',
+    'sources' : files('flac.c')
+}
+
+# HEVC packetizer
+vlc_modules += {
+    'name' : 'packetizer_hevc',
+    'sources' : files(
+        'hevc.c',
+        'hevc_nal.c',
+        'hxxx_sei.c',
+        'hxxx_common.c'
+        )
+}
+
+# A/52 audio packetizer
+vlc_modules += {
+    'name' : 'packetizer_a52',
+    'sources' : files('a52.c')
+}
+
+# DTS audio packetizer
+vlc_modules += {
+    'name' : 'packetizer_dts',
+    'sources' : files('dts.c', 'dts_header.c')
+}
+
+# FFmpeg-based packetizer
+if avcodec_dep.found()
+    vlc_modules += {
+        'name' : 'packetizer_avparser',
+        'sources' : files('avparser.c'),
+        'dependencies' : [avutil_dep, avcodec_dep],
+        'link_with' : [libavcodec_common]
+    }
+endif
diff --git a/modules/services_discovery/meson.build b/modules/services_discovery/meson.build
new file mode 100644
index 0000000000..4eec512c90
--- /dev/null
+++ b/modules/services_discovery/meson.build
@@ -0,0 +1,71 @@
+# Podcast
+vlc_modules += {
+    'name' : 'podcast',
+    'sources' : files('podcast.c'),
+    'dependencies' : [threads_dep]
+}
+
+# Zeroconf services discovery
+avahi_dep = dependency('avahi-client', version : '>= 0.6', required : get_option('avahi'))
+if avahi_dep.found()
+    vlc_modules += {
+        'name' : 'avahi',
+        'sources' : files('avahi.c'),
+        'dependencies' : [avahi_dep]
+    }
+endif
+
+# MTP devices support
+mtp_dep = dependency('libmtp', version : '>= 1.0.0', required : get_option('mtp'))
+if mtp_dep.found()
+    vlc_modules += {
+        'name' : 'mtp',
+        'sources' : files('mtp.c'),
+        'dependencies' : [mtp_dep]
+    }
+endif
+
+# UPnP Plugin (Intel SDK)
+upnp_dep = dependency('libupnp', required : get_option('upnp'))
+if upnp_dep.found()
+    vlc_modules += {
+        'name' : 'upnp',
+        'sources' : files(
+            'upnp.cpp',
+            'upnp-wrapper.cpp',
+            '../stream_out/renderer_common.cpp',
+            '../stream_out/dlna/dlna.cpp',
+            ),
+        'dependencies' : [upnp_dep]
+    }
+endif
+
+# mDNS using libmicrodns
+microdns_dep = dependency('microdns', required : get_option('microdns'))
+if microdns_dep.found()
+    vlc_modules += {
+        'name' : 'microdns',
+        'sources' : files('microdns.c'),
+        'dependencies' : [microdns_dep, socket_libs]
+    }
+endif
+
+# mDNS using Bonjour
+if host_system == 'darwin'
+    foundation_dep = dependency('Foundation', required : true)
+    vlc_modules += {
+        'name' : 'bonjour',
+        'sources' : files('bonjour.m'),
+        'objc_args' : ['-fobjc-arc'],
+        'dependencies' : [foundation_dep]
+    }
+endif
+
+# XCB apps discovery
+if xcb_dep.found()
+    vlc_modules += {
+        'name' : 'xcb_apps',
+        'sources' : files('xcb_apps.c'),
+        'dependencies' : [xcb_dep]
+    }
+endif
diff --git a/modules/text_renderer/meson.build b/modules/text_renderer/meson.build
new file mode 100644
index 0000000000..833ca90d66
--- /dev/null
+++ b/modules/text_renderer/meson.build
@@ -0,0 +1,11 @@
+#
+# Text renderer modules
+# Modules that are used to render subtitles and OSD text
+#
+
+# Dummy text renderer
+vlc_modules += {
+    'name' : 'tdummy',
+    'sources' : files('tdummy.c')
+}
+
diff --git a/modules/video_chroma/meson.build b/modules/video_chroma/meson.build
new file mode 100644
index 0000000000..69f135a304
--- /dev/null
+++ b/modules/video_chroma/meson.build
@@ -0,0 +1,20 @@
+# chroma copy helper library
+chroma_copy_lib = static_library(
+    'chroma_copy',
+    files('copy.c'),
+    include_directories : [vlc_include_dirs],
+    pic : true
+)
+
+# CVPX chroma converter
+if host_system == 'darwin'
+    vlc_modules += {
+        'name' : 'cvpx',
+        'sources' : files(
+            '../codec/vt_utils.c',
+            'cvpx.c',
+        ),
+        'link_with' : [chroma_copy_lib],
+        'dependencies' : [videotoolbox_dep, foundation_dep, coremedia_dep, corevideo_dep]
+    }
+endif
diff --git a/modules/video_filter/meson.build b/modules/video_filter/meson.build
new file mode 100644
index 0000000000..a74b91d3e7
--- /dev/null
+++ b/modules/video_filter/meson.build
@@ -0,0 +1,25 @@
+# deinterlace common helper lib
+deinterlacecommon_lib = static_library(
+    'deinterlace_common',
+    files('deinterlace/common.c'),
+    include_directories : [vlc_include_dirs],
+    pic : true
+)
+
+# deinterlace filter
+vlc_modules += {
+    'name' : 'deinterlace',
+    'sources' : files(
+        'deinterlace/deinterlace.c',
+        'deinterlace/merge.c',
+        'deinterlace/helpers.c',
+        'deinterlace/algo_basic.c',
+        'deinterlace/algo_x.c',
+        'deinterlace/algo_yadif.c',
+        'deinterlace/algo_phosphor.c',
+        'deinterlace/algo_ivtc.c',
+    ),
+    # Inline ASM doesn't build with -O0
+    'c_args' : ['-O2'],
+    'link_with' : [deinterlacecommon_lib]
+}
diff --git a/modules/video_output/meson.build b/modules/video_output/meson.build
new file mode 100644
index 0000000000..3bcc01d2b8
--- /dev/null
+++ b/modules/video_output/meson.build
@@ -0,0 +1,164 @@
+#
+# Video output modules
+#
+
+# Dummy video output
+vlc_modules += {
+    'name' : 'vdummy',
+    'sources' : files('vdummy.c')
+}
+
+# Dummy window provider
+vlc_modules += {
+    'name' : 'wdummy',
+    'sources' : files('wdummy.c')
+}
+
+# Video splitter
+vlc_modules += {
+    'name' : 'video_splitter',
+    'sources' : files('splitter.c')
+}
+
+# YUV video output
+vlc_modules += {
+    'name' : 'yuv',
+    'sources' : files('yuv.c')
+}
+
+# Flaschen video output
+vlc_modules += {
+    'name' : 'flaschen',
+    'sources' : files('flaschen.c'),
+    'dependencies' : [socket_libs]
+}
+
+# Coloured ASCII art (Caca)
+caca_dep = dependency('caca', version : '>= 0.99.beta14', required : get_option('caca'))
+if caca_dep.found()
+    vlc_modules += {
+        'name' : 'caca',
+        'sources' : files('caca.c'),
+        'dependencies' : [caca_dep, x11_dep]
+    }
+endif
+
+# Kernel Mode Setting
+drm_dep = dependency('libdrm', version : '>= 2.4.83', required : get_option('drm'))
+if drm_dep.found()
+    vlc_modules += {
+        'name' : 'kms',
+        'sources' : files('kms.c'),
+        'dependencies' : [drm_dep]
+    }
+endif
+
+# Linux FrameBuffer
+if cc.check_header('linux/fb.h')
+    vlc_modules += {
+        'name' : 'fb',
+        'sources' : files('fb.c')
+    }
+endif
+
+# TODO Android EGL stuff
+
+# TODO OS2 KVA stuff
+
+# TODO drawable
+
+# TODO inhibit
+
+# TODO egl win32
+
+# TODO wingdi
+
+# TODO glwin32
+
+# TODO directdraw
+
+# TODO direct3d11
+
+# TODO direct3d9
+
+# TODO ALL THE OTHER STUFF!
+
+#
+# OpenGL video outputs
+#
+
+opengl_common_sources = files(
+    'opengl/vout_helper.c',
+    'opengl/fragment_shaders.c',
+    'opengl/converter_sw.c'
+    )
+
+opengl_common_deps = []
+
+if have_osx
+    quartz_dep = dependency('QuartzCore', required: true)
+    opengl_dep = dependency('OpenGL', method: 'extraframework', required : true)
+
+    vlc_modules += {
+        'name' : 'vout_macosx',
+        'sources' : [files('macosx.m'), opengl_common_sources],
+        'c_args' : ['-DHAVE_GL_CORE_SYMBOLS'],
+        'dependencies' : [m_lib, cocoa_dep, opengl_dep, opengl_common_deps]
+    }
+
+    vlc_modules += {
+        'name' : 'caopengllayer',
+        'sources' : [files('caopengllayer.m'), opengl_common_sources],
+        'c_args' : ['-DHAVE_GL_CORE_SYMBOLS'],
+        'dependencies' : [m_lib, cocoa_dep, opengl_dep, quartz_dep, opengl_common_deps]
+    }
+endif
+
+#
+# Vulkan video outputs
+#
+
+vulkan_common_sources = [
+    'vulkan/instance.c',
+    'placebo_utils.c',
+]
+
+vulkan_dep = dependency('vulkan', version : '>= 1.0.26', required : false)
+placebo_dep = dependency('libplacebo', version : '>= 1.7', required : false)
+
+vulkan_common_deps = [vulkan_dep, placebo_dep]
+
+if placebo_dep.found() and vulkan_dep.found() 
+    #TODO: and placebo_dep.version().version_compare('>= 1.7')
+    # TODO: link_language kwarg is not yet accepted for library() in released
+    # meson versions
+    vlc_modules += {
+        'name' : 'vk',
+        'sources' : files(
+            'vulkan/display.c',
+            vulkan_common_sources
+        ),
+        'dependencies' : [vulkan_common_deps]
+    }
+
+    if xcb_dep.found() and x11_dep.found()
+        vlc_modules += {
+            'name' : 'vk_x11',
+            'sources' : files(
+                'vulkan/surface.c',
+                'vulkan/platform_xcb.c',
+                vulkan_common_sources
+            ),
+            'c_args' : ['-DVK_USE_PLATFORM_XCB_KHR', '-DPLATFORM_NAME=X11'],
+            'dependencies' : [vulkan_common_deps, x11_dep, xcb_dep]
+        }
+    endif
+endif
+
+if xcb_dep.found() and xproto_dep.found()
+    vlc_modules += {
+        'name' : 'xcb_window',
+        'sources' : files('xcb/window.c'),
+        'dependencies' : [xcb_dep, xproto_dep]
+    }
+endif
diff --git a/modules/video_splitter/meson.build b/modules/video_splitter/meson.build
new file mode 100644
index 0000000000..008d12cd68
--- /dev/null
+++ b/modules/video_splitter/meson.build
@@ -0,0 +1,24 @@
+# Clone video splitter
+vlc_modules += {
+    'name' : 'clone',
+    'sources' : files('clone.c')
+}
+
+# Wall video splitter
+vlc_modules += {
+    'name' : 'wall',
+    'sources' : files('wall.c')
+}
+
+if xcb_dep.found() and xcb_randr_dep.found()
+    vlc_modules += {
+        'name' : 'panoramix',
+        'sources' : files('panoramix.c'),
+        'dependencies' : [xcb_dep, xcb_randr_dep]
+    }
+elif host_system == 'windows'
+    vlc_modules += {
+        'name' : 'panoramix',
+        'sources' : files('panoramix.c')
+    }
+endif
diff --git a/modules/visualization/meson.build b/modules/visualization/meson.build
new file mode 100644
index 0000000000..a6af877ad5
--- /dev/null
+++ b/modules/visualization/meson.build
@@ -0,0 +1,29 @@
+# goom visualization plugin
+goom2_dep = dependency('libgoom2', required : get_option('goom2'))
+if goom2_dep.found()
+    vlc_modules += {
+        'name' : 'goom',
+        'sources' : files('goom.c'),
+        'dependencies' : [goom2_dep, m_lib]
+    }
+endif
+
+# projectM visualization plugin
+projectm_dep = dependency('libprojectM', version : '>= 2.0.0', required : false)
+projectm_args = []
+
+if projectm_dep.found()
+    projectm_args += '-DHAVE_PROJECTM2'
+else
+    projectm_dep = dependency('libprojectM', version : '< 2.0.0',
+        required : false)
+endif
+
+if projectm_dep.found()
+    vlc_modules += {
+        'name' : 'projectm',
+        'sources' : files('projectm.cpp'),
+        'dependencies' : [projectm_dep],
+        'cpp_args' : [projectm_args]
+    }
+endif
diff --git a/src/meson.build b/src/meson.build
new file mode 100644
index 0000000000..3e9bb72ecd
--- /dev/null
+++ b/src/meson.build
@@ -0,0 +1,268 @@
+#
+# VLC revision file generation
+#
+git_dir = join_paths(vlc_src_root, '.git')
+rev_target = vcs_tag(command : ['git',
+    '--git-dir', git_dir,
+    'describe', '--tags', '--long',
+    '--match', '?.*.*', '--always'],
+    input : 'revision.c.in',
+    output : 'revision.c')
+
+#
+# FourCC preprocessor
+#
+
+fourcc_gen = executable('fourcc_gen',
+    ['misc/fourcc_gen.c'],
+    include_directories: vlc_include_dirs,
+    native: true
+)
+
+fourcc = custom_target('fourcc_tables.h',
+                        output :  ['fourcc_tables.h'],
+                        depend_files : ['misc/fourcc_list.h', '../include/vlc_fourcc.h'],
+                        capture : true,
+                        command : [fourcc_gen])
+
+
+#
+# libvlccore dependencies
+#
+anl_lib = cc.find_library('anl', required: false)
+
+libvlccore_deps = [
+    m_lib, dl_lib, threads_dep, libintl_lib, socket_libs, iconv_lib, anl_lib
+]
+
+if host_system == 'darwin'
+    libvlccore_deps += foundation_dep
+    libvlccore_deps += corefoundation_dep
+    libvlccore_deps += dependency('CFNetwork', required: true)
+endif
+
+#
+# libvlccore library
+#
+libvlccore_sources_base = [
+    'libvlc.c',
+    'libvlc.h',
+    'libvlc-module.c',
+    'missing.c',
+    'version.c',
+    'config/core.c',
+    'config/chain.c',
+    'config/file.c',
+    'config/help.c',
+    'config/intf.c',
+    'config/cmdline.c',
+    'config/getopt.c',
+    'clock/clock.c',
+    'clock/input_clock.c',
+    'clock/clock_internal.c',
+    'extras/libc.c',
+    'modules/modules.h',
+    'modules/modules.c',
+    'modules/bank.c',
+    'modules/cache.c',
+    'modules/entry.c',
+    'modules/textdomain.c',
+    'network/stream.c',
+    'interface/dialog.c',
+    'interface/interface.c',
+    'playlist/playlist.c',
+    'playlist/item.c',
+    'playlist/control.c',
+    'playlist/content.c',
+    'playlist/notify.c',
+    'playlist/player.c',
+    'playlist/preparse.c',
+    'playlist/randomizer.c',
+    'playlist/request.c',
+    'playlist/sort.c',
+    'playlist/export.c',
+    'playlist/shuffle.c',
+    'media_source/media_source.c',
+    'media_source/media_tree.c',
+    'preparser/art.c',
+    'preparser/fetcher.c',
+    'preparser/preparser.c',
+    'input/item.c',
+    'input/access.c',
+    'input/decoder.c',
+    'input/decoder_helpers.c',
+    'input/demux.c',
+    'input/demux_chained.c',
+    'input/es_out.c',
+    'input/es_out_timeshift.c',
+    'input/input.c',
+    'input/meta.c',
+    'input/thumbnailer.c',
+    'input/resource.c',
+    'input/services_discovery.c',
+    'input/stats.c',
+    'input/stream.c',
+    'input/stream_fifo.c',
+    'input/stream_extractor.c',
+    'input/stream_filter.c',
+    'input/stream_memory.c',
+    'input/subtitles.c',
+    'input/player.c',
+    'input/var.c',
+    'audio_output/common.c',
+    'audio_output/dec.c',
+    'audio_output/filters.c',
+    'audio_output/output.c',
+    'audio_output/volume.c',
+    'video_output/control.c',
+    'video_output/display.c',
+    'video_output/inhibit.c',
+    'video_output/interlacing.c',
+    'video_output/snapshot.c',
+    'video_output/video_output.c',
+    'video_output/video_text.c',
+    'video_output/video_epg.c',
+    'video_output/video_widgets.c',
+    'video_output/vout_subpictures.c',
+    'video_output/window.c',
+    'video_output/opengl.c',
+    'video_output/vout_intf.c',
+    'video_output/vout_wrapper.c',
+    'network/getaddrinfo.c',
+    'network/http_auth.c',
+    'network/httpd.c',
+    'network/io.c',
+    'network/tcp.c',
+    'network/udp.c',
+    'network/rootbind.c',
+    'network/tls.c',
+    'text/charset.c',
+    'text/memstream.c',
+    'text/strings.c',
+    'text/unicode.c',
+    'text/url.c',
+    'text/filesystem.c',
+    'text/iso_lang.c',
+    'misc/actions.c',
+    'misc/background_worker.c',
+    'misc/md5.c',
+    'misc/probe.c',
+    'misc/rand.c',
+    'misc/mtime.c',
+    'misc/block.c',
+    'misc/fifo.c',
+    'misc/fourcc.c',
+    'misc/es_format.c',
+    'misc/picture.c',
+    'misc/picture_fifo.c',
+    'misc/picture_pool.c',
+    'misc/interrupt.c',
+    'misc/keystore.c',
+    'misc/renderer_discovery.c',
+    'misc/threads.c',
+    'misc/cpu.c',
+    'misc/epg.c',
+    'misc/exit.c',
+    'misc/events.c',
+    'misc/image.c',
+    'misc/messages.c',
+    'misc/mime.c',
+    'misc/objects.c',
+    'misc/objres.c',
+    'misc/variables.c',
+    'misc/viewpoint.c',
+    'misc/xml.c',
+    'misc/addons.c',
+    'misc/filter.c',
+    'misc/filter_chain.c',
+    'misc/httpcookies.c',
+    'misc/fingerprinter.c',
+    'misc/text_style.c',
+    'misc/subpicture.c',
+    'misc/medialibrary.c',
+    'misc/sort.c',
+]
+
+libvlccore_sout_sources = [
+    'stream_output/sap.c',
+    'stream_output/sdp.c',
+    'stream_output/stream_output.c',
+    'stream_output/stream_output.h'
+]
+
+libvlccore_vlm_sources = [
+    'input/vlm.c',
+    'input/vlm_event.c',
+    'input/vlmshell.c'
+]
+
+libvlccore_sources = [
+    libvlccore_sources_base,
+    libvlccore_sout_sources,
+    libvlccore_vlm_sources
+]
+
+if host_system == 'darwin'
+    libvlccore_sources += [
+        'darwin/dirs.m',
+        'darwin/error.c',
+        'darwin/netconf.m',
+        'darwin/specific.c',
+        'darwin/thread.c',
+
+        'posix/filesystem.c',
+        'posix/plugin.c',
+        'posix/rand.c',
+        'posix/timer.c',
+        'posix/sort.c',
+    ]
+elif host_system == 'windows'
+    libvlccore_sources += [
+        'win32/dirs.c',
+        'win32/error.c',
+        'win32/filesystem.c',
+        'win32/netconf.c',
+        'win32/plugin.c',
+        'win32/rand.c',
+        'win32/specific.c',
+        'win32/thread.c',
+        'win32/winsock.c',
+
+        'win32/timer.c' # TODO: this is non-winstore
+    ]
+elif host_system == 'linux'
+    libvlccore_sources += [
+        'posix/dirs.c',
+        'posix/error.c',
+        'posix/netconf.c',
+        'posix/specific.c',
+        'posix/thread.c',
+        'posix/filesystem.c',
+        'posix/plugin.c',
+        'posix/rand.c',
+        'posix/timer.c',
+        'posix/sort.c',
+        'linux/cpu.c',
+        'linux/dirs.c',
+        'linux/filesystem.c',
+        'linux/thread.c',
+    ]
+
+    if anl_lib.found()
+        libvlccore_sources += 'linux/getaddrinfo.c'
+    else
+        libvlccore_sources += 'posix/getaddrinfo.c'
+    endif
+endif
+
+
+libvlccore = library(
+    'vlccore',
+    libvlccore_sources, vlc_about, fourcc, rev_target,
+    include_directories: vlc_include_dirs,
+    version: '9.0.0',
+    c_args: ['-DMODULE_STRING="core"', '-DHAVE_DYNAMIC_PLUGINS' ],
+    link_with: [vlc_libcompat],
+    dependencies: libvlccore_deps,
+    install: true
+)
diff --git a/src/revision.c.in b/src/revision.c.in
new file mode 100644
index 0000000000..afc1e6724e
--- /dev/null
+++ b/src/revision.c.in
@@ -0,0 +1,2 @@
+const char psz_vlc_changeset[] = "@VCS_TAG@";
+
-- 
2.19.1




More information about the vlc-devel mailing list