1*4e366538SXin Li# Getting Started 2*4e366538SXin Li 3*4e366538SXin LiHow to get and build the libyuv code. 4*4e366538SXin Li 5*4e366538SXin Li## Pre-requisites 6*4e366538SXin Li 7*4e366538SXin LiYou'll need to have depot tools installed: https://www.chromium.org/developers/how-tos/install-depot-tools 8*4e366538SXin LiRefer to chromium instructions for each platform for other prerequisites. 9*4e366538SXin Li 10*4e366538SXin Li## Getting the Code 11*4e366538SXin Li 12*4e366538SXin LiCreate a working directory, enter it, and run: 13*4e366538SXin Li 14*4e366538SXin Li gclient config --name src https://chromium.googlesource.com/libyuv/libyuv 15*4e366538SXin Li gclient sync 16*4e366538SXin Li 17*4e366538SXin LiThen you'll get a .gclient file like: 18*4e366538SXin Li 19*4e366538SXin Li solutions = [ 20*4e366538SXin Li { "name" : "src", 21*4e366538SXin Li "url" : "https://chromium.googlesource.com/libyuv/libyuv", 22*4e366538SXin Li "deps_file" : "DEPS", 23*4e366538SXin Li "managed" : True, 24*4e366538SXin Li "custom_deps" : { 25*4e366538SXin Li }, 26*4e366538SXin Li "safesync_url": "", 27*4e366538SXin Li }, 28*4e366538SXin Li ]; 29*4e366538SXin Li 30*4e366538SXin LiFor iOS add `;target_os=['ios'];` to your OSX .gclient and run `gclient sync.` 31*4e366538SXin Li 32*4e366538SXin LiBrowse the Git reprository: https://chromium.googlesource.com/libyuv/libyuv/+/master 33*4e366538SXin Li 34*4e366538SXin Li### Android 35*4e366538SXin LiFor Android add `;target_os=['android'];` to your Linux .gclient 36*4e366538SXin Li 37*4e366538SXin Li solutions = [ 38*4e366538SXin Li { "name" : "src", 39*4e366538SXin Li "url" : "https://chromium.googlesource.com/libyuv/libyuv", 40*4e366538SXin Li "deps_file" : "DEPS", 41*4e366538SXin Li "managed" : True, 42*4e366538SXin Li "custom_deps" : { 43*4e366538SXin Li }, 44*4e366538SXin Li "safesync_url": "", 45*4e366538SXin Li }, 46*4e366538SXin Li ]; 47*4e366538SXin Li target_os = ["android", "linux"]; 48*4e366538SXin Li 49*4e366538SXin LiThen run: 50*4e366538SXin Li 51*4e366538SXin Li gclient sync 52*4e366538SXin Li 53*4e366538SXin LiTo get just the source (not buildable): 54*4e366538SXin Li 55*4e366538SXin Li git clone https://chromium.googlesource.com/libyuv/libyuv 56*4e366538SXin Li 57*4e366538SXin Li 58*4e366538SXin Li## Building the Library and Unittests 59*4e366538SXin Li 60*4e366538SXin Li### Windows 61*4e366538SXin Li 62*4e366538SXin Li call gn gen out\Release "--args=is_debug=false target_cpu=\"x64\"" 63*4e366538SXin Li call gn gen out\Debug "--args=is_debug=true target_cpu=\"x64\"" 64*4e366538SXin Li ninja -v -C out\Release 65*4e366538SXin Li ninja -v -C out\Debug 66*4e366538SXin Li 67*4e366538SXin Li call gn gen out\Release "--args=is_debug=false target_cpu=\"x86\"" 68*4e366538SXin Li call gn gen out\Debug "--args=is_debug=true target_cpu=\"x86\"" 69*4e366538SXin Li ninja -v -C out\Release 70*4e366538SXin Li ninja -v -C out\Debug 71*4e366538SXin Li 72*4e366538SXin Li### macOS and Linux 73*4e366538SXin Li 74*4e366538SXin Li gn gen out/Release "--args=is_debug=false" 75*4e366538SXin Li gn gen out/Debug "--args=is_debug=true" 76*4e366538SXin Li ninja -v -C out/Release 77*4e366538SXin Li ninja -v -C out/Debug 78*4e366538SXin Li 79*4e366538SXin Li### Building Offical with GN 80*4e366538SXin Li 81*4e366538SXin Li gn gen out/Official "--args=is_debug=false is_official_build=true is_chrome_branded=true" 82*4e366538SXin Li ninja -C out/Official 83*4e366538SXin Li 84*4e366538SXin Li### iOS 85*4e366538SXin Lihttp://www.chromium.org/developers/how-tos/build-instructions-ios 86*4e366538SXin Li 87*4e366538SXin LiAdd to .gclient last line: `target_os=['ios'];` 88*4e366538SXin Li 89*4e366538SXin Liarm64 90*4e366538SXin Li 91*4e366538SXin Li gn gen out/Release "--args=is_debug=false target_os=\"ios\" ios_enable_code_signing=false target_cpu=\"arm64\"" 92*4e366538SXin Li gn gen out/Debug "--args=is_debug=true target_os=\"ios\" ios_enable_code_signing=false target_cpu=\"arm64\"" 93*4e366538SXin Li ninja -v -C out/Debug libyuv_unittest 94*4e366538SXin Li ninja -v -C out/Release libyuv_unittest 95*4e366538SXin Li 96*4e366538SXin Liios simulator 97*4e366538SXin Li 98*4e366538SXin Li gn gen out/Release "--args=is_debug=false target_os=\"ios\" ios_enable_code_signing=false use_xcode_clang=true target_cpu=\"x86\"" 99*4e366538SXin Li gn gen out/Debug "--args=is_debug=true target_os=\"ios\" ios_enable_code_signing=false use_xcode_clang=true target_cpu=\"x86\"" 100*4e366538SXin Li ninja -v -C out/Debug libyuv_unittest 101*4e366538SXin Li ninja -v -C out/Release libyuv_unittest 102*4e366538SXin Li 103*4e366538SXin Liios disassembly 104*4e366538SXin Li 105*4e366538SXin Li otool -tV ./out/Release/obj/libyuv_neon/row_neon64.o >row_neon64.txt 106*4e366538SXin Li 107*4e366538SXin Li### Android 108*4e366538SXin Lihttps://code.google.com/p/chromium/wiki/AndroidBuildInstructions 109*4e366538SXin Li 110*4e366538SXin LiAdd to .gclient last line: `target_os=['android'];` 111*4e366538SXin Li 112*4e366538SXin Liarm64 113*4e366538SXin Li 114*4e366538SXin Li gn gen out/Release "--args=is_debug=false target_os=\"android\" target_cpu=\"arm64\"" 115*4e366538SXin Li gn gen out/Debug "--args=is_debug=true target_os=\"android\" target_cpu=\"arm64\"" 116*4e366538SXin Li ninja -v -C out/Debug libyuv_unittest 117*4e366538SXin Li ninja -v -C out/Release libyuv_unittest 118*4e366538SXin Li 119*4e366538SXin Liarmv7 120*4e366538SXin Li 121*4e366538SXin Li gn gen out/Release "--args=is_debug=false target_os=\"android\" target_cpu=\"arm\"" 122*4e366538SXin Li gn gen out/Debug "--args=is_debug=true target_os=\"android\" target_cpu=\"arm\"" 123*4e366538SXin Li ninja -v -C out/Debug libyuv_unittest 124*4e366538SXin Li ninja -v -C out/Release libyuv_unittest 125*4e366538SXin Li 126*4e366538SXin Liia32 127*4e366538SXin Li 128*4e366538SXin Li gn gen out/Release "--args=is_debug=false target_os=\"android\" target_cpu=\"x86\"" 129*4e366538SXin Li gn gen out/Debug "--args=is_debug=true target_os=\"android\" target_cpu=\"x86\"" 130*4e366538SXin Li ninja -v -C out/Debug libyuv_unittest 131*4e366538SXin Li ninja -v -C out/Release libyuv_unittest 132*4e366538SXin Li 133*4e366538SXin Limips 134*4e366538SXin Li 135*4e366538SXin Li gn gen out/Release "--args=is_debug=false target_os=\"android\" target_cpu=\"mips64el\" mips_arch_variant=\"r6\" mips_use_msa=true is_component_build=true" 136*4e366538SXin Li gn gen out/Debug "--args=is_debug=true target_os=\"android\" target_cpu=\"mips64el\" mips_arch_variant=\"r6\" mips_use_msa=true is_component_build=true" 137*4e366538SXin Li ninja -v -C out/Debug libyuv_unittest 138*4e366538SXin Li ninja -v -C out/Release libyuv_unittest 139*4e366538SXin Li 140*4e366538SXin Liarm disassembly: 141*4e366538SXin Li 142*4e366538SXin Li llvm-objdump -d ./out/Release/obj/libyuv/row_common.o >row_common.txt 143*4e366538SXin Li 144*4e366538SXin Li llvm-objdump -d ./out/Release/obj/libyuv_neon/row_neon.o >row_neon.txt 145*4e366538SXin Li 146*4e366538SXin Li llvm-objdump -d ./out/Release/obj/libyuv_neon/row_neon64.o >row_neon64.txt 147*4e366538SXin Li 148*4e366538SXin Li Caveat: Disassembly may require optimize_max be disabled in BUILD.gn 149*4e366538SXin Li 150*4e366538SXin LiRunning tests: 151*4e366538SXin Li 152*4e366538SXin Li out/Release/bin/run_libyuv_unittest -vv --gtest_filter=* 153*4e366538SXin Li 154*4e366538SXin LiRunning test as benchmark: 155*4e366538SXin Li 156*4e366538SXin Li out/Release/bin/run_libyuv_unittest -vv --gtest_filter=* --libyuv_width=1280 --libyuv_height=720 --libyuv_repeat=999 --libyuv_flags=-1 --libyuv_cpu_info=-1 157*4e366538SXin Li 158*4e366538SXin LiRunning test with C code: 159*4e366538SXin Li 160*4e366538SXin Li out/Release/bin/run_libyuv_unittest -vv --gtest_filter=* --libyuv_width=1280 --libyuv_height=720 --libyuv_repeat=999 --libyuv_flags=1 --libyuv_cpu_info=1 161*4e366538SXin Li 162*4e366538SXin Li### Build targets 163*4e366538SXin Li 164*4e366538SXin Li ninja -C out/Debug libyuv 165*4e366538SXin Li ninja -C out/Debug libyuv_unittest 166*4e366538SXin Li ninja -C out/Debug compare 167*4e366538SXin Li ninja -C out/Debug yuvconvert 168*4e366538SXin Li ninja -C out/Debug yuvconstants 169*4e366538SXin Li ninja -C out/Debug psnr 170*4e366538SXin Li ninja -C out/Debug cpuid 171*4e366538SXin Li 172*4e366538SXin Li### ARM Linux 173*4e366538SXin Li 174*4e366538SXin Li gn gen out/Release "--args=is_debug=false target_cpu=\"arm64\"" 175*4e366538SXin Li gn gen out/Debug "--args=is_debug=true target_cpu=\"arm64\"" 176*4e366538SXin Li ninja -v -C out/Debug libyuv_unittest 177*4e366538SXin Li ninja -v -C out/Release libyuv_unittest 178*4e366538SXin Li 179*4e366538SXin Li### MIPS Linux 180*4e366538SXin Li 181*4e366538SXin Limips 182*4e366538SXin Li 183*4e366538SXin Li gn gen out/Release "--args=is_debug=false target_os=\"linux\" target_cpu=\"mips64el\" mips_arch_variant=\"loongson3\" is_component_build=false use_sysroot=false use_gold=false" 184*4e366538SXin Li gn gen out/Debug "--args=is_debug=true target_os=\"linux\" target_cpu=\"mips64el\" mips_arch_variant=\"loongson3\" is_component_build=false use_sysroot=false use_gold=false" 185*4e366538SXin Li ninja -v -C out/Debug libyuv_unittest 186*4e366538SXin Li ninja -v -C out/Release libyuv_unittest 187*4e366538SXin Li 188*4e366538SXin Li## Building the Library with make 189*4e366538SXin Li 190*4e366538SXin Li### Linux 191*4e366538SXin Li 192*4e366538SXin Li make V=1 -f linux.mk 193*4e366538SXin Li make V=1 -f linux.mk clean 194*4e366538SXin Li make V=1 -f linux.mk CXX=clang++ CC=clang 195*4e366538SXin Li 196*4e366538SXin Li## Building the library with cmake 197*4e366538SXin Li 198*4e366538SXin LiInstall cmake: http://www.cmake.org/ 199*4e366538SXin Li 200*4e366538SXin Li### Default debug build: 201*4e366538SXin Li 202*4e366538SXin Li mkdir out 203*4e366538SXin Li cd out 204*4e366538SXin Li cmake .. 205*4e366538SXin Li cmake --build . 206*4e366538SXin Li 207*4e366538SXin Li### Release build/install 208*4e366538SXin Li 209*4e366538SXin Li mkdir out 210*4e366538SXin Li cd out 211*4e366538SXin Li cmake -DCMAKE_INSTALL_PREFIX="/usr/lib" -DCMAKE_BUILD_TYPE="Release" .. 212*4e366538SXin Li cmake --build . --config Release 213*4e366538SXin Li sudo cmake --build . --target install --config Release 214*4e366538SXin Li 215*4e366538SXin Li### Build RPM/DEB packages 216*4e366538SXin Li 217*4e366538SXin Li mkdir out 218*4e366538SXin Li cd out 219*4e366538SXin Li cmake -DCMAKE_BUILD_TYPE=Release .. 220*4e366538SXin Li make -j4 221*4e366538SXin Li make package 222*4e366538SXin Li 223*4e366538SXin Li## Building RISC-V target with cmake 224*4e366538SXin Li 225*4e366538SXin Li### Prerequisite: build risc-v clang toolchain and qemu 226*4e366538SXin Li 227*4e366538SXin LiIf you don't have prebuilt clang and riscv64 qemu, run the script to download source and build them. 228*4e366538SXin Li 229*4e366538SXin Li ./riscv_script/prepare_toolchain_qemu.sh 230*4e366538SXin Li 231*4e366538SXin LiAfter running script, clang & qemu are built in `build-toolchain-qemu/riscv-clang/` & `build-toolchain-qemu/riscv-qemu/`. 232*4e366538SXin Li 233*4e366538SXin Li### Cross-compile for RISC-V target 234*4e366538SXin Li cmake -B out/Release/ -DUNIT_TEST=ON \ 235*4e366538SXin Li -DCMAKE_BUILD_TYPE=Release \ 236*4e366538SXin Li -DCMAKE_TOOLCHAIN_FILE="./riscv_script/riscv-clang.cmake" \ 237*4e366538SXin Li -DTOOLCHAIN_PATH={TOOLCHAIN_PATH} \ 238*4e366538SXin Li -DUSE_RVV=ON . 239*4e366538SXin Li cmake --build out/Release/ 240*4e366538SXin Li 241*4e366538SXin Li#### Customized Compiler Flags 242*4e366538SXin Li 243*4e366538SXin LiCustomized compiler flags are supported by `-DRISCV_COMPILER_FLAGS="xxx"`. 244*4e366538SXin LiIf `-DRISCV_COMPILER_FLAGS="xxx"` is manually assigned, other compile flags(e.g disable -march=xxx) will not be appended. 245*4e366538SXin Li 246*4e366538SXin LiExample: 247*4e366538SXin Li 248*4e366538SXin Li cmake -B out/Release/ -DUNIT_TEST=ON \ 249*4e366538SXin Li -DCMAKE_BUILD_TYPE=Release \ 250*4e366538SXin Li -DCMAKE_TOOLCHAIN_FILE="./riscv_script/riscv-clang.cmake" \ 251*4e366538SXin Li -DRISCV_COMPILER_FLAGS="-mcpu=sifive-x280" \ 252*4e366538SXin Li . 253*4e366538SXin Li 254*4e366538SXin Li### Run on QEMU 255*4e366538SXin Li 256*4e366538SXin Li#### Run libyuv_unittest on QEMU 257*4e366538SXin Li cd out/Release/ 258*4e366538SXin Li USE_RVV=ON \ 259*4e366538SXin Li TOOLCHAIN_PATH={TOOLCHAIN_PATH} \ 260*4e366538SXin Li QEMU_PREFIX_PATH={QEMU_PREFIX_PATH} \ 261*4e366538SXin Li ../../riscv_script/run_qemu.sh libyuv_unittest 262*4e366538SXin Li 263*4e366538SXin Li 264*4e366538SXin Li## Setup for Arm Cross compile 265*4e366538SXin Li 266*4e366538SXin LiSee also https://www.ccoderun.ca/programming/2015-12-20_CrossCompiling/index.html 267*4e366538SXin Li 268*4e366538SXin Li sudo apt-get install ssh dkms build-essential linux-headers-generic 269*4e366538SXin Li sudo apt-get install kdevelop cmake git subversion 270*4e366538SXin Li sudo apt-get install graphviz doxygen doxygen-gui 271*4e366538SXin Li sudo apt-get install manpages manpages-dev manpages-posix manpages-posix-dev 272*4e366538SXin Li sudo apt-get install libboost-all-dev libboost-dev libssl-dev 273*4e366538SXin Li sudo apt-get install rpm terminator fish 274*4e366538SXin Li sudo apt-get install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf 275*4e366538SXin Li 276*4e366538SXin Li### Build psnr tool 277*4e366538SXin Li 278*4e366538SXin Li cd util 279*4e366538SXin Li arm-linux-gnueabihf-g++ psnr_main.cc psnr.cc ssim.cc -o psnr 280*4e366538SXin Li arm-linux-gnueabihf-objdump -d psnr 281*4e366538SXin Li 282*4e366538SXin Li## Running Unittests 283*4e366538SXin Li 284*4e366538SXin Li### Windows 285*4e366538SXin Li 286*4e366538SXin Li out\Release\libyuv_unittest.exe --gtest_catch_exceptions=0 --gtest_filter="*" 287*4e366538SXin Li 288*4e366538SXin Li### macOS and Linux 289*4e366538SXin Li 290*4e366538SXin Li out/Release/libyuv_unittest --gtest_filter="*" 291*4e366538SXin Li 292*4e366538SXin LiReplace --gtest_filter="*" with specific unittest to run. May include wildcards. 293*4e366538SXin Li out/Release/libyuv_unittest --gtest_filter=*I420ToARGB_Opt 294*4e366538SXin Li 295*4e366538SXin Li## CPU Emulator tools 296*4e366538SXin Li 297*4e366538SXin Li### Intel SDE (Software Development Emulator) 298*4e366538SXin Li 299*4e366538SXin LiPre-requisite: Install IntelSDE: http://software.intel.com/en-us/articles/intel-software-development-emulator 300*4e366538SXin Li 301*4e366538SXin LiThen run: 302*4e366538SXin Li 303*4e366538SXin Li c:\intelsde\sde -hsw -- out\Release\libyuv_unittest.exe --gtest_filter=* 304*4e366538SXin Li 305*4e366538SXin Li ~/intelsde/sde -skx -- out/Release/libyuv_unittest --gtest_filter=**I420ToARGB_Opt 306*4e366538SXin Li 307*4e366538SXin Li### Intel Architecture Code Analyzer 308*4e366538SXin Li 309*4e366538SXin LiInset these 2 macros into assembly code to be analyzed: 310*4e366538SXin Li IACA_ASM_START 311*4e366538SXin Li IACA_ASM_END 312*4e366538SXin LiBuild the code as usual, then run iaca on the object file. 313*4e366538SXin Li ~/iaca-lin64/bin/iaca.sh -reduceout -arch HSW out/Release/obj/libyuv_internal/compare_gcc.o 314*4e366538SXin Li 315*4e366538SXin Li## Sanitizers 316*4e366538SXin Li 317*4e366538SXin Li gn gen out/Release "--args=is_debug=false is_msan=true" 318*4e366538SXin Li ninja -v -C out/Release 319*4e366538SXin Li 320*4e366538SXin LiSanitizers available: asan, msan, tsan, ubsan, lsan, ubsan_vptr 321*4e366538SXin Li 322*4e366538SXin Li### Running Dr Memory memcheck for Windows 323*4e366538SXin Li 324*4e366538SXin LiPre-requisite: Install Dr Memory for Windows and add it to your path: http://www.drmemory.org/docs/page_install_windows.html 325*4e366538SXin Li 326*4e366538SXin Li drmemory out\Debug\libyuv_unittest.exe --gtest_catch_exceptions=0 --gtest_filter=* 327