1*4e366538SXin Li# Copyright 2014 The LibYuv Project Authors. All rights reserved. 2*4e366538SXin Li# 3*4e366538SXin Li# Use of this source code is governed by a BSD-style license 4*4e366538SXin Li# that can be found in the LICENSE file in the root of the source 5*4e366538SXin Li# tree. An additional intellectual property rights grant can be found 6*4e366538SXin Li# in the file PATENTS. All contributing project authors may 7*4e366538SXin Li# be found in the AUTHORS file in the root of the source tree. 8*4e366538SXin Li 9*4e366538SXin Liimport("//build/config/features.gni") 10*4e366538SXin Liimport("//testing/test.gni") 11*4e366538SXin Liimport("libyuv.gni") 12*4e366538SXin Li 13*4e366538SXin Lideclare_args() { 14*4e366538SXin Li # Set to false to disable building with absl flags. 15*4e366538SXin Li libyuv_use_absl_flags = true 16*4e366538SXin Li 17*4e366538SXin Li # When building a shared library using a target in WebRTC or 18*4e366538SXin Li # Chromium projects that depends on libyuv, setting this flag 19*4e366538SXin Li # to true makes libyuv symbols visible inside that library. 20*4e366538SXin Li libyuv_symbols_visible = false 21*4e366538SXin Li} 22*4e366538SXin Li 23*4e366538SXin Liconfig("libyuv_config") { 24*4e366538SXin Li include_dirs = [ "include" ] 25*4e366538SXin Li if (is_android) { 26*4e366538SXin Li if (target_cpu == "arm" || target_cpu == "x86" || target_cpu == "mipsel") { 27*4e366538SXin Li ldflags = [ "-Wl,--dynamic-linker,/system/bin/linker" ] 28*4e366538SXin Li } else { 29*4e366538SXin Li ldflags = [ "-Wl,--dynamic-linker,/system/bin/linker64" ] 30*4e366538SXin Li } 31*4e366538SXin Li } 32*4e366538SXin Li defines = [] 33*4e366538SXin Li if (!libyuv_use_neon) { 34*4e366538SXin Li defines += [ "LIBYUV_DISABLE_NEON" ] 35*4e366538SXin Li } 36*4e366538SXin Li if (libyuv_disable_rvv) { 37*4e366538SXin Li defines += [ "LIBYUV_DISABLE_RVV" ] 38*4e366538SXin Li } 39*4e366538SXin Li if (!libyuv_use_lsx) { 40*4e366538SXin Li defines += [ "LIBYUV_DISABLE_LSX" ] 41*4e366538SXin Li } 42*4e366538SXin Li if (!libyuv_use_lasx) { 43*4e366538SXin Li defines += [ "LIBYUV_DISABLE_LASX" ] 44*4e366538SXin Li } 45*4e366538SXin Li} 46*4e366538SXin Li 47*4e366538SXin Li# This target is built when no specific target is specified on the command line. 48*4e366538SXin Ligroup("default") { 49*4e366538SXin Li testonly = true 50*4e366538SXin Li deps = [ ":libyuv" ] 51*4e366538SXin Li if (libyuv_include_tests) { 52*4e366538SXin Li deps += [ 53*4e366538SXin Li ":compare", 54*4e366538SXin Li ":cpuid", 55*4e366538SXin Li ":i444tonv12_eg", 56*4e366538SXin Li ":libyuv_unittest", 57*4e366538SXin Li ":psnr", 58*4e366538SXin Li ":yuvconstants", 59*4e366538SXin Li ":yuvconvert", 60*4e366538SXin Li ] 61*4e366538SXin Li } 62*4e366538SXin Li} 63*4e366538SXin Li 64*4e366538SXin Ligroup("libyuv") { 65*4e366538SXin Li all_dependent_configs = [ ":libyuv_config" ] 66*4e366538SXin Li deps = [] 67*4e366538SXin Li 68*4e366538SXin Li if (is_win && target_cpu == "x64") { 69*4e366538SXin Li # Compile with clang in order to get inline assembly 70*4e366538SXin Li public_deps = [ ":libyuv_internal(//build/toolchain/win:win_clang_x64)" ] 71*4e366538SXin Li } else { 72*4e366538SXin Li public_deps = [ ":libyuv_internal" ] 73*4e366538SXin Li } 74*4e366538SXin Li 75*4e366538SXin Li if (libyuv_use_neon) { 76*4e366538SXin Li deps += [ ":libyuv_neon" ] 77*4e366538SXin Li } 78*4e366538SXin Li 79*4e366538SXin Li if (libyuv_use_msa) { 80*4e366538SXin Li deps += [ ":libyuv_msa" ] 81*4e366538SXin Li } 82*4e366538SXin Li 83*4e366538SXin Li if (libyuv_use_lsx) { 84*4e366538SXin Li deps += [ ":libyuv_lsx" ] 85*4e366538SXin Li } 86*4e366538SXin Li 87*4e366538SXin Li if (libyuv_use_lasx) { 88*4e366538SXin Li deps += [ ":libyuv_lasx" ] 89*4e366538SXin Li } 90*4e366538SXin Li 91*4e366538SXin Li if (!is_ios && !libyuv_disable_jpeg) { 92*4e366538SXin Li # Make sure that clients of libyuv link with libjpeg. This can't go in 93*4e366538SXin Li # libyuv_internal because in Windows x64 builds that will generate a clang 94*4e366538SXin Li # build of libjpeg, and we don't want two copies. 95*4e366538SXin Li deps += [ "//third_party:jpeg" ] 96*4e366538SXin Li } 97*4e366538SXin Li} 98*4e366538SXin Li 99*4e366538SXin Listatic_library("libyuv_internal") { 100*4e366538SXin Li visibility = [ ":*" ] 101*4e366538SXin Li 102*4e366538SXin Li sources = [ 103*4e366538SXin Li # Headers 104*4e366538SXin Li "include/libyuv.h", 105*4e366538SXin Li "include/libyuv/basic_types.h", 106*4e366538SXin Li "include/libyuv/compare.h", 107*4e366538SXin Li "include/libyuv/convert.h", 108*4e366538SXin Li "include/libyuv/convert_argb.h", 109*4e366538SXin Li "include/libyuv/convert_from.h", 110*4e366538SXin Li "include/libyuv/convert_from_argb.h", 111*4e366538SXin Li "include/libyuv/cpu_id.h", 112*4e366538SXin Li "include/libyuv/mjpeg_decoder.h", 113*4e366538SXin Li "include/libyuv/planar_functions.h", 114*4e366538SXin Li "include/libyuv/rotate.h", 115*4e366538SXin Li "include/libyuv/rotate_argb.h", 116*4e366538SXin Li "include/libyuv/rotate_row.h", 117*4e366538SXin Li "include/libyuv/row.h", 118*4e366538SXin Li "include/libyuv/scale.h", 119*4e366538SXin Li "include/libyuv/scale_argb.h", 120*4e366538SXin Li "include/libyuv/scale_rgb.h", 121*4e366538SXin Li "include/libyuv/scale_row.h", 122*4e366538SXin Li "include/libyuv/scale_uv.h", 123*4e366538SXin Li "include/libyuv/version.h", 124*4e366538SXin Li "include/libyuv/video_common.h", 125*4e366538SXin Li 126*4e366538SXin Li # Source Files 127*4e366538SXin Li "source/compare.cc", 128*4e366538SXin Li "source/compare_common.cc", 129*4e366538SXin Li "source/compare_gcc.cc", 130*4e366538SXin Li "source/compare_win.cc", 131*4e366538SXin Li "source/convert.cc", 132*4e366538SXin Li "source/convert_argb.cc", 133*4e366538SXin Li "source/convert_from.cc", 134*4e366538SXin Li "source/convert_from_argb.cc", 135*4e366538SXin Li "source/convert_jpeg.cc", 136*4e366538SXin Li "source/convert_to_argb.cc", 137*4e366538SXin Li "source/convert_to_i420.cc", 138*4e366538SXin Li "source/cpu_id.cc", 139*4e366538SXin Li "source/mjpeg_decoder.cc", 140*4e366538SXin Li "source/mjpeg_validate.cc", 141*4e366538SXin Li "source/planar_functions.cc", 142*4e366538SXin Li "source/rotate.cc", 143*4e366538SXin Li "source/rotate_any.cc", 144*4e366538SXin Li "source/rotate_argb.cc", 145*4e366538SXin Li "source/rotate_common.cc", 146*4e366538SXin Li "source/rotate_gcc.cc", 147*4e366538SXin Li "source/rotate_win.cc", 148*4e366538SXin Li "source/row_any.cc", 149*4e366538SXin Li "source/row_common.cc", 150*4e366538SXin Li "source/row_gcc.cc", 151*4e366538SXin Li "source/row_rvv.cc", 152*4e366538SXin Li "source/row_win.cc", 153*4e366538SXin Li "source/scale.cc", 154*4e366538SXin Li "source/scale_any.cc", 155*4e366538SXin Li "source/scale_argb.cc", 156*4e366538SXin Li "source/scale_common.cc", 157*4e366538SXin Li "source/scale_gcc.cc", 158*4e366538SXin Li "source/scale_rgb.cc", 159*4e366538SXin Li "source/scale_rvv.cc", 160*4e366538SXin Li "source/scale_uv.cc", 161*4e366538SXin Li "source/scale_win.cc", 162*4e366538SXin Li "source/video_common.cc", 163*4e366538SXin Li ] 164*4e366538SXin Li 165*4e366538SXin Li configs += [ ":libyuv_config" ] 166*4e366538SXin Li defines = [] 167*4e366538SXin Li deps = [] 168*4e366538SXin Li 169*4e366538SXin Li if (libyuv_symbols_visible) { 170*4e366538SXin Li configs -= [ "//build/config/gcc:symbol_visibility_hidden" ] 171*4e366538SXin Li configs += [ "//build/config/gcc:symbol_visibility_default" ] 172*4e366538SXin Li } 173*4e366538SXin Li 174*4e366538SXin Li if ((!is_ios || use_blink) && !libyuv_disable_jpeg) { 175*4e366538SXin Li defines += [ "HAVE_JPEG" ] 176*4e366538SXin Li 177*4e366538SXin Li # Needed to pull in libjpeg headers. Can't add //third_party:jpeg to deps 178*4e366538SXin Li # because in Windows x64 build it will get compiled with clang. 179*4e366538SXin Li deps += [ "//third_party:jpeg_includes" ] 180*4e366538SXin Li } 181*4e366538SXin Li 182*4e366538SXin Li # Always enable optimization for Release and NaCl builds (to workaround 183*4e366538SXin Li # crbug.com/538243). 184*4e366538SXin Li if (!is_debug || is_nacl) { 185*4e366538SXin Li configs -= [ "//build/config/compiler:default_optimization" ] 186*4e366538SXin Li 187*4e366538SXin Li # Enable optimize for speed (-O2) over size (-Os). 188*4e366538SXin Li configs += [ "//build/config/compiler:optimize_max" ] 189*4e366538SXin Li } 190*4e366538SXin Li 191*4e366538SXin Li # To enable AVX2 or other cpu optimization, pass flag here 192*4e366538SXin Li if (!is_win) { 193*4e366538SXin Li cflags = [ 194*4e366538SXin Li # "-mpopcnt", 195*4e366538SXin Li # "-mavx2", 196*4e366538SXin Li # "-mfma", 197*4e366538SXin Li "-ffp-contract=fast", # Enable fma vectorization for NEON. 198*4e366538SXin Li ] 199*4e366538SXin Li } 200*4e366538SXin Li} 201*4e366538SXin Li 202*4e366538SXin Liif (libyuv_use_neon) { 203*4e366538SXin Li static_library("libyuv_neon") { 204*4e366538SXin Li sources = [ 205*4e366538SXin Li # ARM Source Files 206*4e366538SXin Li "source/compare_neon.cc", 207*4e366538SXin Li "source/compare_neon64.cc", 208*4e366538SXin Li "source/rotate_neon.cc", 209*4e366538SXin Li "source/rotate_neon64.cc", 210*4e366538SXin Li "source/row_neon.cc", 211*4e366538SXin Li "source/row_neon64.cc", 212*4e366538SXin Li "source/scale_neon.cc", 213*4e366538SXin Li "source/scale_neon64.cc", 214*4e366538SXin Li ] 215*4e366538SXin Li 216*4e366538SXin Li deps = [ ":libyuv_internal" ] 217*4e366538SXin Li 218*4e366538SXin Li public_configs = [ ":libyuv_config" ] 219*4e366538SXin Li 220*4e366538SXin Li # Always enable optimization for Release and NaCl builds (to workaround 221*4e366538SXin Li # crbug.com/538243). 222*4e366538SXin Li if (!is_debug) { 223*4e366538SXin Li configs -= [ "//build/config/compiler:default_optimization" ] 224*4e366538SXin Li 225*4e366538SXin Li # Enable optimize for speed (-O2) over size (-Os). 226*4e366538SXin Li # TODO(fbarchard): Consider optimize_speed which is O3. 227*4e366538SXin Li configs += [ "//build/config/compiler:optimize_max" ] 228*4e366538SXin Li } 229*4e366538SXin Li 230*4e366538SXin Li if (current_cpu != "arm64") { 231*4e366538SXin Li configs -= [ "//build/config/compiler:compiler_arm_fpu" ] 232*4e366538SXin Li cflags = [ "-mfpu=neon" ] 233*4e366538SXin Li } 234*4e366538SXin Li } 235*4e366538SXin Li} 236*4e366538SXin Li 237*4e366538SXin Liif (libyuv_use_msa) { 238*4e366538SXin Li static_library("libyuv_msa") { 239*4e366538SXin Li sources = [ 240*4e366538SXin Li # MSA Source Files 241*4e366538SXin Li "source/compare_msa.cc", 242*4e366538SXin Li "source/rotate_msa.cc", 243*4e366538SXin Li "source/row_msa.cc", 244*4e366538SXin Li "source/scale_msa.cc", 245*4e366538SXin Li ] 246*4e366538SXin Li 247*4e366538SXin Li deps = [ ":libyuv_internal" ] 248*4e366538SXin Li 249*4e366538SXin Li public_configs = [ ":libyuv_config" ] 250*4e366538SXin Li } 251*4e366538SXin Li} 252*4e366538SXin Li 253*4e366538SXin Liif (libyuv_use_lsx) { 254*4e366538SXin Li static_library("libyuv_lsx") { 255*4e366538SXin Li sources = [ 256*4e366538SXin Li # LSX Source Files 257*4e366538SXin Li "source/rotate_lsx.cc", 258*4e366538SXin Li "source/row_lsx.cc", 259*4e366538SXin Li "source/scale_lsx.cc", 260*4e366538SXin Li ] 261*4e366538SXin Li 262*4e366538SXin Li cflags_cc = [ 263*4e366538SXin Li "-mlsx", 264*4e366538SXin Li "-Wno-c++11-narrowing", 265*4e366538SXin Li ] 266*4e366538SXin Li 267*4e366538SXin Li deps = [ ":libyuv_internal" ] 268*4e366538SXin Li 269*4e366538SXin Li public_configs = [ ":libyuv_config" ] 270*4e366538SXin Li } 271*4e366538SXin Li} 272*4e366538SXin Li 273*4e366538SXin Liif (libyuv_use_lasx) { 274*4e366538SXin Li static_library("libyuv_lasx") { 275*4e366538SXin Li sources = [ 276*4e366538SXin Li # LASX Source Files 277*4e366538SXin Li "source/row_lasx.cc", 278*4e366538SXin Li ] 279*4e366538SXin Li 280*4e366538SXin Li cflags_cc = [ 281*4e366538SXin Li "-mlasx", 282*4e366538SXin Li "-Wno-c++11-narrowing", 283*4e366538SXin Li ] 284*4e366538SXin Li 285*4e366538SXin Li deps = [ ":libyuv_internal" ] 286*4e366538SXin Li 287*4e366538SXin Li public_configs = [ ":libyuv_config" ] 288*4e366538SXin Li } 289*4e366538SXin Li} 290*4e366538SXin Li 291*4e366538SXin Liif (libyuv_include_tests) { 292*4e366538SXin Li config("libyuv_unittest_warnings_config") { 293*4e366538SXin Li if (!is_win) { 294*4e366538SXin Li cflags = [ 295*4e366538SXin Li # TODO(fbarchard): Fix sign and unused variable warnings. 296*4e366538SXin Li "-Wno-sign-compare", 297*4e366538SXin Li "-Wno-unused-variable", 298*4e366538SXin Li ] 299*4e366538SXin Li } 300*4e366538SXin Li if (is_win) { 301*4e366538SXin Li cflags = [ 302*4e366538SXin Li "/wd4245", # signed/unsigned mismatch 303*4e366538SXin Li "/wd4189", # local variable is initialized but not referenced 304*4e366538SXin Li ] 305*4e366538SXin Li } 306*4e366538SXin Li } 307*4e366538SXin Li config("libyuv_unittest_config") { 308*4e366538SXin Li defines = [ "GTEST_RELATIVE_PATH" ] 309*4e366538SXin Li } 310*4e366538SXin Li 311*4e366538SXin Li test("libyuv_unittest") { 312*4e366538SXin Li testonly = true 313*4e366538SXin Li 314*4e366538SXin Li sources = [ 315*4e366538SXin Li "unit_test/basictypes_test.cc", 316*4e366538SXin Li "unit_test/color_test.cc", 317*4e366538SXin Li "unit_test/compare_test.cc", 318*4e366538SXin Li "unit_test/convert_argb_test.cc", 319*4e366538SXin Li "unit_test/convert_test.cc", 320*4e366538SXin Li "unit_test/cpu_test.cc", 321*4e366538SXin Li "unit_test/cpu_thread_test.cc", 322*4e366538SXin Li "unit_test/math_test.cc", 323*4e366538SXin Li "unit_test/planar_test.cc", 324*4e366538SXin Li "unit_test/rotate_argb_test.cc", 325*4e366538SXin Li "unit_test/rotate_test.cc", 326*4e366538SXin Li "unit_test/scale_argb_test.cc", 327*4e366538SXin Li "unit_test/scale_plane_test.cc", 328*4e366538SXin Li "unit_test/scale_rgb_test.cc", 329*4e366538SXin Li "unit_test/scale_test.cc", 330*4e366538SXin Li "unit_test/scale_uv_test.cc", 331*4e366538SXin Li "unit_test/unit_test.cc", 332*4e366538SXin Li "unit_test/unit_test.h", 333*4e366538SXin Li "unit_test/video_common_test.cc", 334*4e366538SXin Li ] 335*4e366538SXin Li 336*4e366538SXin Li deps = [ 337*4e366538SXin Li ":libyuv", 338*4e366538SXin Li "//testing/gtest", 339*4e366538SXin Li ] 340*4e366538SXin Li 341*4e366538SXin Li defines = [] 342*4e366538SXin Li if (libyuv_use_absl_flags) { 343*4e366538SXin Li defines += [ "LIBYUV_USE_ABSL_FLAGS" ] 344*4e366538SXin Li deps += [ 345*4e366538SXin Li "//third_party/abseil-cpp/absl/flags:flag", 346*4e366538SXin Li "//third_party/abseil-cpp/absl/flags:parse", 347*4e366538SXin Li ] 348*4e366538SXin Li } 349*4e366538SXin Li 350*4e366538SXin Li configs += [ ":libyuv_unittest_warnings_config" ] 351*4e366538SXin Li 352*4e366538SXin Li public_deps = [ "//testing/gtest" ] 353*4e366538SXin Li public_configs = [ ":libyuv_unittest_config" ] 354*4e366538SXin Li 355*4e366538SXin Li if (is_linux || is_chromeos) { 356*4e366538SXin Li cflags = [ "-fexceptions" ] 357*4e366538SXin Li } 358*4e366538SXin Li if (is_ios) { 359*4e366538SXin Li configs -= [ "//build/config/compiler:default_symbols" ] 360*4e366538SXin Li configs += [ "//build/config/compiler:symbols" ] 361*4e366538SXin Li cflags = [ "-Wno-sometimes-uninitialized" ] 362*4e366538SXin Li } 363*4e366538SXin Li if (!is_ios && !libyuv_disable_jpeg) { 364*4e366538SXin Li defines += [ "HAVE_JPEG" ] 365*4e366538SXin Li } 366*4e366538SXin Li if (is_android) { 367*4e366538SXin Li deps += [ "//testing/android/native_test:native_test_native_code" ] 368*4e366538SXin Li } 369*4e366538SXin Li 370*4e366538SXin Li # TODO(YangZhang): These lines can be removed when high accuracy 371*4e366538SXin Li # YUV to RGB to Neon is ported. 372*4e366538SXin Li if ((target_cpu == "armv7" || target_cpu == "armv7s" || 373*4e366538SXin Li (target_cpu == "arm" && arm_version >= 7) || target_cpu == "arm64") && 374*4e366538SXin Li (arm_use_neon || arm_optionally_use_neon)) { 375*4e366538SXin Li defines += [ "LIBYUV_NEON" ] 376*4e366538SXin Li } 377*4e366538SXin Li 378*4e366538SXin Li defines += [ 379*4e366538SXin Li # Enable the following 3 macros to turn off assembly for specified CPU. 380*4e366538SXin Li # "LIBYUV_DISABLE_X86", 381*4e366538SXin Li # "LIBYUV_DISABLE_NEON", 382*4e366538SXin Li # Enable the following macro to build libyuv as a shared library (dll). 383*4e366538SXin Li # "LIBYUV_USING_SHARED_LIBRARY" 384*4e366538SXin Li ] 385*4e366538SXin Li } 386*4e366538SXin Li 387*4e366538SXin Li executable("compare") { 388*4e366538SXin Li sources = [ 389*4e366538SXin Li # sources 390*4e366538SXin Li "util/compare.cc", 391*4e366538SXin Li ] 392*4e366538SXin Li deps = [ ":libyuv" ] 393*4e366538SXin Li if (is_linux || is_chromeos) { 394*4e366538SXin Li cflags = [ "-fexceptions" ] 395*4e366538SXin Li } 396*4e366538SXin Li } 397*4e366538SXin Li 398*4e366538SXin Li executable("yuvconvert") { 399*4e366538SXin Li sources = [ 400*4e366538SXin Li # sources 401*4e366538SXin Li "util/yuvconvert.cc", 402*4e366538SXin Li ] 403*4e366538SXin Li deps = [ ":libyuv" ] 404*4e366538SXin Li if (is_linux || is_chromeos) { 405*4e366538SXin Li cflags = [ "-fexceptions" ] 406*4e366538SXin Li } 407*4e366538SXin Li } 408*4e366538SXin Li 409*4e366538SXin Li executable("yuvconstants") { 410*4e366538SXin Li sources = [ 411*4e366538SXin Li # sources 412*4e366538SXin Li "util/yuvconstants.c", 413*4e366538SXin Li ] 414*4e366538SXin Li deps = [ ":libyuv" ] 415*4e366538SXin Li if (is_linux || is_chromeos) { 416*4e366538SXin Li cflags = [ "-fexceptions" ] 417*4e366538SXin Li } 418*4e366538SXin Li } 419*4e366538SXin Li 420*4e366538SXin Li executable("psnr") { 421*4e366538SXin Li sources = [ 422*4e366538SXin Li # sources 423*4e366538SXin Li "util/psnr.cc", 424*4e366538SXin Li "util/psnr_main.cc", 425*4e366538SXin Li "util/ssim.cc", 426*4e366538SXin Li ] 427*4e366538SXin Li deps = [ ":libyuv" ] 428*4e366538SXin Li 429*4e366538SXin Li if (!is_ios && !libyuv_disable_jpeg) { 430*4e366538SXin Li defines = [ "HAVE_JPEG" ] 431*4e366538SXin Li } 432*4e366538SXin Li } 433*4e366538SXin Li 434*4e366538SXin Li executable("i444tonv12_eg") { 435*4e366538SXin Li sources = [ 436*4e366538SXin Li # sources 437*4e366538SXin Li "util/i444tonv12_eg.cc", 438*4e366538SXin Li ] 439*4e366538SXin Li deps = [ ":libyuv" ] 440*4e366538SXin Li } 441*4e366538SXin Li 442*4e366538SXin Li executable("cpuid") { 443*4e366538SXin Li sources = [ 444*4e366538SXin Li # sources 445*4e366538SXin Li "util/cpuid.c", 446*4e366538SXin Li ] 447*4e366538SXin Li deps = [ ":libyuv" ] 448*4e366538SXin Li } 449*4e366538SXin Li} 450