blob: 544c39af2aab0f1955768758e92fbf80d309edc2 [file] [log] [blame]
agsantos4bb4bc52021-03-08 14:21:45 -05001#! /bin/bash
2# Build the plugin for the project
3set -e
4export OSTYPE
agsantos1bbc7cc2021-05-20 16:43:35 -04005ARCH=$(uname -m)
agsantos4bb4bc52021-03-08 14:21:45 -05006EXTRAPATH=''
7# Flags:
8
9# -p: number of processors to use
10# -c: Runtime plugin cpu/gpu setting.
11# -t: target platform.
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -030012# -d: debug program.
agsantos4bb4bc52021-03-08 14:21:45 -050013
14
15if [ -z "${DAEMON}" ]; then
16 DAEMON="./../../daemon"
17 echo "DAEMON not provided, building with ${DAEMON}"
18fi
19
20PLUGIN_NAME="WaterMark"
21JPL_FILE_NAME="${PLUGIN_NAME}.jpl"
22SO_FILE_NAME="lib${PLUGIN_NAME}.so"
23DAEMON_SRC="${DAEMON}/src"
24CONTRIB_PATH="${DAEMON}/contrib"
25PLUGINS_LIB="../lib"
26LIBS_DIR="./../contrib/Libs"
agsantos1bbc7cc2021-05-20 16:43:35 -040027PLATFORM=$(uname)
agsantos4bb4bc52021-03-08 14:21:45 -050028
agsantos1bbc7cc2021-05-20 16:43:35 -040029if [ "${PLATFORM}" = "Linux" ]; then
agsantos4bb4bc52021-03-08 14:21:45 -050030 PLATFORM="linux-gnu"
agsantos1bbc7cc2021-05-20 16:43:35 -040031 CONTRIB_PLATFORM_CURT=${ARCH}
32 echo "Building with ${PLATFORM}"
33elif [ "${PLATFORM}" = "Darwin" ]; then
34 PLATFORM="darwin"
35 SO_FILE_NAME="lib${PLUGIN_NAME}.dylib"
36 alias nproc="sysctl -n hw.logicalcpu"
37 CONTRIB_PLATFORM_CURT=${ARCH}-apple
38 CONTRIB_PLATFORM_EXTRA=$(uname -r)
39 echo "Building with ${PLATFORM}"
agsantos4bb4bc52021-03-08 14:21:45 -050040fi
41
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -030042while getopts t:c:p:d OPT; do
agsantos4bb4bc52021-03-08 14:21:45 -050043 case "$OPT" in
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -030044 d)
45 DEBUG=true
46 export __DEBUG__=true
47 ;;
agsantos4bb4bc52021-03-08 14:21:45 -050048 t)
49 PLATFORM="${OPTARG}"
50 ;;
51 c)
52 PROCESSOR="${OPTARG}"
53 ;;
54 p)
55 ;;
56 \?)
57 exit 1
58 ;;
59 esac
60done
61
62cp -r ffmpeg ${CONTRIB_PATH}/src/
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -030063cp -r ../contrib/rav1e ${CONTRIB_PATH}/src/
agsantos4bb4bc52021-03-08 14:21:45 -050064
65if [ "${PLATFORM}" = "linux-gnu" ] || [ "${PLATFORM}" = "redhat-linux" ]
66then
67 if [ -f "${CONTRIB_PATH}/native/.ffmpeg" ]; then
68 rm "${CONTRIB_PATH}/native/.ffmpeg"
69 fi
70 WORKPATH=$(pwd)
71 cd "${CONTRIB_PATH}/native/"
72 make .ffmpeg -j$(nproc)
73 rm .ffmpeg
74 cd ${WORKPATH}
75
agsantos4bb4bc52021-03-08 14:21:45 -050076 CONTRIB_PLATFORM=${CONTRIB_PLATFORM_CURT}-${PLATFORM}
77
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -030078 if [ ${DEBUG} ]; then
79 OUTPUT="${PLUGIN_NAME}"
80 CLANG_OPTS="-g -fsanitize=address"
81 EXTRA_DEBUG_LIBRARIES="-lyaml-cpp -lvdpau -lX11 -lva-drm -lva-x11 -lrav1e"
82 EXTRA_DEFINES="-D__DEBUG__"
83 else
84 python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME}
85 CLANG_OPTS="-O3 -shared"
86 OUTPUT="build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
87 fi
88
agsantos4bb4bc52021-03-08 14:21:45 -050089 # Compile
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -030090 clang++ -std=c++17 -fPIC ${CLANG_OPTS} \
agsantos4bb4bc52021-03-08 14:21:45 -050091 -Wl,-Bsymbolic,-rpath,"\${ORIGIN}" \
92 -Wall -Wextra \
agsantos4bb4bc52021-03-08 14:21:45 -050093 -Wno-unused-parameter \
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -030094 ${EXTRA_DEFINES} \
agsantos4bb4bc52021-03-08 14:21:45 -050095 -I"." \
96 -I"${DAEMON_SRC}" \
97 -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include" \
98 -I"${PLUGINS_LIB}" \
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -030099 ./../lib/common.cpp \
agsantos4bb4bc52021-03-08 14:21:45 -0500100 ./../lib/accel.cpp \
101 ./../lib/frameUtils.cpp \
102 ./../lib/frameFilter.cpp \
103 WatermarkVideoSubscriber.cpp \
104 main.cpp \
105 WatermarkMediaHandler.cpp \
agsantos3fcc6212021-08-18 17:11:29 -0300106 PluginPreferenceHandler.cpp \
agsantos4bb4bc52021-03-08 14:21:45 -0500107 -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/lib/" \
108 -l:libavfilter.a \
109 -l:libswscale.a \
110 -l:libavformat.a \
111 -l:libavcodec.a \
112 -l:libavutil.a \
113 -l:libvpx.a \
114 -l:libx264.a \
115 -lfreetype \
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -0300116 -lvpx \
117 -lx264 \
118 -lspeex \
119 -lopus \
120 -lz \
agsantos4bb4bc52021-03-08 14:21:45 -0500121 -lva \
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -0300122 ${EXTRA_DEBUG_LIBRARIES} \
123 -o "${OUTPUT}"
agsantos1bbc7cc2021-05-20 16:43:35 -0400124
125elif [ "${PLATFORM}" = "darwin" ]
126then
127 if [ -f "${CONTRIB_PATH}/native/.ffmpeg" ]; then
128 rm "${CONTRIB_PATH}/native/.ffmpeg"
129 fi
130 WORKPATH=$(pwd)
131 cd "${CONTRIB_PATH}/native"
132 make .ffmpeg -j$(nproc)
133 rm .ffmpeg
134 cd ${WORKPATH}
135
agsantos1bbc7cc2021-05-20 16:43:35 -0400136 CONTRIB_PLATFORM=${CONTRIB_PLATFORM_CURT}-${PLATFORM}
137
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -0300138 if [ ${DEBUG} ]; then
139 OUTPUT="${PLUGIN_NAME}"
140 CLANG_OPTS="-g -fsanitize=address"
141 EXTRA_DEBUG_LIBRARIES="-lyaml-cpp -lrav1e"
142 EXTRA_DEFINES="-D__DEBUG__"
143 else
144 python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME}
145 CLANG_OPTS="-O3 -shared"
146 OUTPUT="build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
147 fi
148
agsantos1bbc7cc2021-05-20 16:43:35 -0400149 # Compile
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -0300150 clang++ -std=c++17 -fPIC ${CLANG_OPTS} \
agsantos1bbc7cc2021-05-20 16:43:35 -0400151 -Wl,-no_compact_unwind -Wl,-framework,CoreFoundation \
152 -Wl,-framework,Security -Wl,-framework,VideoToolbox \
153 -Wl,-framework,CoreMedia -Wl,-framework,CoreVideo \
154 -Wl,-rpath,"\${ORIGIN}" \
155 -Wall -Wextra \
agsantos1bbc7cc2021-05-20 16:43:35 -0400156 -Wno-unused-parameter \
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -0300157 ${EXTRA_DEFINES} \
agsantos1bbc7cc2021-05-20 16:43:35 -0400158 -I"." \
159 -I"${DAEMON_SRC}" \
160 -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}/include" \
161 -I"${PLUGINS_LIB}" \
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -0300162 ./../lib/common.cpp \
agsantos1bbc7cc2021-05-20 16:43:35 -0400163 ./../lib/accel.cpp \
164 ./../lib/frameUtils.cpp \
165 ./../lib/frameFilter.cpp \
166 WatermarkVideoSubscriber.cpp \
167 main.cpp \
168 WatermarkMediaHandler.cpp \
agsantos3fcc6212021-08-18 17:11:29 -0300169 PluginPreferenceHandler.cpp \
agsantos1bbc7cc2021-05-20 16:43:35 -0400170 -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}${CONTRIB_PLATFORM_EXTRA}/lib/" \
171 -lavfilter \
172 -lswscale \
173 -lavformat \
174 -lavcodec \
175 -lavutil \
176 -lvpx -lx264 -lbz2 -liconv -lz \
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -0300177 -lspeex \
178 -lopus \
agsantos1bbc7cc2021-05-20 16:43:35 -0400179 "/usr/local/opt/libpng/lib/libpng.a" \
agsantos1bbc7cc2021-05-20 16:43:35 -0400180 "/usr/local/opt/freetype/lib/libfreetype.a" \
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -0300181 ${EXTRA_DEBUG_LIBRARIES} \
182 -o "${OUTPUT}"
agsantos1bbc7cc2021-05-20 16:43:35 -0400183
Aline Gondim Santosf0e761d2022-08-24 16:13:10 -0300184 if [ ! ${DEBUG} ]; then
185 install_name_tool -id "@loader_path/${PLUGIN_NAME}" "${OUTPUT}"
186 else
187 install_name_tool -id "@loader_path/${SO_FILE_NAME}" "${OUTPUT}"
188 fi
agsantos1bbc7cc2021-05-20 16:43:35 -0400189
190 if [ -n "${APPLE_SIGN_CERTIFICATE}" ]; then
191 codesign --force --verify --timestamp -o runtime --sign "${APPLE_SIGN_CERTIFICATE}" "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
192 ditto -c -k --rsrc "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}" "build-local/${SO_FILE_NAME}.zip"
193 LIBRARYNAME=${SO_FILE_NAME} sh ./../notarize.sh
194 ditto -x -k "build-local/${SO_FILE_NAME}.zip" "build-local/notarized"
195 cp "build-local/notarized/${SO_FILE_NAME}" "build-local/jpl/lib/${CONTRIB_PLATFORM}/${SO_FILE_NAME}"
196 fi
agsantos4bb4bc52021-03-08 14:21:45 -0500197
198elif [ "${PLATFORM}" = "android" ]
199then
200 python3 ./../SDK/jplManipulation.py --preassemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM}
201
202 if [ -z "$ANDROID_NDK" ]; then
203 ANDROID_NDK="/home/${USER}/Android/Sdk/ndk/21.1.6352462"
204 echo "ANDROID_NDK not provided, building with ${ANDROID_NDK}"
205 fi
206
207 #=========================================================
208 # Check if the ANDROID_ABI was provided
209 # if not, set default
210 #=========================================================
211 if [ -z "$ANDROID_ABI" ]; then
212 ANDROID_ABI="armeabi-v7a arm64-v8a x86_64"
213 echo "ANDROID_ABI not provided, building for ${ANDROID_ABI}"
214 fi
215
216 buildlib() {
217 echo "$CURRENT_ABI"
218
219 #=========================================================
220 # ANDROID TOOLS
221 #=========================================================
222 export HOST_TAG=linux-x86_64
223 export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/$HOST_TAG
224
225 if [ "$CURRENT_ABI" = armeabi-v7a ]
226 then
227 export AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar
228 export AS=$TOOLCHAIN/bin/arm-linux-androideabi-as
229 export CC=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang
230 export CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++
231 export LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld
232 export RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
233 export STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip
234 export ANDROID_SYSROOT=${DAEMON}/../client-android/android-toolchain-21-arm/sysroot
235
236 elif [ "$CURRENT_ABI" = arm64-v8a ]
237 then
238 export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
239 export AS=$TOOLCHAIN/bin/aarch64-linux-android-as
240 export CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
241 export CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
242 export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
243 export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
244 export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
245 export ANDROID_SYSROOT=${DAEMON}/../client-android/android-toolchain-21-arm64/sysroot
246
247 elif [ "$CURRENT_ABI" = x86_64 ]
248 then
249 export AR=$TOOLCHAIN/bin/x86_64-linux-android-ar
250 export AS=$TOOLCHAIN/bin/x86_64-linux-android-as
251 export CC=$TOOLCHAIN/bin/x86_64-linux-android21-clang
252 export CXX=$TOOLCHAIN/bin/x86_64-linux-android21-clang++
253 export LD=$TOOLCHAIN/bin/x86_64-linux-android-ld
254 export RANLIB=$TOOLCHAIN/bin/x86_64-linux-android-ranlib
255 export STRIP=$TOOLCHAIN/bin/x86_64-linux-android-strip
256 export ANDROID_SYSROOT=${DAEMON}/../client-android/android-toolchain-21-x86_64/sysroot
257
258 else
259 echo "ABI NOT OK" >&2
260 exit 1
261 fi
262
263 #=========================================================
264 # CONTRIBS
265 #=========================================================
266 if [ "$CURRENT_ABI" = armeabi-v7a ]
267 then
268 CONTRIB_PLATFORM=arm-linux-androideabi
269
270 elif [ "$CURRENT_ABI" = arm64-v8a ]
271 then
272 CONTRIB_PLATFORM=aarch64-linux-android
273
274 elif [ "$CURRENT_ABI" = x86_64 ]
275 then
276 CONTRIB_PLATFORM=x86_64-linux-android
277 fi
278
279 #NDK SOURCES FOR cpufeatures
280 NDK_SOURCES=${ANDROID_NDK}/sources/android
281
282 #=========================================================
283 # LD_FLAGS
284 #=========================================================
285 if [ "$CURRENT_ABI" = armeabi-v7a ]
286 then
287 export EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_SYSROOT}/usr/lib/arm-linux-androideabi -L${ANDROID_SYSROOT}/usr/lib/arm-linux-androideabi/21"
288 elif [ "$CURRENT_ABI" = arm64-v8a ]
289 then
290 export EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_SYSROOT}/usr/lib/aarch64-linux-android -L${ANDROID_SYSROOT}/usr/lib/aarch64-linux-android/21"
291 elif [ "$CURRENT_ABI" = x86_64 ]
292 then
293 export EXTRA_LDFLAGS="${EXTRA_LDFLAGS} -L${ANDROID_SYSROOT}/usr/lib/x86_64-linux-android -L${ANDROID_SYSROOT}/usr/lib/x86_64-linux-android/21"
294 fi
295
296 if [ -f "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg" ]; then
297 rm "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/.ffmpeg"
298 fi
299
300 WORKPATH=$(pwd)
301 cd "${CONTRIB_PATH}/native-${CONTRIB_PLATFORM}/"
302 make .ffmpeg -j$(nproc)
303 rm .ffmpeg
304 cd ${WORKPATH}
305
306 #=========================================================
307 # Compile the plugin
308 #=========================================================
309
310 # Create so destination folder
311 $CXX --std=c++17 -O3 -g -fPIC \
312 -Wl,-Bsymbolic,-rpath,"\${ORIGIN}" \
313 -shared \
314 -Wall -Wextra \
315 -Wno-unused-variable \
316 -Wno-unused-function \
317 -Wno-unused-parameter \
318 -I"." \
319 -I"${DAEMON_SRC}" \
320 -I"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include" \
321 -I"${PLUGINS_LIB}" \
322 ./../lib/accel.cpp \
323 ./../lib/frameUtils.cpp \
324 ./../lib/frameFilter.cpp \
325 WatermarkVideoSubscriber.cpp \
326 main.cpp \
327 WatermarkMediaHandler.cpp \
agsantos3fcc6212021-08-18 17:11:29 -0300328 PluginPreferenceHandler.cpp \
agsantos4bb4bc52021-03-08 14:21:45 -0500329 -L"${CONTRIB_PATH}/${CONTRIB_PLATFORM}/lib/" \
330 -lavfilter \
331 -lswscale \
332 -lavformat \
333 -lavcodec \
334 -lavutil \
335 -lvpx \
336 -lx264 \
337 -lspeex \
338 -lopus \
339 -liconv \
340 -l:libfreetype.a \
341 -llog -lz \
342 --sysroot=$ANDROID_SYSROOT \
343 -o "build-local/jpl/lib/$CURRENT_ABI/${SO_FILE_NAME}"
344 }
345
346 # Build the so
347 for i in ${ANDROID_ABI}; do
348 CURRENT_ABI=$i
349 buildlib
350 done
351fi
352
353python3 ./../SDK/jplManipulation.py --assemble --plugin=${PLUGIN_NAME} --distribution=${PLATFORM} --extraPath=${EXTRAPATH}
354cd ${CONTRIB_PATH}/src/ffmpeg/
355# ffmpeg build configuration files were changed during plugin build
356# this git checkout will remove these changes
357git checkout -- .