SUMMARY="Audio and video recording, conversion, and streaming library" DESCRIPTION="FFmpeg is a complete, cross-platform solution to record, convert \ and stream audio and video. It includes libavcodec - the leading audio/video \ codec library." HOMEPAGE="https://ffmpeg.org/" COPYRIGHT="2000-2003 Fabrice Bellard 2003-2019 the FFmpeg developers" LICENSE="GNU LGPL v3" REVISION="9" SOURCE_URI="https://ffmpeg.org/releases/ffmpeg-$portVersion.tar.xz" CHECKSUM_SHA256="cb754255ab0ee2ea5f66f8850e1bd6ad5cac1cd855d0a2f4990fb8c668b0d29c" PATCHES="ffmpeg-$portVersion.patchset" ADDITIONAL_FILES="gcc_runtime.c" ARCHITECTURES="all" SECONDARY_ARCHITECTURES="x86_gcc2 x86" ffmpegLibs="\ libavcodec \ libavdevice \ libavfilter \ libavformat \ libavutil \ libswresample \ libswscale \ " # Do not sort alphabetically libavutilVersion="56.31.100" libavcodecVersion="58.54.100" libavformatVersion="58.29.100" libavdeviceVersion="58.8.100" libavfilterVersion="7.57.100" libswscaleVersion="5.5.100" libswresampleVersion="3.5.100" portVersionCompat="$portVersion compat >= 4" for i in $ffmpegLibs; do eval "${i}VersionCompat=\"\$${i}Version compat >= \${${i}Version%%.*}\"" done PROVIDES=" ffmpeg$secondaryArchSuffix = $portVersionCompat lib:libavcodec$secondaryArchSuffix = $libavcodecVersionCompat lib:libavfilter$secondaryArchSuffix = $libavfilterVersionCompat lib:libavformat$secondaryArchSuffix = $libavformatVersionCompat lib:libavutil$secondaryArchSuffix = $libavutilVersionCompat lib:libswresample$secondaryArchSuffix = $libswresampleVersionCompat lib:libswscale$secondaryArchSuffix = $libswscaleVersionCompat " REQUIRES=" haiku$secondaryArchSuffix lib:libbz2$secondaryArchSuffix lib:libiconv$secondaryArchSuffix lib:libmp3lame$secondaryArchSuffix lib:libogg$secondaryArchSuffix lib:libopus$secondaryArchSuffix lib:libspeex$secondaryArchSuffix lib:libssl$secondaryArchSuffix lib:libtheoradec$secondaryArchSuffix lib:libtheoraenc$secondaryArchSuffix lib:libvorbis$secondaryArchSuffix lib:libvorbisenc$secondaryArchSuffix lib:libz$secondaryArchSuffix " if [ "$effectiveTargetArchitecture" != x86_gcc2 ]; then REQUIRES+=" lib:libass$secondaryArchSuffix # lib:libbluray$secondaryArchSuffix # lib:libbs2b$secondaryArchSuffix # lib:libcaca$secondaryArchSuffix # lib:libcairo$secondaryArchSuffix lib:libdav1d$secondaryArchSuffix lib:libfdk_aac$secondaryArchSuffix lib:libfontconfig$secondaryArchSuffix lib:libfreetype$secondaryArchSuffix lib:libfribidi$secondaryArchSuffix # lib:libgdk_pixbuf_2.0$secondaryArchSuffix lib:libgme$secondaryArchSuffix lib:libgmp$secondaryArchSuffix # lib:libglib_2.0$secondaryArchSuffix # lib:libgobject_2.0$secondaryArchSuffix lib:libopenjp2$secondaryArchSuffix lib:libopenmpt$secondaryArchSuffix # lib:librsvg_2$secondaryArchSuffix # lib:librubberband$secondaryArchSuffix lib:libsnappy$secondaryArchSuffix lib:libsoxr$secondaryArchSuffix # lib:libSvtAv1Dec$secondaryArchSuffix # lib:libtesseract$secondaryArchSuffix # lib:libvmaf$secondaryArchSuffix lib:libvpx$secondaryArchSuffix lib:libwavpack$secondaryArchSuffix lib:libwebp$secondaryArchSuffix # lib:libx264$secondaryArchSuffix # lib:libx265$secondaryArchSuffix lib:libxml2$secondaryArchSuffix lib:liblzma$secondaryArchSuffix " fi CONFLICTS=" ffmpeg_legacy$secondaryArchSuffix ffmpeg${secondaryArchSuffix}_bin ffmpeg2${secondaryArchSuffix}_bin " PROVIDES_avdevice=" ffmpeg${secondaryArchSuffix}_avdevice = $portVersionCompat lib:libavdevice$secondaryArchSuffix = $libavdeviceVersionCompat " REQUIRES_avdevice=" haiku$secondaryArchSuffix lib:libavcodec$secondaryArchSuffix == $libavcodecVersion lib:libavfilter$secondaryArchSuffix == $libavfilterVersion lib:libavformat$secondaryArchSuffix == $libavformatVersion lib:libavutil$secondaryArchSuffix == $libavutilVersion lib:libSDL2_2.0$secondaryArchSuffix " PROVIDES_tools=" ffmpeg${secondaryArchSuffix}_tools = $portVersion cmd:ffmpeg$secondaryArchSuffix = $portVersionCompat cmd:ffplay$secondaryArchSuffix = $portVersionCompat cmd:ffprobe$secondaryArchSuffix = $portVersionCompat " REQUIRES_tools=" haiku$secondaryArchSuffix lib:libavcodec$secondaryArchSuffix == $libavcodecVersion lib:libavdevice$secondaryArchSuffix == $libavdeviceVersion lib:libavfilter$secondaryArchSuffix == $libavfilterVersion lib:libavformat$secondaryArchSuffix == $libavformatVersion lib:libavutil$secondaryArchSuffix == $libavutilVersion lib:libSDL2_2.0$secondaryArchSuffix " PROVIDES_devel=" ffmpeg${secondaryArchSuffix}_devel = $portVersionCompat devel:libavcodec$secondaryArchSuffix = $libavcodecVersionCompat devel:libavdevice$secondaryArchSuffix = $libavdeviceVersionCompat devel:libavfilter$secondaryArchSuffix = $libavfilterVersionCompat devel:libavformat$secondaryArchSuffix = $libavformatVersionCompat devel:libavutil$secondaryArchSuffix = $libavutilVersionCompat devel:libswresample$secondaryArchSuffix = $libswresampleVersionCompat devel:libswscale$secondaryArchSuffix = $libswscaleVersionCompat " REQUIRES_devel=" ffmpeg$secondaryArchSuffix == $portVersion base ffmpeg${secondaryArchSuffix}_avdevice == $portVersion devel:libspeex$secondaryArchSuffix " CONFLICTS_devel=" ffmpeg_legacy${secondaryArchSuffix}_devel ffmpeg${secondaryArchSuffix}_devel ffmpeg2${secondaryArchSuffix}_devel " # -- HACK! -- # ffmpeg ~0.10 has perpetually had & caused problems when compiled with GCC 2. # (Later versions do not compile with GCC 2 at all.) So instead, we now compile # FFmpeg for x86_gcc2 with a modern GCC. # # This works because GCC's C ABI has not changed between 2 and 7; only the C++ # ABI has, and no BeOS applications expect a system FFmpeg at all, so we can # break its ABI all we like. if [ "$effectiveTargetArchitecture" = x86_gcc2 ] && \ [ "$targetArchitecture" = x86_gcc2 ]; then gccSuffix="_x86" elif [ "$effectiveTargetArchitecture" = x86_gcc2 ] && \ [ "$targetArchitecture" = x86 ]; then gccSuffix="" else gccSuffix="$secondaryArchSuffix" fi BUILD_REQUIRES=" haiku${secondaryArchSuffix}_devel devel:libbz2$secondaryArchSuffix devel:libiconv$secondaryArchSuffix devel:libmp3lame$secondaryArchSuffix devel:libogg$secondaryArchSuffix devel:libopus$secondaryArchSuffix devel:libsdl2$secondaryArchSuffix devel:libspeex$secondaryArchSuffix devel:libssl$secondaryArchSuffix devel:libtheora$secondaryArchSuffix devel:libvorbis$secondaryArchSuffix devel:libz$secondaryArchSuffix " if [ "$effectiveTargetArchitecture" != x86_gcc2 ]; then BUILD_REQUIRES+=" devel:libass$secondaryArchSuffix # devel:libbluray$secondaryArchSuffix # devel:libbs2b$secondaryArchSuffix # devel:libcaca$secondaryArchSuffix # devel:libcairo$secondaryArchSuffix devel:libdav1d$secondaryArchSuffix devel:libfdk_aac$secondaryArchSuffix devel:libfontconfig$secondaryArchSuffix devel:libfreetype$secondaryArchSuffix devel:libfribidi$secondaryArchSuffix # devel:libgdk_pixbuf_2.0$secondaryArchSuffix devel:libgme$secondaryArchSuffix devel:libgmp$secondaryArchSuffix devel:libopenjp2$secondaryArchSuffix devel:libopenmpt$secondaryArchSuffix # devel:librsvg_2$secondaryArchSuffix # devel:librubberband$secondaryArchSuffix devel:libsnappy$secondaryArchSuffix devel:libsoxr$secondaryArchSuffix # devel:libSvtAv1Dec$secondaryArchSuffix # devel:libtesseract$secondaryArchSuffix # devel:libvmaf$secondaryArchSuffix devel:libvpx$secondaryArchSuffix devel:libwavpack$secondaryArchSuffix devel:libwebp$secondaryArchSuffix # devel:libx264$secondaryArchSuffix # devel:libx265$secondaryArchSuffix devel:libxml2$secondaryArchSuffix devel:liblzma$secondaryArchSuffix " fi BUILD_PREREQUIRES=" cmd:awk cmd:cmp cmd:gcc$gccSuffix >= 7 cmd:g++$secondaryArchSuffix cmd:ld$gccSuffix cmd:grep cmd:make cmd:perl cmd:pkg_config$secondaryArchSuffix cmd:sed cmd:texi2html cmd:yasm " PATCH() { # patch hard-coded paths to perl sed -i "s,/usr/bin/perl,$portPackageLinksDir/cmd~perl/bin/perl," \ doc/Doxyfile \ doc/texi2pod.pl # force no-undefined-symbols if [ "$effectiveTargetArchitecture" = x86_gcc2 ]; then sed -i "s/SHFLAGS='-shared/SHFLAGS='-shared -Wl,--no-undefined/g" \ configure fi } defineDebugInfoPackage ffmpeg$secondaryArchSuffix \ $libDir/libavcodec.so.$libavcodecVersion \ $libDir/libavfilter.so.$libavfilterVersion \ $libDir/libavformat.so.$libavformatVersion \ $libDir/libavutil.so.$libavutilVersion \ $libDir/libswresample.so.$libswresampleVersion \ $libDir/libswscale.so.$libswscaleVersion \ "$(getPackagePrefix avdevice)/$relativeLibDir"/libavdevice.so.$libavdeviceVersion \ "$(getPackagePrefix tools)/$relativeBinDir"/ffmpeg \ "$(getPackagePrefix tools)/$relativeBinDir"/ffplay \ "$(getPackagePrefix tools)/$relativeBinDir"/ffprobe BUILD() { ccArgs="" extraArgs="" if [ "$effectiveTargetArchitecture" = x86_gcc2 ]; then cc="gcc${gccSuffix/_/-}" ccArgs="--cc=$cc --cxx=g++${secondaryArchSuffix/_/-} --ld=gcc${secondaryArchSuffix/_/-} --host-ld=gcc${secondaryArchSuffix/_/-}" # Hack up base headers to make them think we're on GCC2 ABI mkdir -p include_hacks include_hacks/os include_hacks/config pushd include_hacks rm -f os/BeBuild.h config/HaikuConfig.h cp /system/develop/headers/os/BeBuild.h os cp /system/develop/headers/config/HaikuConfig.h config sed -i 's/__GNUC__ == 2/1/g' os/BeBuild.h config/HaikuConfig.h popd # Compile gcc_runtime.c (subset of libgcc that GCC 7 utilizes here) $cc -fvisibility=hidden -c $portDir/additional-files/gcc_runtime.c \ -o gcc_runtime.o baseLDFLAGS="-B/system/bin/${gccSuffix/_/}" ccArgs="$ccArgs --host-ldflags=\"${baseLDFLAGS}\"" export CFLAGS="-isystem$(pwd) -isystem$(pwd)/os -isystem$(pwd)/config" export LDFLAGS="$baseLDFLAGS $(pwd)/gcc_runtime.o" else extraArgs="--enable-libass \ --enable-libdav1d \ --enable-libfdk-aac \ --enable-fontconfig \ --enable-libfreetype \ --enable-libfribidi \ --enable-libgme \ --enable-gmp \ --enable-libopenjpeg \ --enable-libopenmpt \ --enable-libsnappy \ --enable-libsoxr \ --enable-libvpx \ --enable-libwavpack \ --enable-libwebp \ --enable-libxml2 \ --enable-lzma" fi # not an autotools configure ./configure \ $ccArgs \ --prefix=$prefix \ --bindir=$binDir \ --datadir=$dataDir/$portName \ --incdir=$includeDir \ --libdir=$libDir \ --shlibdir=$libDir \ --mandir=$manDir \ --disable-debug \ --disable-stripping \ --disable-static \ --enable-shared \ --enable-version3 \ --enable-openssl \ --enable-libvorbis \ --enable-libspeex \ --enable-libtheora \ --enable-libmp3lame \ --enable-libopus \ $extraArgs make $jobArgs } INSTALL() { make install prepareInstalledDevelLibs $ffmpegLibs fixPkgconfig # The pkgconfig file reference other libraries using the wrong paths, which # creates a lot of confusion. Fix them so correct paths are used. local develPackageName="${portName}_devel-$portFullVersion" local packageLinksDir=$(dirname $portPackageLinksDir) local linksDir="$packageLinksDir/${develPackageName}/devel~libspeex$secondaryArchSuffix/$relativeDevelopLibDir" sed -i -e "s,^\(Libs.private.*\)-L.*speex.* \(-lspeex.*\),\1-L$linksDir \2," \ $developLibDir/pkgconfig/libavcodec.pc \ $developLibDir/pkgconfig/libavdevice.pc \ $developLibDir/pkgconfig/libavfilter.pc \ $developLibDir/pkgconfig/libavformat.pc # Move html docs to the right place. mkdir -p $docDir mv $prefix/share/doc/ffmpeg $docDir rm -r $prefix/share # Split out libs and executables which need libSDL packageEntries tools $binDir packageEntries avdevice $libDir/libavdevice* # devel package packageEntries devel \ $dataDir/ffmpeg$secondaryArchSuffix/examples \ $manDir/man3 \ $docDir \ $developDir } TEST() { make check }