project('ffmpeg', 'c', version: '', meson_version: '>=0.57.0') compiler = meson.get_compiler('c') cpu = target_machine.cpu_family() is_64bit = (cpu == 'x86_64' or cpu == 'aarch64') is_debug = get_option('debug') is_minsize = get_option('optimization') == 's' is_lto = get_option('b_lto') is_linux = host_machine.system() == 'linux' is_windows = host_machine.system() == 'windows' is_msvc = compiler.get_id() == 'msvc' or compiler.get_id() == 'clang-cl' is_mingw = is_windows and not is_msvc is_android = host_machine.system() == 'android' args = ['-DFFMPEG_VERSION="' + meson.project_version() + '"'] deps = [] extra_options = [] if not is_debug extra_options += ['--disable-debug'] endif if is_minsize extra_options += ['--enable-small'] endif if is_lto extra_options += ['--enable-lto'] endif extra_options += ['--arch=' + cpu] extra_options += ['--cc=' + compiler.cmd_array()[0]] if meson.is_cross_build() if is_msvc extra_options += ['--ld=' + meson.get_external_property('ld')] endif extra_options += ['--ar=' + meson.get_external_property('ar', 'ar')] extra_options += ['--nm=' + meson.get_external_property('nm', 'nm')] endif if cpu == 'x86_64' or cpu == 'x86' extra_options += ['--enable-x86asm'] endif extra_options += ['--enable-static', '--disable-shared'] if is_windows if get_option('win32-compat') extra_options += ['--extra-cflags=-D_WIN32_WINNT=0x0502'] # Windows Server 2003 with SP1, Windows XP with SP2. endif if is_64bit extra_options += ['--target-os=win64'] else extra_options += ['--target-os=win32'] endif if is_msvc extra_options += ['--toolchain=msvc'] endif extra_options += ['--enable-w32threads'] deps += [compiler.find_library('bcrypt')] elif is_android extra_options += ['--target-os=android'] endif #'--extra-ldflags=-Lbuild/subprojects/libalabaster -l:libalabaster.a', #'--malloc-prefix=al_', decoders = 'flac,mp3,mp3float,aac,opus,vorbis,h264,hevc,vp9' decoders += ',pcm_s32be,pcm_s32le,pcm_s24be,pcm_s24le,pcm_s16be,pcm_s16le' #decoders += ',pcm_f32be,pcm_f32le,pcm_s32le_planar,pcm_s16be_planar,pcm_s16le_planar' decoders += ',dca,eac3' decoders += ',pcm_dvd,mpegvideo,mpeg2video' decoders += ',av1' #decoders += ',ass,srt' #if get_option('codec-hwaccels').length() == 0 libdav1d = dependency('dav1d', required: false) if libdav1d.found() decoders += ',libdav1d' extra_options += ['--enable-libdav1d'] deps += [libdav1d] endif #endif demuxers = '' parsers = '' if not get_option('sink-only') demuxers += 'flac,mp3,aac,wav,matroska,mov,avi' demuxers += ',pcm_s32be,pcm_s32le,pcm_s24be,pcm_s24le,pcm_s16be,pcm_s16le' #demuxers += ',pcm_f32be,pcm_f32le,pcm_s32le_planar,pcm_s16be_planar,pcm_s16le_planar' demuxers += ',eac3' demuxers += ',mpegts,mpegtsraw,mpegps,mpegvideo' #demuxers += ',ass,srt' parsers += 'aac,opus,h264,hevc,av1,vp9' parsers += ',dca' parsers += ',mpegaudio,mpegvideo,dvd_nav' bzlib = dependency('bzip2', required: false) if bzlib.found() extra_options += ['--enable-bzlib'] # matroska deps += [bzlib] endif endif ffmpeg_image_codecs = true if ffmpeg_image_codecs zlib = dependency('zlib', required: false) if zlib.found() extra_options += ['--enable-zlib'] decoders += ',png,apng,mjpeg,jpeg2000,webp,gif,psd' if not get_option('sink-only') demuxers += ',image_png_pipe,image2,mjpeg,image2pipe,image_jpeg_pipe,image_webp_pipe,gif,image_psd_pipe' parsers += ',png,mjpeg,jpeg2000,webp,gif,psd' endif deps += [zlib] else extra_options += ['--disable-zlib'] endif endif extra_options += ['--disable-xlib'] bsfs = '' if not get_option('sink-only') bsfs += 'extract_extradata,mp3_header_decompress' endif hwaccels = '' if meson.project_version().split('.')[0].to_int() <= 4 if 'vulkan' in get_option('codec-hwaccels') error('vulkan not supported in FFmpeg version ' + meson.project_version() + '.') endif else if 'vulkan' in get_option('codec-hwaccels') extra_options += ['--enable-vulkan'] hwaccels += ',h264_vulkan,hevc_vulkan,av1_vulkan,vp9_vulkan' args += ['-DCAMU_HAVE_VULKAN_DECODE'] else extra_options += ['--disable-vulkan'] endif endif if meson.project_version().split('.')[0].to_int() <= 3 if 'vaapi' in get_option('codec-hwaccels') error('vaapi not supported (by camu) in FFmpeg version ' + meson.project_version() + '.') endif else if 'vaapi' in get_option('codec-hwaccels') extra_options += ['--enable-libdrm', '--enable-vaapi'] hwaccels += ',h264_vaapi,hevc_vaapi,av1_vaapi,vp9_vaapi' deps += [dependency('libdrm'), dependency('libva'), dependency('libva-drm')] args += ['-DCAMU_HAVE_VAAPI'] else extra_options += ['--disable-libdrm', '--disable-vaapi'] endif endif if 'd3d11va' in get_option('codec-hwaccels') if not is_windows error('d3d11va not supported on ' + host_machine.system() + '.') endif extra_options += ['--enable-d3d11va'] hwaccels += ',h264_d3d11va,hevc_d3d11va,av1_d3d11va,vp9_d3d11va' hwaccels += ',h264_d3d11va2,hevc_d3d11va2,av1_d3d11va2,vp9_d3d11va2' args += ['-DCAMU_HAVE_D3D11VA'] else extra_options += ['--disable-d3d11va'] endif if 'dxva2' in get_option('codec-hwaccels') if not is_windows error('dxva2 not supported on ' + host_machine.system() + '.') endif extra_options += ['--enable-dxva2'] hwaccels += ',h264_dxva2,hevc_dxva2,av1_dxva2,vp9_dxva2' args += ['-DCAMU_HAVE_DXVA2'] else extra_options += ['--disable-dxva2'] endif if 'mediacodec' in get_option('codec-hwaccels') if not is_android error('mediacodec not supported on ' + host_machine.system() + '.') endif extra_options += ['--enable-jni', '--enable-mediacodec'] decoders += ',h264_mediacodec,hevc_mediacodec,av1_mediacodec,vp9_mediacodec' deps += [compiler.find_library('mediandk')] args += ['-DCAMU_HAVE_MEDIACODEC'] else extra_options += ['--disable-jni', '--disable-mediacodec'] endif if get_option('codec-hwaccels').length() == 0 extra_options += ['--disable-hwaccels'] else args += ['-DCAMU_TRY_HWACCEL'] endif # Disable unused hwaccels. extra_options += [ '--disable-amf', '--disable-audiotoolbox', '--disable-cuda-llvm', '--disable-cuvid', '--disable-ffnvcodec', '--disable-nvdec', '--disable-nvenc', '--disable-vdpau', '--disable-audiotoolbox', '--disable-videotoolbox' ] protocols = '' if not get_option('sink-only') protocols += 'cache' endif if decoders != '' extra_options += ['--enable-decoder=' + decoders] endif if demuxers != '' extra_options += ['--enable-demuxer=' + demuxers] endif if parsers != '' extra_options += ['--enable-parser=' + parsers] endif if bsfs != '' extra_options += ['--enable-bsf=' + bsfs] endif if protocols != '' extra_options += ['--enable-protocol=' + protocols] endif if hwaccels != '' extra_options += ['--enable-hwaccel=' + hwaccels] endif soxr = compiler.find_library('soxr', required: false) if soxr.found() extra_options += ['--enable-libsoxr'] deps += [soxr] args += ['-DCAMU_HAVE_SOXR'] endif ext_proj = import('unstable-external_project') proj = ext_proj.add_project('configure', configure_options: [ '--prefix=@PREFIX@', '--libdir=@PREFIX@/@LIBDIR@', '--incdir=@PREFIX@/@INCLUDEDIR@', '--enable-pic', '--disable-all', '--disable-autodetect', '--disable-everything', '--disable-programs', '--disable-doc', '--disable-htmlpages', '--disable-manpages', '--disable-podpages', '--disable-txtpages', '--disable-schannel', '--disable-network', '--disable-securetransport', '--enable-gpl', '--enable-version3', '--disable-nonfree', '--enable-runtime-cpudetect', '--enable-asm', '--enable-inline-asm', '--enable-avutil', '--enable-avformat', '--enable-avcodec', '--enable-avdevice', '--enable-swresample', '--enable-swscale', '--disable-indevs', '--disable-outdevs', extra_options ], cross_configure_options: ['--enable-cross-compile'], verbose: true) avutil = proj.dependency('avutil') avformat = proj.dependency('avformat') avcodec = proj.dependency('avcodec') avdevice = proj.dependency('avdevice') swresample = proj.dependency('swresample') swscale = proj.dependency('swscale') include = include_directories('.', 'build/') meson.override_dependency('libavutil', declare_dependency( dependencies: [avutil, deps], compile_args: args, include_directories: include, version: '')) meson.override_dependency('libavformat', declare_dependency( dependencies: [avformat], include_directories: include, version: '')) meson.override_dependency('libavcodec', declare_dependency( dependencies: [avcodec], include_directories: include, version: '')) meson.override_dependency('libavdevice', declare_dependency( dependencies: [avdevice], include_directories: include, version: '')) meson.override_dependency('libswresample', declare_dependency( dependencies: [swresample], include_directories: include, version: '')) meson.override_dependency('libswscale', declare_dependency( dependencies: [swscale], include_directories: include, version: ''))