media-kit / libmpv-darwin-build

libmpv for macOS & iOS.
Other
32 stars 11 forks source link
build ffmpeg freetype fribidi harfbuzz ios libass libmpv libressl macos mpv uchardet

libmpv build

Provides builds of libmpv for macOS & iOS, used by media_kit, compatible with commercial use for playback, and GPL use for encoding.

Heavily inspired by Homebrew and IINA.

Usage

$ brew install cmake golang meson ninja
$ VERSION=v0.0.1 make
$ ls build/output
libmpv-libs_v0.0.1_ios-arm64-audio-default.tar.gz
libmpv-libs_v0.0.1_ios-arm64-audio-full.tar.gz
libmpv-libs_v0.0.1_ios-arm64-audio-encodersgpl.tar.gz
libmpv-libs_v0.0.1_ios-arm64-video-default.tar.gz
libmpv-libs_v0.0.1_ios-arm64-video-full.tar.gz
libmpv-libs_v0.0.1_ios-arm64-video-encodersgpl.tar.gz
libmpv-libs_v0.0.1_iossimulator-universal-audio-default.tar.gz
libmpv-libs_v0.0.1_iossimulator-universal-audio-full.tar.gz
libmpv-libs_v0.0.1_iossimulator-universal-audio-encodersgpl.tar.gz
libmpv-libs_v0.0.1_iossimulator-universal-video-default.tar.gz
libmpv-libs_v0.0.1_iossimulator-universal-video-full.tar.gz
libmpv-libs_v0.0.1_iossimulator-universal-video-encodersgpl.tar.gz
libmpv-libs_v0.0.1_macos-universal-audio-default.tar.gz
libmpv-libs_v0.0.1_macos-universal-audio-full.tar.gz
libmpv-libs_v0.0.1_macos-universal-audio-encodersgpl.tar.gz
libmpv-libs_v0.0.1_macos-universal-video-default.tar.gz
libmpv-libs_v0.0.1_macos-universal-video-full.tar.gz
libmpv-libs_v0.0.1_macos-universal-video-encodersgpl.tar.gz
libmpv-xcframeworks_v0.0.1_ios-universal-audio-default.tar.gz
libmpv-xcframeworks_v0.0.1_ios-universal-audio-full.tar.gz
libmpv-xcframeworks_v0.0.1_ios-universal-audio-encodersgpl.tar.gz
libmpv-xcframeworks_v0.0.1_ios-universal-video-default.tar.gz
libmpv-xcframeworks_v0.0.1_ios-universal-video-full.tar.gz
libmpv-xcframeworks_v0.0.1_ios-universal-video-encodersgpl.tar.gz
libmpv-xcframeworks_v0.0.1_macos-universal-audio-default.tar.gz
libmpv-xcframeworks_v0.0.1_macos-universal-audio-full.tar.gz
libmpv-xcframeworks_v0.0.1_macos-universal-audio-encodersgpl.tar.gz
libmpv-xcframeworks_v0.0.1_macos-universal-video-default.tar.gz
libmpv-xcframeworks_v0.0.1_macos-universal-video-full.tar.gz
libmpv-xcframeworks_v0.0.1_macos-universal-video-encodersgpl.tar.gz

Naming convention

libmpv-<format>_<version>_<os>-<arch>-<variant>-<flavor>.tar.gz
Component Notes Value
format Output format of built files libs, xcframeworks
version Semantic version v0.0.1, …
os Operating system ios, iossimulator, macos
arch Architecture arm64, amd64, universal
variant Usage context audio, video
flavor Available decoders and encoders default, full, encodersgpl

Inclusion:

Minimum versions

Platform Arch Min Version Notes
macOS amd64 10.9 Required by uchardet
arm64
iOS arm64 9.0 Required by ffmpeg
iOS Simulator amd64 9.0 Required by ffmpeg
arm64 12.0 Required by xcodebuild -create-xcframework

Dependencies

