xref: /aosp_15_r20/external/libyuv/docs/getting_started.md (revision 4e366538070a3a6c5c163c31b791eab742e1657a)
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