Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/build-ffmpeg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
arch: x86_64
shell: bash
- os: windows-latest
arch: AMD64
arch: x86_64
shell: 'msys2 {0}'
msys_prefix: mingw-w64-x86_64
msys_system: MINGW64
Expand Down Expand Up @@ -69,7 +69,7 @@ jobs:
path-type: inherit
- name: Build FFmpeg
env:
CIBW_ARCHS: ${{ matrix.arch }}
CIBW_ARCHS: ${{ matrix.msys_prefix && 'AMD64' || matrix.arch }}
CIBW_BEFORE_BUILD: python scripts/build-ffmpeg.py /tmp/vendor --community
CIBW_BEFORE_BUILD_WINDOWS: python scripts\build-ffmpeg.py C:\cibw\vendor --community
CIBW_BUILD: cp311-*
Expand Down
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ users to easily install PyAV without perform error-prone compilations.

The builds are provided for several platforms:

- Linux (x86_64, aarch64)
- Linux (x86_64, aarch64)
- macOS (x86_64, arm64)
- Windows (x86_64)

Expand Down
106 changes: 47 additions & 59 deletions scripts/build-ffmpeg.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
import platform
import shutil
import subprocess
import sys

from cibuildpkg import Builder, Package, When, fetch, get_platform, log_group, run
from cibuildpkg import Builder, Package, When, fetch, log_group, run

plat = platform.system()
is_musllinux = plat == "Linux" and platform.libc_ver()[0] != "glibc"
Expand Down Expand Up @@ -66,37 +67,11 @@ def calculate_sha256(filename: str) -> str:
]

codec_group = [
Package(
name="aom",
source_url="https://storage.googleapis.com/aom-releases/libaom-3.13.1.tar.gz",
sha256="19e45a5a7192d690565229983dad900e76b513a02306c12053fb9a262cbeca7d",
requires=["cmake"],
build_system="cmake",
build_arguments=[
"-DENABLE_DOCS=0",
"-DENABLE_EXAMPLES=0",
"-DENABLE_TESTS=0",
"-DENABLE_TOOLS=0",
],
build_parallel=False,
),
Package(
name="dav1d",
source_url="https://code.videolan.org/videolan/dav1d/-/archive/1.5.2/dav1d-1.5.2.tar.bz2",
sha256="c748a3214cf02a6d23bc179a0e8caea9d6ece1e46314ef21f5508ca6b5de6262",
requires=["meson", "nasm", "ninja"],
build_system="meson",
),
Package(
name="libsvtav1",
source_url="https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v3.1.0/SVT-AV1-v3.1.0.tar.bz2",
sha256="8231b63ea6c50bae46a019908786ebfa2696e5743487270538f3c25fddfa215a",
build_system="cmake",
),
Package(
name="lame",
source_url="http://deb.debian.org/debian/pool/main/l/lame/lame_3.100.orig.tar.gz",
sha256="ddfe36cab873794038ae2c1210557ad34857a4b6bdc515785d1da9e175b1da1e",
build_arguments=["--disable-gtktest"],
),
Package(
name="ogg",
Expand Down Expand Up @@ -127,6 +102,33 @@ def calculate_sha256(filename: str) -> str:
sha256="b33cc4934322bcbf6efcbacf49e3ca01aadbea4114ec9589d1b1e9d20f72954b",
requires=["ogg"],
),
Package(
name="aom",
source_url="https://storage.googleapis.com/aom-releases/libaom-3.13.1.tar.gz",
sha256="19e45a5a7192d690565229983dad900e76b513a02306c12053fb9a262cbeca7d",
build_system="cmake",
build_arguments=[
"-DENABLE_DOCS=0",
"-DENABLE_EXAMPLES=0",
"-DENABLE_TESTS=0",
"-DENABLE_TOOLS=0",
],
build_parallel=False,
),
Package(
name="dav1d",
source_url="https://code.videolan.org/videolan/dav1d/-/archive/1.5.2/dav1d-1.5.2.tar.bz2",
sha256="c748a3214cf02a6d23bc179a0e8caea9d6ece1e46314ef21f5508ca6b5de6262",
requires=["nasm"],
build_system="meson",
),
Package(
name="libsvtav1",
source_url="https://gitlab.com/AOMediaCodec/SVT-AV1/-/archive/v3.1.0/SVT-AV1-v3.1.0.tar.bz2",
sha256="8231b63ea6c50bae46a019908786ebfa2696e5743487270538f3c25fddfa215a",
build_system="cmake",
build_arguments=["-DBUILD_APPS=OFF"],
),
Package(
name="vpx",
source_url="https://github.com/webmproject/libvpx/archive/v1.15.1.tar.gz",
Expand All @@ -136,6 +138,7 @@ def calculate_sha256(filename: str) -> str:
"--disable-examples",
"--disable-tools",
"--disable-unit-tests",
"--disable-dependency-tracking",
],
),
Package(
Expand Down Expand Up @@ -168,16 +171,8 @@ def calculate_sha256(filename: str) -> str:
source_url="https://github.com/cisco/openh264/archive/refs/tags/v2.6.0.tar.gz",
sha256="558544ad358283a7ab2930d69a9ceddf913f4a51ee9bf1bfb9e377322af81a69",
source_filename="openh264-2.6.0.tar.gz",
requires=["meson", "ninja"],
build_system="meson",
),
Package(
name="fdk_aac",
source_url="https://github.com/mstorsjo/fdk-aac/archive/refs/tags/v2.0.3.tar.gz",
sha256="e25671cd96b10bad896aa42ab91a695a9e573395262baed4e4a2ff178d6a3a78",
when=When.commercial_only,
build_system="cmake",
),
Package(
name="opencore-amr",
source_url="http://deb.debian.org/debian/pool/main/o/opencore-amr/opencore-amr_0.1.5.orig.tar.gz",
Expand All @@ -191,33 +186,17 @@ def calculate_sha256(filename: str) -> str:
source_url="https://code.videolan.org/videolan/x264/-/archive/32c3b801191522961102d4bea292cdb61068d0dd/x264-32c3b801191522961102d4bea292cdb61068d0dd.tar.bz2",
sha256="d7748f350127cea138ad97479c385c9a35a6f8527bc6ef7a52236777cf30b839",
# assembly contains textrels which are not supported by musl
build_arguments=["--disable-asm"] if is_musllinux else [],
build_arguments=["--disable-cli"] + (["--disable-asm"] if is_musllinux else []),
# parallel build runs out of memory on Windows
build_parallel=plat != "Windows",
when=When.community_only,
),
Package(
name="x265",
source_url="https://bitbucket.org/multicoreware/x265_git/downloads/x265_4.1.tar.gz",
sha256="a31699c6a89806b74b0151e5e6a7df65de4b49050482fe5ebf8a4379d7af8f29",
build_system="cmake",
source_dir="source",
when=When.community_only,
),
# Package(
# name="srt",
# source_url="https://github.com/Haivision/srt/archive/refs/tags/v1.5.4.tar.gz",
# sha256="d0a8b600fe1b4eaaf6277530e3cfc8f15b8ce4035f16af4a5eb5d4b123640cdd",
# build_system="cmake",
# build_arguments=(
# [r"-DOPENSSL_ROOT_DIR=C:\Program Files\OpenSSL"]
# if plat == "Windows"
# else ["-DENABLE_ENCRYPTION=OFF"]
# if plat == "Darwin"
# else [""]
# ),
# when=When.community_only,
# ),
]

