1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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.
|