blob: a04f9e97c3562311c18a76d7c1317a9d28a09e63 [file] [log] [blame]
agsantos5aa39652020-08-11 18:18:04 -04001#! /bin/bash
2# Build the plugin for the project
agsantos82678f32020-12-09 15:03:24 -05003set -e
agsantosac1940d2020-09-17 10:18:40 -04004export OSTYPE
5ARCH=$(arch)
agsantos1e7736c2020-10-28 14:39:13 -04006EXTRAPATH=''
agsantosac1940d2020-09-17 10:18:40 -04007# Flags:
8
9 # -p: number of processors to use
10 # -c: Runtime plugin cpu/gpu setting.
11 # -t: target platform.
12
agsantosac1940d2020-09-17 10:18:40 -040013if [ -z "${DAEMON}" ]; then
agsantos5aa39652020-08-11 18:18:04 -040014 DAEMON="./../../daemon"
agsantosac1940d2020-09-17 10:18:40 -040015 echo "DAEMON not provided, building with ${DAEMON}"
agsantos5aa39652020-08-11 18:18:04 -040016fi
agsantos796b5af2020-12-22 19:38:27 -050017if [ -z "${PROCESSOR}" ]; then
18 PROCESSOR="CPU"
19 echo "PROCESSOR not provided, building with ${PROCESSOR}"
20fi
agsantos5aa39652020-08-11 18:18:04 -040021
22PLUGIN_NAME="GreenScreen"
agsantosac1940d2020-09-17 10:18:40 -040023JPL_FILE_NAME="${PLUGIN_NAME}.jpl"
24SO_FILE_NAME="lib${PLUGIN_NAME}.so"
agsantos5aa39652020-08-11 18:18:04 -040025DAEMON_SRC="${DAEMON}/src"
26CONTRIB_PATH="${DAEMON}/contrib"
agsantos5aa39652020-08-11 18:18:04 -040027PLUGINS_LIB="../lib"
agsantosac1940d2020-09-17 10:18:40 -040028LIBS_DIR="./../contrib/Libs"
agsantos2c8525e2021-03-19 11:18:01 -040029PREFERENCESFILENAME="preferences"
agsantosac1940d2020-09-17 10:18:40 -040030
agsantos796b5af2020-12-22 19:38:27 -050031if [ "${PROCESSOR}" = "CPU" ]; then
32 ONNX_LIBS="cpu"
33elif [ "${PROCESSOR}" = "NVIDIA" ]; then
34 ONNX_LIBS="nvidia-gpu"
35 CUBLASLT="-lcublasLt"
agsantos2c8525e2021-03-19 11:18:01 -040036 PREFERENCESFILENAME="${PREFERENCESFILENAME}-accel"
agsantosac1940d2020-09-17 10:18:40 -040037fi
agsantosac1940d2020-09-17 10:18:40 -040038
39PLATFORM="linux-gnu"
agsantosac1940d2020-09-17 10:18:40 -040040
41while getopts t:c:p OPT; do
42 case "$OPT" in
43 t)
44 PLATFORM="${OPTARG}"
agsantos796b5af2020-12-22 19:38:27 -050045 if [ ${PLATFORM} = "android" ]; then
46 ONNX_LIBS=""
agsantosac1940d2020-09-17 10:18:40 -040047 fi
48 ;;
49 c)
agsantosac1940d2020-09-17 10:18:40 -040050 ;;
51 p)
52 ;;
53 \?)
54 exit 1
55 ;;
56 esac
57done
agsantos5aa39652020-08-11 18:18:04 -040058
agsantosdd6a62a2021-03-29 17:13:27 -040059cp -r ffmpeg ${CONTRIB_PATH}/src/
60
agsantos796b5af2020-12-22 19:38:27 -050061if [ "${PLATFORM}" = "linux-gnu" ]
agsantosac1940d2020-09-17 10:18:40 -040062then
agsantosdd6a62a2021-03-29 17:13:27 -040063 if [ -f "${CONTRIB_PATH}/native/.ffmpeg" ]; then
64 rm "${CONTRIB_PATH}/native/.ffmpeg"
65 fi
66 WORKPATH=$(pwd)
67 cd "${CONTRIB_PATH}/native/"
68 make .ffmpeg -j$(nproc)
69 rm .ffmpeg
70 cd ${WORKPATH}
71 python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME}
agsantos1e7736c2020-10-28 14:39:13 -040072
agsantosac1940d2020-09-17 10:18:40 -040073 CONTRIB_PLATFORM_CURT=${ARCH}
74 CONTRIB_PLATFORM=${CONTRIB_PLATFORM_CURT}-${PLATFORM}
agsantos796b5af2020-12-22 19:38:27 -050075 ONNX_PATH=${EXTRALIBS_PATH}
76 if [ -z "${EXTRALIBS_PATH}" ]
77 then
78 ONNX_PATH="${CONTRIB_PATH}/${CONTRIB_PLATFORM}"
79 fi
agsantosac1940d2020-09-17 10:18:40 -040080
81 # Compile
82 clang++ -std=c++17 -shared -fPIC \
83 -Wl,-Bsymbolic,-rpath,"\${ORIGIN}" \
84 -Wall -Wextra \
85 -Wno-unused-variable \
86 -Wno-unused-function \
87 -Wno-unused-parameter \
agsantos796b5af2020-12-22 19:38:27 -050088 -D${PROCESSOR} \
agsantosac1940d2020-09-17 10:18:40 -040089 -I"." \
90 -I"${DAEMON_SRC}" \
91 -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include" \
92 -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include/opencv4" \
agsantos796b5af2020-12-22 19:38:27 -050093 -I"${ONNX_PATH}/include/onnxruntime/session" \
94 -I"${ONNX_PATH}/include/onnxruntime/providers/cuda" \
agsantosac1940d2020-09-17 10:18:40 -040095 -I"${PLUGINS_LIB}" \
agsantos1e7736c2020-10-28 14:39:13 -040096 ./../lib/accel.cpp \
agsantosc9181b42020-11-26 12:03:04 -050097 ./../lib/frameUtils.cpp \
agsantosdd6a62a2021-03-29 17:13:27 -040098 ./../lib/frameFilter.cpp \
agsantosac1940d2020-09-17 10:18:40 -040099 main.cpp \
100 videoSubscriber.cpp \
agsantosac1940d2020-09-17 10:18:40 -0400101 pluginMediaHandler.cpp \
agsantos796b5af2020-12-22 19:38:27 -0500102 pluginProcessor.cpp \
agsantosac1940d2020-09-17 10:18:40 -0400103 -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/lib/" \
104 -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/lib/opencv4/3rdparty/" \
agsantos796b5af2020-12-22 19:38:27 -0500105 -L"${ONNX_PATH}/lib/onnxruntime/${ONNX_LIBS}" \
106 -L"${CUDA_HOME}/lib64/" \
agsantosdd6a62a2021-03-29 17:13:27 -0400107 -l:libavfilter.a \
agsantosf7e04bd2020-10-14 15:59:47 -0400108 -l:libswscale.a \
agsantosdd6a62a2021-03-29 17:13:27 -0400109 -l:libavformat.a \
110 -l:libavcodec.a \
agsantosf7e04bd2020-10-14 15:59:47 -0400111 -l:libavutil.a \
agsantosdd6a62a2021-03-29 17:13:27 -0400112 -l:libvpx.a \
113 -l:libx264.a \
agsantosac1940d2020-09-17 10:18:40 -0400114 -lopencv_imgproc \
115 -lopencv_core \
agsantos796b5af2020-12-22 19:38:27 -0500116 -lva ${CUBLASLT} \
117 -lonnxruntime \
agsantos1e7736c2020-10-28 14:39:13 -0400118 -o "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
agsantosac1940d2020-09-17 10:18:40 -0400119
agsantosac1940d2020-09-17 10:18:40 -0400120
agsantos796b5af2020-12-22 19:38:27 -0500121 cp "${ONNX_PATH}/lib/onnxruntime/${ONNX_LIBS}/libonnxruntime.so" "build-local/jpl/lib/$CONTRIB_PLATFORM/libonnxruntime.so.1.6.0"
122 if [ "${PROCESSOR}" = "NVIDIA" ]
agsantosac1940d2020-09-17 10:18:40 -0400123 then
agsantos796b5af2020-12-22 19:38:27 -0500124 cp "${CUDA_HOME}/lib64/libcudart.so.10.2.89" "build-local/jpl/lib/$CONTRIB_PLATFORM/libcudart.so.10.2"
125 cp "${CUDA_HOME}/lib64/libcublas.so.10.2.3.254" "build-local/jpl/lib/$CONTRIB_PLATFORM/libcublas.so.10"
126 cp "${CUDA_HOME}/lib64/libcufft.so.10.1.2.89" "build-local/jpl/lib/$CONTRIB_PLATFORM/libcufft.so.10"
127 cp "${CUDA_HOME}/lib64/libcurand.so.10.1.2.89" "build-local/jpl/lib/$CONTRIB_PLATFORM/libcurand.so.10"
128 cp "${CUDA_HOME}/lib64/libcublasLt.so.10.2.3.254" "build-local/jpl/lib/$CONTRIB_PLATFORM/libcublasLt.so.10"
129 cp "${CUDNN_HOME}/libcudnn.so.8" "build-local/jpl/lib/$CONTRIB_PLATFORM/libcudnn.so.8"
130 cp "${CUDNN_HOME}/libcudnn_ops_infer.so.8" "build-local/jpl/lib/$CONTRIB_PLATFORM/libcudnn_ops_infer.so.8"
131 fi
agsantos1e7736c2020-10-28 14:39:13 -0400132
agsantos796b5af2020-12-22 19:38:27 -0500133 mkdir "./build-local/jpl/data/model"
134 cp "./modelSRC/mModel.onnx" "./build-local/jpl/data/model/mModel.onnx"
agsantos2c8525e2021-03-19 11:18:01 -0400135 cp "./${PREFERENCESFILENAME}.json" "./build-local/jpl/data/preferences.json"
agsantosac1940d2020-09-17 10:18:40 -0400136
agsantos796b5af2020-12-22 19:38:27 -0500137elif [ "${PLATFORM}" = "android" ]
138then
139 python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
140
141 if [ -z "$ANDROID_NDK" ]; then
142 ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
143 echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
144 fi
145
146 #=========================================================
147 # Check if the ANDROID_ABI was provided
148 # if not, set default
149 #=========================================================
150 if [ -z "$ANDROID_ABI" ]; then
151 ANDROID_ABI="armeabi-v7a arm64-v8a x86_64"
152 echo "ANDROID_ABI not provided, building for ${ANDROID_ABI}"
153 fi
154
155 buildlib() {
156 echo "$CURRENT_ABI"
157
158 #=========================================================
159 # ANDROID TOOLS
160 #=========================================================
161 export HOST_TAG=linux-x86_64
162 export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/$HOST_TAG
163
164 if [ "$CURRENT_ABI" = armeabi-v7a ]
165 then
agsantos7ad7a3a2021-01-19 12:57:54 -0500166 export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
167 export AS=$TOOLCHAIN/bin/arm-linux-androideabi-as
agsantos796b5af2020-12-22 19:38:27 -0500168 export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
169 export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
agsantos7ad7a3a2021-01-19 12:57:54 -0500170 export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
171 export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
agsantos796b5af2020-12-22 19:38:27 -0500172 export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
173 export ANDROID_SYSROOT=${DAEMON}/../client-android/android-toolchain-21-arm/sysroot
174
175 elif [ "$CURRENT_ABI" = arm64-v8a ]
176 then
177 export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
178 export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
179 export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
180 export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
181 export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
182 export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
183 export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
184 export ANDROID_SYSROOT=${DAEMON}/../client-android/android-toolchain-21-arm64/sysroot
185
186 elif [ "$CURRENT_ABI" = x86_64 ]
187 then
188 export AR=$TOOLCHAIN/bin/x86_64-linux-android-ar
189 export AS=$TOOLCHAIN/bin/x86_64-linux-android-as
190 export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
191 export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
192 export LD=$TOOLCHAIN/bin/x86_64-linux-android-ld
193 export RANLIB=$TOOLCHAIN/bin/x86_64-linux-android-ranlib
194 export STRIP=$TOOLCHAIN/bin/x86_64-linux-android-strip
195 export ANDROID_SYSROOT=${DAEMON}/../client-android/android-toolchain-21-x86_64/sysroot
196
197 else
198 echo "ABI NOT OK" >&2
199 exit 1
200 fi
201
202 #=========================================================
203 # CONTRIBS
204 #=========================================================
205 if [ "$CURRENT_ABI" = armeabi-v7a ]
206 then
207 CONTRIB_PLATFORM=arm-linux-androideabi
208
209 elif [ "$CURRENT_ABI" = arm64-v8a ]
210 then
211 CONTRIB_PLATFORM=aarch64-linux-android
212
213 elif [ "$CURRENT_ABI" = x86_64 ]
214 then
215 CONTRIB_PLATFORM=x86_64-linux-android
216 fi
217
218 #NDK SOURCES FOR cpufeatures
219 NDK_SOURCES=${ANDROID_NDK}/sources/android
220
221 #=========================================================
222 # LD_FLAGS
223 #=========================================================
224 if [ "$CURRENT_ABI" = armeabi-v7a ]
225 then
226 export EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_SYSROOT}/usr/lib/arm-linux-androideabi -L${ANDROID_SYSROOT}/usr/lib/arm-linux-androideabi/21"
227 elif [ "$CURRENT_ABI" = arm64-v8a ]
228 then
229 export EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_SYSROOT}/usr/lib/aarch64-linux-android -L${ANDROID_SYSROOT}/usr/lib/aarch64-linux-android/21"
230 elif [ "$CURRENT_ABI" = x86_64 ]
231 then
232 export EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_SYSROOT}/usr/lib/x86_64-linux-android -L${ANDROID_SYSROOT}/usr/lib/x86_64-linux-android/21"
233 fi
234
agsantosdd6a62a2021-03-29 17:13:27 -0400235 if [ -f "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
236 rm "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg"
237 fi
238
239 WORKPATH=$(pwd)
240 cd "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/"
241 make .ffmpeg -j$(nproc)
242 rm .ffmpeg
243 cd ${WORKPATH}
244
agsantos796b5af2020-12-22 19:38:27 -0500245 #=========================================================
246 # Compile CPU FEATURES, NEEDED FOR OPENCV
247 #=========================================================
248 $CC -c "$NDK_SOURCES/cpufeatures/cpu-features.c" -o cpu-features.o -o cpu-features.o --sysroot=$ANDROID_SYSROOT
249
250 #=========================================================
251 # Compile the plugin
252 #=========================================================
253
254 ONNX_PATH="${EXTRALIBS_PATH}/${CURRENT_ABI}"
255 if [ -z ${EXTRALIBS_PATH} ]
256 then
257 ONNX_PATH="${CONTRIB_PATH}/${CONTRIB_PLATFORM}"
258 fi
259
260 # Create so destination folder
261 $CXX --std=c++17 -O3 -g -fPIC \
agsantosac1940d2020-09-17 10:18:40 -0400262 -Wl,-Bsymbolic,-rpath,"\${ORIGIN}" \
agsantos796b5af2020-12-22 19:38:27 -0500263 -shared \
agsantosac1940d2020-09-17 10:18:40 -0400264 -Wall -Wextra \
265 -Wno-unused-variable \
266 -Wno-unused-function \
267 -Wno-unused-parameter \
agsantos796b5af2020-12-22 19:38:27 -0500268 -DANDROID \
agsantosac1940d2020-09-17 10:18:40 -0400269 -I"." \
270 -I"${DAEMON_SRC}" \
271 -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include" \
272 -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include/opencv4" \
agsantos796b5af2020-12-22 19:38:27 -0500273 -I"${ONNX_PATH}/include/onnxruntime/session" \
274 -I"${ONNX_PATH}/include/onnxruntime/providers/nnapi" \
275 -I"${ONNX_PATH}/../include/onnxruntime/session" \
276 -I"${ONNX_PATH}/../include/onnxruntime/providers/nnapi" \
agsantosac1940d2020-09-17 10:18:40 -0400277 -I"${PLUGINS_LIB}" \
agsantos1e7736c2020-10-28 14:39:13 -0400278 ./../lib/accel.cpp \
agsantosc9181b42020-11-26 12:03:04 -0500279 ./../lib/frameUtils.cpp \
agsantosdd6a62a2021-03-29 17:13:27 -0400280 ./../lib/frameFilter.cpp \
agsantosc9181b42020-11-26 12:03:04 -0500281 main.cpp \
agsantos796b5af2020-12-22 19:38:27 -0500282 videoSubscriber.cpp \
283 pluginMediaHandler.cpp \
284 pluginProcessor.cpp \
285 cpu-features.o \
agsantosac1940d2020-09-17 10:18:40 -0400286 -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/lib/" \
agsantos796b5af2020-12-22 19:38:27 -0500287 -L"${ONNX_PATH}/lib/" \
agsantosdd6a62a2021-03-29 17:13:27 -0400288 -lavfilter \
agsantos796b5af2020-12-22 19:38:27 -0500289 -lswscale \
agsantosdd6a62a2021-03-29 17:13:27 -0400290 -lavformat \
291 -lavcodec \
agsantos796b5af2020-12-22 19:38:27 -0500292 -lavutil \
agsantosdd6a62a2021-03-29 17:13:27 -0400293 -lvpx \
294 -lx264 \
295 -lspeex \
296 -lopus \
297 -liconv \
agsantosac1940d2020-09-17 10:18:40 -0400298 -lopencv_imgproc \
299 -lopencv_core \
agsantos796b5af2020-12-22 19:38:27 -0500300 -llog -lz \
301 -lonnxruntime \
302 --sysroot=$ANDROID_SYSROOT \
303 -o "build-local/jpl/lib/$CURRENT_ABI/${SO_FILE_NAME}"
agsantosac1940d2020-09-17 10:18:40 -0400304
agsantos796b5af2020-12-22 19:38:27 -0500305 rm cpu-features.o
306 cp "${ONNX_PATH}/lib/libonnxruntime.so" "build-local/jpl/lib/${CURRENT_ABI}/libonnxruntime.so"
307 }
agsantosac1940d2020-09-17 10:18:40 -0400308
agsantos796b5af2020-12-22 19:38:27 -0500309 # Build the so
310 for i in ${ANDROID_ABI}; do
311 CURRENT_ABI=$i
312 buildlib
313 done
agsantosac1940d2020-09-17 10:18:40 -0400314
agsantos796b5af2020-12-22 19:38:27 -0500315 mkdir "./build-local/jpl/data/model"
316 cp "./modelSRC/mModel.ort" "./build-local/jpl/data/model/mModel.ort"
agsantos2c8525e2021-03-19 11:18:01 -0400317 cp "./${PREFERENCESFILENAME}-accel.json" "./build-local/jpl/data/preferences.json"
agsantosac1940d2020-09-17 10:18:40 -0400318fi
agsantos5aa39652020-08-11 18:18:04 -0400319
agsantos796b5af2020-12-22 19:38:27 -0500320python3 ./../SDK/jplManipulation.py --assemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM} --extraPath=${ONNX_LIBS}
agsantosdd6a62a2021-03-29 17:13:27 -0400321cd ${CONTRIB_PATH}/src/ffmpeg/
322# ffmpeg build configuration files were changed during plugin build
323# this git checkout will remove these changes
324git checkout -- .