alsa_package = Package(
Expand Down Expand Up @@ -245,7 +224,6 @@ def calculate_sha256(filename: str) -> str:
name="libvpl",
source_url="https://github.com/intel/libvpl/archive/refs/tags/v2.16.0.tar.gz",
sha256="d60931937426130ddad9f1975c010543f0da99e67edb1c6070656b7947f633b6",
requires=["cmake"],
build_system="cmake",
build_arguments=[
"-DINSTALL_LIB=ON",
Expand Down Expand Up @@ -305,6 +283,20 @@ def download_tars(packages: list[Package]) -> None:
print(f"{name} generated an exception: {exc}")
raise

def make_tarball_name() -> str:
isArm64 = platform.machine() in {"arm64", "aarch64"}

if sys.platform.startswith("win"):
return "ffmpeg-windows-aarch64" if isArm64 else "ffmpeg-windows-x86_64"
elif sys.platform.startswith("linux"):
if is_musllinux:
return "ffmpeg-musllinux-aarch64" if isArm64 else "ffmpeg-musllinux-x86_64"
else:
return "ffmpeg-manylinux-aarch64" if isArm64 else "ffmpeg-manylinux-x86_64"
elif sys.platform.startswith("darwin"):
return "ffmpeg-macos-arm64" if isArm64 else "ffmpeg-macos-x86_64"
else:
return "ffmpeg-unknown"

def main():
parser = argparse.ArgumentParser("build-ffmpeg")
Expand Down Expand Up @@ -335,8 +327,8 @@ def main():
output_dir = os.path.abspath("output")
if plat == "Linux" and os.environ.get("CIBUILDWHEEL") == "1":
output_dir = "/output"
output_tarball = os.path.join(output_dir, f"ffmpeg-{get_platform()}.tar.gz")

output_tarball = os.path.join(output_dir, make_tarball_name() + ".tar.gz")
if os.path.exists(output_tarball):
return

Expand Down Expand Up @@ -403,7 +395,6 @@ def main():
"--enable-libopus",
"--enable-libspeex",
"--enable-libsvtav1",
# "--enable-libsrt" if community else "--disable-libsrt",
"--enable-libtwolame",
"--enable-libvorbis",
"--enable-libvpx",
Expand All @@ -424,9 +415,6 @@ def main():
if use_libvpl:
ffmpeg_package.build_arguments.append("--enable-libvpl")

if not community:
ffmpeg_package.build_arguments.append("--enable-libfdk_aac")

if plat == "Darwin":
ffmpeg_package.build_arguments.extend(
[
Expand Down
26 changes: 1 addition & 25 deletions scripts/cibuildpkg.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,28 +18,6 @@ def fetch(url: str, path: str) -> None:
run(["curl", "-L", "-o", path, url])


def get_platform() -> str:
"""
Get the current platform tag.
"""
system = platform.system()
machine = platform.machine()
if system == "Linux":
if platform.libc_ver()[0] == "glibc":
return f"manylinux_{machine}"
else:
return f"musllinux_{machine}"
elif system == "Darwin":
return f"macosx_{machine}"
elif system == "Windows":
if struct.calcsize("P") * 8 == 64:
return "win_amd64"
else:
return "win32"
else:
raise Exception(f"Unsupported system {system}")


@contextlib.contextmanager
def chdir(path: str) -> Iterator[None]:
"""
Expand Down Expand Up @@ -353,9 +331,7 @@ def _build_x265(self, package: Package, for_builder: bool) -> None:
flags_high_bits = []

disable_sve = platform.system() == "Linux" and platform.machine() == "aarch64"
platform_str = get_platform()

if not ("x86_64" in platform_str or "amd64" in platform_str):
if platform.machine() not in {"x86_64", "amd64"}:
flags_high_bits.append("-DENABLE_ASSEMBLY=0")
flags_high_bits.append("-DENABLE_ALTIVEC=0")

Expand Down