#!/usr/bin/env python Import("env") Import("env_modules") # Thirdparty sources libvpx_dir = "#thirdparty/libvpx/" libvpx_sources = [ "vp8/vp8_dx_iface.c", "vp8/common/generic/systemdependent.c", "vp8/common/alloccommon.c", "vp8/common/blockd.c", "vp8/common/copy_c.c", "vp8/common/debugmodes.c", "vp8/common/dequantize.c", "vp8/common/entropy.c", "vp8/common/entropymode.c", "vp8/common/entropymv.c", "vp8/common/extend.c", "vp8/common/filter.c", "vp8/common/findnearmv.c", "vp8/common/idct_blk.c", "vp8/common/idctllm.c", "vp8/common/loopfilter_filters.c", "vp8/common/mbpitch.c", "vp8/common/modecont.c", "vp8/common/quant_common.c", "vp8/common/reconinter.c", "vp8/common/reconintra.c", "vp8/common/reconintra4x4.c", "vp8/common/rtcd.c", "vp8/common/setupintrarecon.c", "vp8/common/swapyv12buffer.c", "vp8/common/treecoder.c", "vp8/common/vp8_loopfilter.c", "vp8/decoder/dboolhuff.c", "vp8/decoder/decodeframe.c", "vp8/decoder/decodemv.c", "vp8/decoder/detokenize.c", "vp8/decoder/onyxd_if.c", "vp9/vp9_dx_iface.c", "vp9/common/vp9_alloccommon.c", "vp9/common/vp9_blockd.c", "vp9/common/vp9_common_data.c", "vp9/common/vp9_debugmodes.c", "vp9/common/vp9_entropy.c", "vp9/common/vp9_entropymode.c", "vp9/common/vp9_entropymv.c", "vp9/common/vp9_filter.c", "vp9/common/vp9_frame_buffers.c", "vp9/common/vp9_idct.c", "vp9/common/vp9_loopfilter.c", "vp9/common/vp9_mvref_common.c", "vp9/common/vp9_pred_common.c", "vp9/common/vp9_quant_common.c", "vp9/common/vp9_reconinter.c", "vp9/common/vp9_reconintra.c", "vp9/common/vp9_rtcd.c", "vp9/common/vp9_scale.c", "vp9/common/vp9_scan.c", "vp9/common/vp9_seg_common.c", "vp9/common/vp9_thread_common.c", "vp9/common/vp9_tile_common.c", "vp9/decoder/vp9_decodeframe.c", "vp9/decoder/vp9_decodemv.c", "vp9/decoder/vp9_decoder.c", "vp9/decoder/vp9_detokenize.c", "vp9/decoder/vp9_dsubexp.c", "vp9/decoder/vp9_dthread.c", "vpx/src/vpx_codec.c", "vpx/src/vpx_decoder.c", "vpx/src/vpx_image.c", "vpx/src/vpx_psnr.c", "vpx_dsp/bitreader.c", "vpx_dsp/bitreader_buffer.c", "vpx_dsp/intrapred.c", "vpx_dsp/inv_txfm.c", "vpx_dsp/loopfilter.c", "vpx_dsp/prob.c", "vpx_dsp/vpx_convolve.c", "vpx_dsp/vpx_dsp_rtcd.c", "vpx_mem/vpx_mem.c", "vpx_scale/vpx_scale_rtcd.c", "vpx_scale/generic/yv12config.c", "vpx_scale/generic/yv12extend.c", "vpx_util/vpx_thread.c", ] libvpx_sources_mt = [ "vp8/decoder/threading.c", ] libvpx_sources_intrin_x86 = [ "vp8/common/x86/filter_x86.c", "vp8/common/x86/loopfilter_x86.c", "vp8/common/x86/vp8_asm_stubs.c", "vpx_dsp/x86/vpx_asm_stubs.c", ] libvpx_sources_intrin_x86_mmx = [ "vp8/common/x86/idct_blk_mmx.c", ] libvpx_sources_intrin_x86_sse2 = [ "vp8/common/x86/idct_blk_sse2.c", "vp9/common/x86/vp9_idct_intrin_sse2.c", "vpx_dsp/x86/inv_txfm_sse2.c", "vpx_dsp/x86/loopfilter_sse2.c", ] libvpx_sources_intrin_x86_ssse3 = ["vpx_dsp/x86/vpx_subpixel_8t_intrin_ssse3.c"] libvpx_sources_intrin_x86_avx2 = ["vpx_dsp/x86/loopfilter_avx2.c", "vpx_dsp/x86/vpx_subpixel_8t_intrin_avx2.c"] libvpx_sources_x86asm = [ "vp8/common/x86/copy_sse2.asm", "vp8/common/x86/copy_sse3.asm", "vp8/common/x86/dequantize_mmx.asm", "vp8/common/x86/idctllm_mmx.asm", "vp8/common/x86/idctllm_sse2.asm", "vp8/common/x86/iwalsh_mmx.asm", "vp8/common/x86/iwalsh_sse2.asm", "vp8/common/x86/loopfilter_sse2.asm", "vp8/common/x86/recon_mmx.asm", "vp8/common/x86/recon_sse2.asm", "vp8/common/x86/subpixel_mmx.asm", "vp8/common/x86/subpixel_sse2.asm", "vp8/common/x86/subpixel_ssse3.asm", "vp8/common/x86/vp8_loopfilter_mmx.asm", "vpx_dsp/x86/intrapred_sse2.asm", "vpx_dsp/x86/intrapred_ssse3.asm", "vpx_dsp/x86/inv_wht_sse2.asm", "vpx_dsp/x86/vpx_convolve_copy_sse2.asm", "vpx_dsp/x86/vpx_subpixel_8t_sse2.asm", "vpx_dsp/x86/vpx_subpixel_8t_ssse3.asm", "vpx_dsp/x86/vpx_subpixel_bilinear_sse2.asm", "vpx_dsp/x86/vpx_subpixel_bilinear_ssse3.asm", "vpx_ports/emms.asm", ] libvpx_sources_x86_64asm = ["vp8/common/x86/loopfilter_block_sse2_x86_64.asm", "vpx_dsp/x86/inv_txfm_ssse3_x86_64.asm"] libvpx_sources_arm = [ "vpx_ports/arm_cpudetect.c", "vp8/common/arm/loopfilter_arm.c", ] libvpx_sources_arm_neon = [ "vp8/common/arm/neon/bilinearpredict_neon.c", "vp8/common/arm/neon/copymem_neon.c", "vp8/common/arm/neon/dc_only_idct_add_neon.c", "vp8/common/arm/neon/dequant_idct_neon.c", "vp8/common/arm/neon/dequantizeb_neon.c", "vp8/common/arm/neon/idct_blk_neon.c", "vp8/common/arm/neon/idct_dequant_0_2x_neon.c", "vp8/common/arm/neon/idct_dequant_full_2x_neon.c", "vp8/common/arm/neon/iwalsh_neon.c", "vp8/common/arm/neon/loopfiltersimplehorizontaledge_neon.c", "vp8/common/arm/neon/loopfiltersimpleverticaledge_neon.c", "vp8/common/arm/neon/mbloopfilter_neon.c", "vp8/common/arm/neon/shortidct4x4llm_neon.c", "vp8/common/arm/neon/sixtappredict_neon.c", "vp8/common/arm/neon/vp8_loopfilter_neon.c", "vp9/common/arm/neon/vp9_iht4x4_add_neon.c", "vp9/common/arm/neon/vp9_iht8x8_add_neon.c", "vpx_dsp/arm/idct16x16_1_add_neon.c", "vpx_dsp/arm/idct16x16_add_neon.c", "vpx_dsp/arm/idct16x16_neon.c", "vpx_dsp/arm/idct32x32_1_add_neon.c", "vpx_dsp/arm/idct32x32_add_neon.c", "vpx_dsp/arm/idct4x4_1_add_neon.c", "vpx_dsp/arm/idct4x4_add_neon.c", "vpx_dsp/arm/idct8x8_1_add_neon.c", "vpx_dsp/arm/idct8x8_add_neon.c", "vpx_dsp/arm/intrapred_neon.c", "vpx_dsp/arm/loopfilter_16_neon.c", "vpx_dsp/arm/loopfilter_4_neon.c", "vpx_dsp/arm/loopfilter_8_neon.c", "vpx_dsp/arm/loopfilter_neon.c", "vpx_dsp/arm/vpx_convolve8_avg_neon.c", "vpx_dsp/arm/vpx_convolve8_neon.c", "vpx_dsp/arm/vpx_convolve_avg_neon.c", "vpx_dsp/arm/vpx_convolve_copy_neon.c", "vpx_dsp/arm/vpx_convolve_neon.c", ] libvpx_sources_arm_neon_gas = [ "vpx_dsp/arm/gas/intrapred_neon_asm.s", "vpx_dsp/arm/gas/loopfilter_mb_neon.s", "vpx_dsp/arm/gas/save_reg_neon.s", ] libvpx_sources_arm_neon_armasm_ms = [ "vpx_dsp/arm/armasm_ms/intrapred_neon_asm.asm", "vpx_dsp/arm/armasm_ms/loopfilter_mb_neon.asm", "vpx_dsp/arm/armasm_ms/save_reg_neon.asm", ] libvpx_sources_arm_neon_gas_apple = [ "vpx_dsp/arm/gas_apple/intrapred_neon_asm.s", "vpx_dsp/arm/gas_apple/loopfilter_mb_neon.s", "vpx_dsp/arm/gas_apple/save_reg_neon.s", ] libvpx_sources = [libvpx_dir + file for file in libvpx_sources] libvpx_sources_mt = [libvpx_dir + file for file in libvpx_sources_mt] libvpx_sources_intrin_x86 = [libvpx_dir + file for file in libvpx_sources_intrin_x86] libvpx_sources_intrin_x86_mmx = [libvpx_dir + file for file in libvpx_sources_intrin_x86_mmx] libvpx_sources_intrin_x86_sse2 = [libvpx_dir + file for file in libvpx_sources_intrin_x86_sse2] libvpx_sources_intrin_x86_ssse3 = [libvpx_dir + file for file in libvpx_sources_intrin_x86_ssse3] libvpx_sources_intrin_x86_avx2 = [libvpx_dir + file for file in libvpx_sources_intrin_x86_avx2] libvpx_sources_x86asm = [libvpx_dir + file for file in libvpx_sources_x86asm] libvpx_sources_x86_64asm = [libvpx_dir + file for file in libvpx_sources_x86_64asm] libvpx_sources_arm = [libvpx_dir + file for file in libvpx_sources_arm] libvpx_sources_arm_neon = [libvpx_dir + file for file in libvpx_sources_arm_neon] libvpx_sources_arm_neon_gas = [libvpx_dir + file for file in libvpx_sources_arm_neon_gas] libvpx_sources_arm_neon_armasm_ms = [libvpx_dir + file for file in libvpx_sources_arm_neon_armasm_ms] libvpx_sources_arm_neon_gas_apple = [libvpx_dir + file for file in libvpx_sources_arm_neon_gas_apple] env_libvpx = env_modules.Clone() env_libvpx.disable_warnings() env_libvpx.Prepend(CPPPATH=[libvpx_dir]) webm_multithread = env["platform"] != "javascript" cpu_bits = env["bits"] webm_cpu_x86 = False webm_cpu_arm = False if env["platform"] == "uwp": if "arm" in env["PROGSUFFIX"]: webm_cpu_arm = True else: webm_cpu_x86 = True elif env["platform"] != "windows": # Disable for Windows, yasm SIMD optimizations trigger crash (GH-50862). import platform is_x11_or_server_arm = (env["platform"] == "x11" or env["platform"] == "server") and ( platform.machine().startswith("arm") or platform.machine().startswith("aarch") ) is_macos_x86 = env["platform"] == "osx" and ("arch" in env and (env["arch"] != "arm64")) is_ios_x86 = env["platform"] == "iphone" and ("arch" in env and env["arch"].startswith("x86")) is_android_x86 = env["platform"] == "android" and env["android_arch"].startswith("x86") if is_android_x86: cpu_bits = "32" if env["android_arch"] == "x86" else "64" webm_cpu_x86 = ( not is_x11_or_server_arm and (cpu_bits == "32" or cpu_bits == "64") and ( env["platform"] == "windows" or env["platform"] == "x11" or env["platform"] == "haiku" or is_macos_x86 or is_android_x86 or is_ios_x86 ) ) webm_cpu_arm = ( is_x11_or_server_arm or (not is_macos_x86 and env["platform"] == "osx") or (not is_ios_x86 and env["platform"] == "iphone") or (not is_android_x86 and env["platform"] == "android") ) if webm_cpu_x86: import subprocess import os yasm_paths = [ "yasm", "../../../yasm", ] yasm_found = False devnull = open(os.devnull) for yasm_path in yasm_paths: try: yasm_found = True subprocess.Popen([yasm_path, "--version"], stdout=devnull, stderr=devnull).communicate() except Exception: yasm_found = False if yasm_found: break if not yasm_found: webm_cpu_x86 = False print("YASM is necessary for WebM SIMD optimizations.") webm_simd_optimizations = False if webm_cpu_x86: if env["platform"] == "windows" or env["platform"] == "uwp": env_libvpx["ASFORMAT"] = "win" elif env["platform"] == "osx" or env["platform"] == "iphone": env_libvpx["ASFORMAT"] = "macho" else: env_libvpx["ASFORMAT"] = "elf" env_libvpx["ASFORMAT"] += cpu_bits env_libvpx["AS"] = "yasm" env_libvpx["ASFLAGS"] = "-I" + libvpx_dir[1:] + " -f $ASFORMAT -D $ASCPU" env_libvpx["ASCOM"] = "$AS $ASFLAGS -o $TARGET $SOURCES" if cpu_bits == "32": env_libvpx["ASCPU"] = "X86_32" elif cpu_bits == "64": env_libvpx["ASCPU"] = "X86_64" env_libvpx.Append(CPPDEFINES=["WEBM_X86ASM"]) webm_simd_optimizations = True if webm_cpu_arm: if env["platform"] == "iphone": env_libvpx["ASFLAGS"] = "-arch armv7" elif ( env["platform"] == "android" and env["android_arch"] == "armv7" or env["platform"] == "x11" or env["platform"] == "server" ): env_libvpx["ASFLAGS"] += "-mfpu=neon" elif env["platform"] == "uwp": env_libvpx["AS"] = "armasm" env_libvpx["ASFLAGS"] = "" env_libvpx["ASCOM"] = "$AS $ASFLAGS -o $TARGET $SOURCES" env_libvpx.Append(CPPDEFINES=["WEBM_ARMASM"]) webm_simd_optimizations = True if webm_simd_optimizations == False and env["platform"] != "windows": print("WebM SIMD optimizations are disabled. Check if your CPU architecture, CPU bits or platform are supported!") env_libvpx.add_source_files(env.modules_sources, libvpx_sources) if webm_multithread: env_libvpx.add_source_files(env.modules_sources, libvpx_sources_mt) if webm_cpu_x86: is_clang_or_gcc = ( ("gcc" in os.path.basename(env["CC"])) or ("clang" in os.path.basename(env["CC"])) or ("osxcross" in env) ) env_libvpx_mmx = env_libvpx.Clone() if cpu_bits == "32" and is_clang_or_gcc: env_libvpx_mmx.Append(CCFLAGS=["-mmmx"]) env_libvpx_mmx.add_source_files(env.modules_sources, libvpx_sources_intrin_x86_mmx) env_libvpx_sse2 = env_libvpx.Clone() if cpu_bits == "32" and is_clang_or_gcc: env_libvpx_sse2.Append(CCFLAGS=["-msse2"]) env_libvpx_sse2.add_source_files(env.modules_sources, libvpx_sources_intrin_x86_sse2) env_libvpx_ssse3 = env_libvpx.Clone() if is_clang_or_gcc: env_libvpx_ssse3.Append(CCFLAGS=["-mssse3"]) env_libvpx_ssse3.add_source_files(env.modules_sources, libvpx_sources_intrin_x86_ssse3) env_libvpx_avx2 = env_libvpx.Clone() if is_clang_or_gcc: env_libvpx_avx2.Append(CCFLAGS=["-mavx2"]) env_libvpx_avx2.add_source_files(env.modules_sources, libvpx_sources_intrin_x86_avx2) env_libvpx.add_source_files(env.modules_sources, libvpx_sources_intrin_x86) env_libvpx.add_source_files(env.modules_sources, libvpx_sources_x86asm) if cpu_bits == "64": env_libvpx.add_source_files(env.modules_sources, libvpx_sources_x86_64asm) elif webm_cpu_arm: env_libvpx.add_source_files(env.modules_sources, libvpx_sources_arm) if env["platform"] == "android": env_libvpx.Prepend(CPPPATH=[libvpx_dir + "third_party/android"]) env_libvpx.add_source_files(env.modules_sources, [libvpx_dir + "third_party/android/cpu-features.c"]) env_libvpx_neon = env_libvpx.Clone() env_libvpx_neon.add_source_files(env.modules_sources, libvpx_sources_arm_neon) if env["platform"] == "uwp": env_libvpx.add_source_files(env.modules_sources, libvpx_sources_arm_neon_armasm_ms) elif env["platform"] == "iphone": env_libvpx.add_source_files(env.modules_sources, libvpx_sources_arm_neon_gas_apple) elif (is_x11_or_server_arm and cpu_bits == "32") or ( env["platform"] == "android" and not env["android_arch"] == "arm64v8" ): env_libvpx.add_source_files(env.modules_sources, libvpx_sources_arm_neon_gas)