ffmpeg_src = ['common.c', 'packet_ext.c'] ffmpeg_args = ['-DCAMU_HAVE_FFMPEG'] ffmpeg_server_src = [ffmpeg_src, 'demuxer.c', 'avio.c'] server_transcode = not get_option('sink-only') if server_transcode ffmpeg_server_src += ['decoder.c', 'resampler.c', 'scaler.c', 'encoder.c'] endif ffmpeg_server_deps = [] ffmpeg_client_src = [ffmpeg_src, 'decoder.c', 'resampler.c', 'scaler.c'] ffmpeg_client_deps = [] ffmpeg_force_fallback = get_option('wrap_mode') == 'forcefallback' foreach dep: ['ffmpeg', 'libavutil', 'libavformat', 'libavcodec', 'libavdevice', 'libswresample', 'libswscale'] if dep in get_option('force_fallback_for') ffmpeg_force_fallback = true break endif endforeach ffmpeg_version_option = get_option('codec-ffmpeg-version') # Check for FFmpeg version in the environment. if not ffmpeg_force_fallback libavutil_version_map = { '54': '2', '55': '3', '56': '4', '57': '5', '58': '6', '59': '7', '60': '8' } libavutil_version_rev = { '2': '54', '3': '55', '4': '56', '5': '57', '6': '58', '7': '59', '8': '60' } if ffmpeg_version_option != 'system' ffmpeg_version_int = ffmpeg_version_option.to_int() # Overriding a found dependency will error but overriding a found dependency of the wrong version is allowed. libavutil_version_request = ['>=' + libavutil_version_rev[(ffmpeg_version_int).to_string()] + '.0.0'] if ffmpeg_version_int < 8 libavutil_version_request += ['<' + libavutil_version_rev[(ffmpeg_version_int + 1).to_string()] + '.0.0'] endif libavutil = dependency('libavutil', required: false, allow_fallback: false, version: libavutil_version_request) else libavutil = dependency('libavutil', required: false, allow_fallback: false) endif if libavutil.found() ffmpeg_version_string = run_command('sh', join_paths(meson.current_source_dir(), 'version.sh'), check: true).stdout().strip() if ffmpeg_version_string == '(unknown)' ffmpeg_version_string = libavutil_version_map[libavutil.version().split('.')[0]] + '.x' endif ffmpeg_args += ['-DFFMPEG_VERSION="' + ffmpeg_version_string + '"'] if get_option('codec-hwaccels').length() > 0 hwaccel_map = { 'vulkan': '-DCAMU_HAVE_VULKAN_DECODE', 'vaapi': '-DCAMU_HAVE_VAAPI', 'd3d11va': '-DCAMU_HAVE_D3D11VA', 'dxva2': '-DCAMU_HAVE_DXVA2', 'mediacodec': '-DCAMU_HAVE_MEDIACODEC', } foreach hwaccel: get_option('codec-hwaccels') if hwaccel in hwaccel_map ffmpeg_args += hwaccel_map[hwaccel] endif endforeach ffmpeg_args += ['-DCAMU_TRY_HWACCEL'] endif elif ffmpeg_version_option == 'system' error('System FFmpeg requested but not found. Add \'--force-fallback-for=ffmpeg\' or \'-Dcodec-ffmpeg-version=[8,7,6,...]\'.') endif endif # Fallback if requested or necessary. if ffmpeg_force_fallback or not libavutil.found() if ffmpeg_version_option == 'system' ffmpeg_version_option = '8' # Default to current latest. endif subproject('ffmpeg' + ffmpeg_version_option) # Override libav dependencies. endif libavutil = dependency('libavutil') libavutil_version = libavutil.version().split('.')[0].to_int() if libavutil_version <= 54 error('FFmpeg version 2.x and lower currently unsupported.') elif libavutil_version <= 56 ffmpeg_args += ['-DCAMU_OLD_FFMPEG'] endif libavformat = dependency('libavformat') libavcodec = dependency('libavcodec') libavdevice = dependency('libavdevice') libswresample = dependency('libswresample') libswscale = dependency('libswscale') ffmpeg_server_deps += [libavutil, libavformat, libavcodec] if server_transcode ffmpeg_server_deps += [libswresample, libswscale] endif ffmpeg_client_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale] codec_server_deps += [declare_dependency(sources: ffmpeg_server_src, dependencies: ffmpeg_server_deps, compile_args: ffmpeg_args)] codec_client_deps += [declare_dependency(sources: ffmpeg_client_src, dependencies: ffmpeg_client_deps, compile_args: ffmpeg_args)]