33# Versions
44VPX_VERSION=1.13.0
55MBEDTLS_VERSION=3.4.1
6+ DAV1D_VERSION=1.4.1
67FFMPEG_VERSION=6.0
78
89# Directories
@@ -13,11 +14,12 @@ SOURCES_DIR=$BASE_DIR/sources
1314FFMPEG_DIR=$SOURCES_DIR /ffmpeg-$FFMPEG_VERSION
1415VPX_DIR=$SOURCES_DIR /libvpx-$VPX_VERSION
1516MBEDTLS_DIR=$SOURCES_DIR /mbedtls-$MBEDTLS_VERSION
17+ DAV1D_DIR=$SOURCES_DIR /dav1d-$DAV1D_VERSION
1618
1719# Configuration
1820ANDROID_ABIS=" x86 x86_64 armeabi-v7a arm64-v8a"
1921ANDROID_PLATFORM=21
20- ENABLED_DECODERS=" vorbis opus flac alac pcm_mulaw pcm_alaw mp3 amrnb amrwb aac ac3 eac3 dca mlp truehd h264 hevc mpeg2video mpegvideo libvpx_vp8 libvpx_vp9"
22+ ENABLED_DECODERS=" vorbis opus flac alac pcm_mulaw pcm_alaw mp3 amrnb amrwb aac ac3 eac3 dca mlp truehd h264 hevc mpeg2video mpegvideo libvpx_vp8 libvpx_vp9 libdav1d "
2123JOBS=$( nproc 2> /dev/null || sysctl -n hw.ncpu 2> /dev/null || sysctl -n hw.pysicalcpu || echo 4)
2224
2325# Set up host platform variables
3638# Build tools
3739TOOLCHAIN_PREFIX=" ${ANDROID_NDK_HOME} /toolchains/llvm/prebuilt/${HOST_PLATFORM} "
3840CMAKE_EXECUTABLE=${ANDROID_SDK_HOME} /cmake/3.22.1/bin/cmake
41+ # Using Build machine's Ninja. It is used for libdav1d building. Needs to be installed
42+ NINJA_EXECUTABLE=$( which ninja)
43+ # Meson is used for libdav1d building. Needs to be installed
44+ MESON_EXECUTABLE=$( which meson)
45+ # Nasm is used for libdav1d building. Needs to be installed
46+ NASM_EXECUTABLE=$( which nasm)
47+
48+ export FAM_CC=${TOOLCHAIN_PREFIX} /bin/${TARGET} -clang
49+ export FAM_CXX=${FAM_CC} ++
50+ export FAM_LD=${FAM_CC} # Forcing FFmpeg and its dependencies to look for dependencies
51+ # in a specific directory when pkg-config is used
52+ export PKG_CONFIG_LIBDIR=$BUILD_DIR /external/lib/pkgconfig
3953
4054mkdir -p $SOURCES_DIR
4155
@@ -61,6 +75,17 @@ function downloadMbedTLS() {
6175 popd
6276}
6377
78+ function downloadDav1d() {
79+ pushd $SOURCES_DIR
80+ echo " Downloading Dav1d source code of version $DAV1D_VERSION ..."
81+ DAV1D_FILE=dav1d-$DAV1D_VERSION .tar.gz
82+ curl -L " https://code.videolan.org/videolan/dav1d/-/archive/${DAV1D_VERSION} /dav1d-${DAV1D_VERSION} .tar.gz" -o $DAV1D_FILE
83+ [ -e $DAV1D_FILE ] || { echo " $DAV1D_FILE does not exist. Exiting..." ; exit 1; }
84+ tar -zxf $DAV1D_FILE
85+ rm $DAV1D_FILE
86+ popd
87+ }
88+
6489function downloadFfmpeg() {
6590 pushd $SOURCES_DIR
6691 echo " Downloading FFmpeg source code of version $FFMPEG_VERSION ..."
@@ -159,6 +184,82 @@ function buildMbedTLS() {
159184 popd
160185}
161186
187+ function buildDav1d() {
188+ pushd $DAV1D_DIR
189+
190+ for ABI in $ANDROID_ABIS ; do
191+ CPU_FAMILY=
192+ case $ABI in
193+ armeabi-v7a)
194+ TARGET_TRIPLE_MACHINE_ARCH=arm
195+ TOOLCHAIN=armv7a-linux-androideabi21-
196+ ;;
197+ arm64-v8a)
198+ TARGET_TRIPLE_MACHINE_ARCH=aarch64
199+ TOOLCHAIN=aarch64-linux-android21-
200+ ;;
201+ x86)
202+ TARGET_TRIPLE_MACHINE_ARCH=i686
203+ TOOLCHAIN=i686-linux-android21-
204+ CPU_FAMILY=x86
205+ ;;
206+ x86_64)
207+ TARGET_TRIPLE_MACHINE_ARCH=x86_64
208+ TOOLCHAIN=x86_64-linux-android21-
209+ ;;
210+ esac
211+
212+ CROSS_PREFIX_WITH_PATH=${TOOLCHAIN_PREFIX} /bin/llvm-
213+
214+ [ -z " ${CPU_FAMILY} " ] && CPU_FAMILY=${TARGET_TRIPLE_MACHINE_ARCH}
215+
216+ CROSS_FILE_NAME=crossfile-${ABI} .meson
217+
218+ echo "
219+ [binaries]
220+ c = '${TOOLCHAIN_PREFIX} /bin/${TOOLCHAIN} clang'
221+ ar = '${CROSS_PREFIX_WITH_PATH} ar'
222+ strip = '${CROSS_PREFIX_WITH_PATH} strip'
223+ nasm = '${NASM_EXECUTABLE} '
224+ pkg-config = '$( which pkg-config) '
225+
226+ [properties]
227+ needs_exe_wrapper = true
228+ sys_root = '${TOOLCHAIN_PREFIX} /sysroot'
229+
230+ [host_machine]
231+ system = 'linux'
232+ cpu_family = '${CPU_FAMILY} '
233+ cpu = '${TARGET_TRIPLE_MACHINE_ARCH} '
234+ endian = 'little'
235+
236+ [built-in options]
237+ prefix = '$BUILD_DIR /external/$ABI '" > " ${CROSS_FILE_NAME} "
238+
239+ BUILD_DIRECTORY=build/${ABI}
240+
241+ rm -rf ${BUILD_DIRECTORY}
242+
243+ ${MESON_EXECUTABLE} setup . ${BUILD_DIRECTORY} \
244+ --cross-file ${CROSS_FILE_NAME} \
245+ --default-library=static \
246+ -Denable_asm=true \
247+ -Denable_tools=false \
248+ -Denable_tests=false \
249+ -Denable_examples=false \
250+ -Dtestdata_tests=false
251+
252+ pushd ${BUILD_DIRECTORY}
253+
254+ ${NINJA_EXECUTABLE} -j$JOBS
255+ ${NINJA_EXECUTABLE} install
256+
257+ popd
258+
259+ done
260+ popd
261+ }
262+
162263function buildFfmpeg() {
163264 pushd $FFMPEG_DIR
164265 EXTRA_BUILD_CONFIGURATION_FLAGS=" "
@@ -201,6 +302,10 @@ function buildFfmpeg() {
201302 ;;
202303 esac
203304
305+ # Forcing FFmpeg and its dependencies to look for dependencies
306+ # in a specific directory when pkg-config is used
307+ export PKG_CONFIG_LIBDIR=$BUILD_DIR /external/$ABI /lib/pkgconfig
308+
204309 # Referencing dependencies without pkgconfig
205310 DEP_CFLAGS=" -I$BUILD_DIR /external/$ABI /include"
206311 DEP_LD_FLAGS=" -L$BUILD_DIR /external/$ABI /lib"
@@ -236,6 +341,7 @@ function buildFfmpeg() {
236341 --enable-swresample \
237342 --enable-avformat \
238343 --enable-libvpx \
344+ --enable-libdav1d \
239345 --enable-protocol=file,http,https,mmsh,mmst,pipe,rtmp,rtmps,rtmpt,rtmpts,rtp,tls \
240346 --enable-version3 \
241347 --enable-mbedtls \
@@ -273,6 +379,11 @@ if [[ ! -d "$OUTPUT_DIR" && ! -d "$BUILD_DIR" ]]; then
273379 downloadLibVpx
274380 fi
275381
382+ # Download Dav1d source code if it doesn't exist
383+ if [[ ! -d " $DAV1D_DIR " ]]; then
384+ downloadDav1d
385+ fi
386+
276387 # Download Ffmpeg source code if it doesn't exist
277388 if [[ ! -d " $FFMPEG_DIR " ]]; then
278389 downloadFfmpeg
@@ -281,5 +392,6 @@ if [[ ! -d "$OUTPUT_DIR" && ! -d "$BUILD_DIR" ]]; then
281392 # Building library
282393 buildMbedTLS
283394 buildLibVpx
395+ buildDav1d
284396 buildFfmpeg
285397fi
0 commit comments