summaryrefslogtreecommitdiffstats
path: root/media/ffvpx/README_MOZILLA
diff options
context:
space:
mode:
Diffstat (limited to 'media/ffvpx/README_MOZILLA')
-rw-r--r--media/ffvpx/README_MOZILLA161
1 files changed, 161 insertions, 0 deletions
diff --git a/media/ffvpx/README_MOZILLA b/media/ffvpx/README_MOZILLA
new file mode 100644
index 0000000000..85616cc902
--- /dev/null
+++ b/media/ffvpx/README_MOZILLA
@@ -0,0 +1,161 @@
+# FFVPX
+
+This directory contains files used in gecko builds from FFmpeg
+(http://ffmpeg.org). The current files are from FFmpeg as of
+revision fed07efcde72824ac1ada80d4af4e91ac4fcfc14
+git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
+git checkout fed07efcde72824ac1ada80d4af4e91ac4fcfc14
+
+This copy has a single patch backported from a later revision to fix the build with recent binutils:
+
+http://git.videolan.org/?p=ffmpeg.git;a=patch;h=effadce6c756247ea8bae32dc13bb3e6f464f0eb
+that is available as `1846703.patch` in this directory. As usual this has other
+changes that don't come from upstream, in `changes.patch`
+
+All source files match their path from the library's source archive.
+
+Currently, we only use the vp8, vp9, av1 (libdav1d), mp3, and flac portion of
+the library. If this changes, configuration files will most likely need to be
+updated. Decoding AV1 via libdav1d is supported, although the decoder
+(libdav1d) is vendored separately, `ffvpx` only contains the code to use `libdav1d` through the `ffmpeg` API.
+
+The ffmpeg project recommends to use ffmpeg's tip, not a particular release.
+
+## Source files
+
+This library only use a small part of `ffmpeg`. To update the source tree, run:
+
+> rsync -av --existing ffmpeg-upstream ffmpeg-mozilla-dir
+
+Compilation will reveal if any files are missing.
+
+Then, make sure the files:
+
+- `libavcodec/codec_list.c`
+- `libavcodec/bsf_list.c`
+- `libavcodec/parser_list.c`
+
+include conditional compilation directives, by probably reverting them (or
+reverting and adjusting them if new codecs are added).
+
+## Add headers for a new major ffmpeg version
+
+If a new major version of ffmpeg is being imported in the tree, it's necessary
+to vendor the new ffmpeg headers in `dom/media/platforms/ffmpeg/ffmpegxx` where
+xx is the new ffmpeg major version number, and to modify the dynamic linker
+wrapper in
+`dom/media/platforms/dom/media/platforms/ffmpeg/{FFmpegLibWrapper.cpp,FFmpegRungtimeLinker.cpp}` with the new version and the new API in this new version.
+
+## `config.h` generation
+
+Configuration files are generated as follow using the configure script (here
+for Linux desktop):
+
+> ./configure --disable-all --enable-avcodec --enable-decoder=vp8,vp9,mp3,flac,av1 \
+ --enable-parser=vp8,vp9 --disable-static --enable-shared \
+ --disable-autodetect --disable-iconv --enable-libdav1d --disable-linux-perf
+
+For Linux Desktop, there are a number of overrides in `config_common.h` for
+VAAPI. We can't put them in `config_components.h` because this breaks the build.
+
+`config_components.h` is common to all platforms, and then a specific config
+file is included, based on the platform and architecture. This needs to be
+regenerated on all OSes. macOS is similar to Linux Desktop. For other OSes,
+instructions below:
+
+# Linux 32-bits from a Linux 64-bits host:
+
+To produce `config_unix32.h` on a 64-bits machine, add to the configure command
+above: `--disable-asm --disable-x86asm --cc='clang -m32'`
+
+Those files shouldn't be Linux-specific, and are included in e.g. various BSDs,
+hence the `--disable-linux-perf` above.
+
+# macOS, x86 and aarch64
+
+Similar to Linux Desktop in all aspects.
+
+# Android
+
+config_android32.h: Only mp3 and flac are enabled on this platform. Assuming
+the standard toolchain location for a Firefox Developer, substitute with the
+ndk version in use when updating:
+
+> ./configure --disable-all --enable-avcodec --enable-decoder=mp3,flac \
+ --disable-static --enable-shared --disable-autodetect \
+ --enable-small --target-os=linux --arch=arm --enable-cross-compile \
+ --cc=$HOME/.mozbuild/android-ndk-r20/toolchains/llvm/prebuilt/darwin-x86_64/bin/armv7a-linux-androideabi16-clang
+
+config_android64.h, config_androidx86_64.h: substitute with aarch64 and the right compiler.
+
+For config_androidx86_64.h, enable vp8 and vp9.
+
+# Windows
+
+The general idea is to get an msys prompt with an msvc toolchain
+configured, so that the configure script for ffmpeg can run successfully
+with the thread flavor Gecko prefers on Windows (win32, not pthreads).
+
+- Open Visual Studio (2019 when writing this)
+- Tools → Command Line → Developer command prompt
+- Check that compiling a small C program with cl.exe works
+- Install msys2 from https://www.msys2.org/
+- From the Visual Studio Developer Command Prompt, run the following:
+ > C:\msys64\msys_shell.cmd -mysy -use-full-path
+- This pops up a new shell window, with a 32-bits build environment
+- Check that compiling a small C program with `cl.exe` works
+- Run ffmpeg's ./configure with the options needed:
+
+> ./configure --disable-all --enable-avcodec
+ --enable-decoder=vp8,vp9,mp3,flac --enable-parser=vp8,vp9
+ --disable-static --enable-shared --disable-autodetect
+ --enable-w32threads --toolchain=msvc
+
+- Copy `config.h` and `config.asm` as `config_win32.h` and `config_win32.asm`
+ in this directory
+- Close the `msys2` window, go back to the `cmd.exe` window
+- Run this command, maybe substituting the Visual Studio version:
+
+> "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" amd64
+
+- This pops up a new shell window, now with a 64-bits build
+ environment
+- Check that compiling a small C program with `cl.exe` works
+- Run ffmpeg's `./configure` with the options needed:
+
+> ./configure --disable-all --enable-avcodec --enable-decoder=vp8,vp9,mp3,flac
+ --enable-parser=vp8,vp9 --disable-static --enable-shared
+ --disable-autodetect --enable-w32threads --toolchain=msvc
+
+- Copy `config.h` and `config.asm` as `config_win64.h` and `config_win64.asm`.
+
+config_aarch64_win64.h: You will need to install cpp (either using msys or
+wsl), then:
+
+> ./configure --disable-all --enable-avcodec --enable-decoder=vp8,vp9,mp3,flac \
+ --enable-parser=vp8,vp9 --disable-static --enable-shared \
+ --disable-autodetect --toolchain=msvc --enable-cross-compile \
+ --target-os=win32 --arch=arm64
+
+
+# Finally
+
+Run the following command on all config* file:
+
+> sed -i -E '/HAVE_(MALLOC_H|ARC4RANDOM|LOCALTIME_R|MEMALIGN|POSIX_MEMALIGN)/d' config.*
+
+to avoid redefined macros.
+
+# Build, fix errors
+
+Missing files need to be added, and the patch to rename `time.h` to `fftime.h`
+might need to be reaplied or extended to other files including `time.h`. The
+issue being that it's included instead of the system header, causing all sorts
+of issues.
+
+`moz.build` files might need to be modified as well, in light of compilation
+and link errors.
+
+There are going to be a lot of changes in terms of symbols exported. Adjust
+`libavutil/avutil.symbols` and `libavcodec/avcodec.symbols` by removing and
+adding symbols until the build passes.