flowchart LR
    subgraph legend[Legend]
        direction TB
        subgraph links
            P(node):::decoders -- "required" --> Q(node):::decoders
            R(node):::decoders -. "optional" .-> S(node):::decoders
        end

        subgraph variants
            T(audio & video):::decoders
            U{{video only}}:::decoders
        end

        subgraph flavors
            V(default, full):::decoders
            W(encodersgpl):::encoders
        end
    end

    subgraph content[ ]
        direction LR
        A(mpv):::decoders -.-> B{{uchardet}}:::decoders
        A                 -.-> C{{libass}}:::decoders
        A                 -->  D(ffmpeg):::decoders

        E(fftools-ffi):::encoders --> D

        %% libass
        C -->  F{{fribidi}}:::decoders
        C -->  G{{harfbuzz}}:::decoders
        C -->  H{{freetype}}:::decoders
        H -.-> G

        %% ffmpeg
        D -.-> I(mbedtls):::decoders
        D -.-> J{{dav1d}}:::decoders
        D -.-> K{{libxml2}}:::decoders
        D -.-> L(libvorbis):::encoders
        D -.-> M{{libvpx}}:::encoders
        D -.-> N{{libx264}}:::encoders
        L -->  O(libogg):::encoders
    end

    classDef decoders stroke:#888
    classDef encoders stroke:#14a,stroke-width:3px
    classDef legend fill:transparent,stroke:#8882
    classDef content fill:transparent,stroke:transparent
    classDef card fill:transparent,stroke:#888a

    legend:::legend
    content:::content
    links:::card
    variants:::card
    flavors:::card

Commercial use

Default, Full flavors

Dependency Licence Commercial use
mpv LGPL-2.1 (-Dgpl=false)
ffmpeg LGPL-2.1 (--enable-gpl & --enable-nonfree omitted)
libass ISC
freetype FreeType
harfbuzz MIT
fribidi LGPL-2.1
mbedtls Apache 2.0
uchardet MPL-1.1, GPL-2, LGPL-2.1
libxml2 MIT
dav1d BSD-2-clause

Encoders-GPL flavor

Dependency Licence Commercial use
mpv LGPL-2.1 (-Dgpl=false)
ffmpeg GPL-2.1 (--enable-nonfree omitted)
libass ISC
freetype FreeType
harfbuzz MIT
fribidi LGPL-2.1
mbedtls Apache 2.0
uchardet MPL-1.1, GPL-2, LGPL-2.1
libxml2 MIT
dav1d BSD-2-clause
fftools-ffi LGPL-2.1
libx264 GPL-2.0+
libvpx BSD-3-clause
libvorbis BSD-3-clause
libogg BSD-3-clause

Notes

Project layout

.
├── ...
├── cmd                                   # golang scripts
├── pkg                                   # golang packages
├── downloads.lock                        # lock file of dependencies archives
├── Makefile                              # main build script
├── scripts                               # build scripts
├── cross-files                           # cross build files used by meson
├── build
│   ├── intermediate                      # intermediate build artifacts
│   │   ├── tool-versions.lock            # versions of tools used during build
│   │   ├── downloads                     # dependencies archives files
│   │   ├── links                         # symbolic links to host binaries
│   │   ├── <rule>_<os>-<arch>-<variant>
│   │   └── ...
│   ├── tmp
│   │   ├── <rule>_<os>-<arch>-<variant>
│   │   └── ...
│   └── output
│       ├── debug.zip                     # zip containing locks and logs
│       ├── libmpv-<format>_<version>_<os>-<arch>-<variant>.tar.gz
│       └── ...
└── ...

How the libass optional patch was created

As the dependency of mpv on libass is deeply embedded in the code, the simplest solution was to:

  1. Remove the dynamic linking in meson.build.
  2. Include the ass/ass.h and ass/ass_types.h headers directly in the code
  3. Remove the call to ass_library_version in player/command.c
  4. Remove the calls to ass_library_init, called by mp_ass_init, in sub/osd_libass.c and sub/sd_ass.c

Resources