1local arch = 'x86'
2cflags{
3 '-Wno-deprecated-declarations',
4 '-Wno-discarded-qualifiers',
5 '-Wno-stringop-overflow',
6 '-I $dir/include',
7 '-I $outdir',
8 '-I $outdir/include',
9 '-I $outdir/internal',
10 '-I $srcdir',
11 '-I $srcdir/libavcodec',
12 '-isystem $builddir/pkg/linux-headers/include',
13}
14nasmflags{
15 '-i $srcdir/',
16 '-i $srcdir/libavcodec/'..arch..'/',
17 '-i $srcdir/libavutil/'..arch..'/',
18 '-f elf64',
19 '-P $outdir/config.asm',
20}
21
22-- TODO: Copy the rest of the headers.
23pkg.hdrs = {
24 '$outdir/include/libavutil/avconfig.h',
25 '$outdir/include/libavutil/ffversion.h',
26}
27pkg.deps = {
28 '$outdir/config.asm',
29 '$outdir/config.h',
30 '$outdir/config_components.h',
31 '$gendir/headers',
32 'pkg/linux-headers/headers',
33}
34
35local probe = {
36 '$builddir/probe/PIC',
37 '$builddir/probe/HAVE_INLINE_ASM',
38 '$builddir/probe/HAVE_MMINTRIN_H',
39}
40
41build('cat', '$outdir/config.h', {'$dir/config-head.h', probe, '$dir/config.h', '$dir/config-tail.h'})
42build('copy', '$outdir/config_components.h', '$dir/config_components.h')
43build('sed', '$outdir/config.asm', {probe, '$dir/config.h'}, {
44 expr=[[-n -e 's,^# *,%,p']],
45})
46build('awk', '$outdir/config.texi', '$dir/config.h', {
47 expr=[['$$3 == "1" {gsub("_", "-", $$2); print "@set", tolower($$2), "yes"}']],
48})
49build('awk', '$outdir/include/libavutil/avconfig.h', {'$dir/config.h', '|', '$dir/avconfig.awk'}, {
50 expr='-f $dir/avconfig.awk',
51})
52
53rule('genlist', 'lua $dir/list.lua $dir/config_components.h $type $var <$in >$out')
54local function genlist(out, src, type, var)
55 build('genlist', out, {src, '|', '$dir/list.lua', '$dir/config_components.h'}, {type=type, var=var})
56 table.insert(pkg.deps, out)
57end
58genlist('$outdir/internal/libavfilter/filter_list.c', '$srcdir/libavfilter/allfilters.c', 'AVFilter', 'filter_list')
59genlist('$outdir/internal/libavcodec/codec_list.c', '$srcdir/libavcodec/allcodecs.c', 'FFCodec', 'codec_list')
60genlist('$outdir/internal/libavcodec/parser_list.c', '$srcdir/libavcodec/parsers.c', 'AVCodecParser', 'parser_list')
61genlist('$outdir/internal/libavcodec/bsf_list.c', '$srcdir/libavcodec/bitstream_filters.c', 'FFBitStreamFilter', 'bitstream_filters')
62genlist('$outdir/internal/libavformat/demuxer_list.c', '$srcdir/libavformat/allformats.c', 'FFInputFormat', 'demuxer_list')
63genlist('$outdir/internal/libavformat/muxer_list.c', '$srcdir/libavformat/allformats.c', 'FFOutputFormat', 'muxer_list')
64genlist('$outdir/internal/libavdevice/indev_list.c', '$srcdir/libavdevice/alldevices.c', 'FFInputFormat', 'indev_list')
65genlist('$outdir/internal/libavdevice/outdev_list.c', '$srcdir/libavdevice/alldevices.c', 'FFOutputFormat', 'outdev_list')
66genlist('$outdir/internal/libavformat/protocol_list.c', '$srcdir/libavformat/protocols.c', 'URLProtocol', 'url_protocols')
67
68build('awk', '$outdir/include/libavutil/ffversion.h', {'$dir/ver'}, {
69 expr=[['{printf "#define FFMPEG_VERSION \"%s\"\n", $$1}']],
70})
71
72local options = {}
73for _, file in ipairs{'config.h', 'config_components.h'} do
74 for line in iterlines(file, 1) do
75 local cfg, val = line:match('^#define ([^ ]+) ([^ ]+)')
76 if cfg then
77 options[cfg] = val == '1'
78 end
79 end
80end
81local sources = {
82 libavcodec={},
83 libavdevice={},
84 libavfilter={},
85 libavformat={},
86 libavutil={},
87 libswresample={},
88 libswscale={},
89}
90local archs = {
91 ['aarch64']=true,
92 ['alpha']=true,
93 ['arm']=true,
94 ['avr32']=true,
95 ['avr32_ap']=true,
96 ['avr32_uc']=true,
97 ['bfin']=true,
98 ['ia64']=true,
99 ['loongarch']=true,
100 ['m68k']=true,
101 ['mips']=true,
102 ['parisc']=true,
103 ['ppc']=true,
104 ['riscv']=true,
105 ['s390']=true,
106 ['sh4']=true,
107 ['sparc']=true,
108 ['tilegx']=true,
109 ['tilepro']=true,
110 ['x86']=true,
111}
112for line in iterlines('sources.txt', 1) do
113 local i = line:find(' ', 1, true)
114 if i and options[line:sub(1, i - 1)] then
115 for src, lib, dir in line:gmatch('(([%w_-]+)/?([%w_-]*)[%w_/-]*/[%w_.-]+)', i + 1) do
116 if not archs[dir] or dir == arch then
117 sources[lib][src] = true
118 end
119 end
120 end
121end
122-- combination option in libavutil/x86/Makefile
123if not options.HAVE_MMX_INLINE and options.HAVE_MMX_EXTERNAL and not options.HAVE_MM_EMPTY then
124 sources.libavutil['libavutil/x86/emms.asm'] = true
125end
126for lib, srcs in pairs(sources) do
127 sources[lib] = table.keys(srcs)
128end
129
130if options.CONFIG_ALSA_INDEV or options.config_ALSA_OUTDEV then
131 cflags{'-isystem $builddir/pkg/alsa-lib/include'}
132 table.insert(pkg.deps, 'pkg/alsa-lib/headers')
133 table.insert(sources.libavdevice, '$builddir/pkg/alsa-lib/libasound.a')
134end
135
136if options.CONFIG_LIBDAV1D_DECODER then
137 cflags{'-isystem $builddir/pkg/dav1d/include'}
138 table.insert(pkg.deps, 'pkg/dav1d/headers')
139 table.insert(sources.libavcodec, '$builddir/pkg/dav1d/libdav1d.a')
140end
141
142if options.CONFIG_TLS_PROTOCOL and options.CONFIG_LIBTLS then
143 cflags{'-isystem $builddir/pkg/libtls-bearssl/include'}
144 table.insert(pkg.deps, 'pkg/libtls-bearssl/headers')
145 table.insert(sources.libavformat, '$builddir/pkg/libtls-bearssl/libtls.a.d')
146end
147
148if options.CONFIG_TLS_PROTOCOL and options.CONFIG_OPENSSL then
149 cflags{'-isystem $builddir/pkg/libressl/include'}
150 table.insert(pkg.deps, 'pkg/libressl/headers')
151 table.insert(sources.libavformat, '$builddir/pkg/libressl/libssl.a.d')
152end
153
154if options.CONFIG_LIBOPUS_ENCODER or options.CONFIG_LIBOPUS_DECODER then
155 cflags{'-isystem $builddir/pkg/opus/include'}
156 table.insert(pkg.deps, 'pkg/opus/headers')
157 table.insert(sources.libavcodec, '$builddir/pkg/opus/libopus.a')
158end
159
160if options.CONFIG_ZLIB then
161 cflags{'-isystem $builddir/pkg/zlib/include'}
162 table.insert(pkg.deps, 'pkg/zlib/headers')
163 table.insert(sources.libavcodec, '$builddir/pkg/zlib/libz.a')
164 table.insert(sources.libavformat, '$builddir/pkg/zlib/libz.a')
165end
166
167sub('lib.ninja', function()
168cflags{'-D HAVE_AV_CONFIG_H'}
169lib('libavcodec.a', {
170 expand{'libavcodec/', {
171 'ac3_parser.c',
172 'adts_parser.c',
173 'allcodecs.c',
174 'avcodec.c',
175 'avdct.c',
176 'avfft.c',
177 'avpacket.c',
178 'bitstream.c',
179 'bitstream_filters.c',
180 'bsf.c',
181 'codec_desc.c',
182 'codec_par.c',
183 'd3d11va.c',
184 'decode.c',
185 'dirac.c',
186 'dv_profile.c',
187 'encode.c',
188 'get_buffer.c',
189 'imgconvert.c',
190 'jni.c',
191 'mathtables.c',
192 'mediacodec.c',
193 'mpeg12framerate.c',
194 'options.c',
195 'parser.c',
196 'parsers.c',
197 'profiles.c',
198 'qsv_api.c',
199 'raw.c',
200 'refstruct.c',
201 'utils.c',
202 'version.c',
203 'vlc.c',
204 'vorbis_parser.c',
205 'xiph.c',
206 'x86/constants.c',
207 }},
208 sources.libavcodec,
209 'libavutil.a',
210})
211
212lib('libavdevice.a', {
213 expand{'libavdevice/', {
214 'alldevices.c',
215 'avdevice.c',
216 'utils.c',
217 'version.c',
218 }},
219 sources.libavdevice,
220 'libavcodec.a.d',
221 'libavformat.a.d',
222 'libavutil.a',
223})
224
225lib('libavfilter.a', {
226 expand{'libavfilter/', {
227 'allfilters.c',
228 'audio.c',
229 'avfilter.c',
230 'avfiltergraph.c',
231 'buffersink.c',
232 'buffersrc.c',
233 'colorspace.c',
234 'ccfifo.c',
235 'drawutils.c',
236 'formats.c',
237 'framepool.c',
238 'framequeue.c',
239 'graphdump.c',
240 'graphparser.c',
241 'version.c',
242 'video.c',
243 }},
244 sources.libavfilter,
245 'libavutil.a',
246})
247
248cc('libavformat/protocols.c', {'$gendir/deps', '$outdir/internal/libavformat/protocol_list.c'})
249lib('libavformat.a', {
250 expand{'libavformat/', {
251 'allformats.c',
252 'avformat.c',
253 'avio.c',
254 'aviobuf.c',
255 'demux.c',
256 'demux_utils.c',
257 'dump.c',
258 'dv.c',
259 'format.c',
260 'id3v1.c',
261 'id3v2.c',
262 'isom_tags.c',
263 'metadata.c',
264 'mux.c',
265 'mux_utils.c',
266 'options.c',
267 'os_support.c',
268 'protocols.c.o',
269 'riff.c',
270 'sdp.c',
271 'seek.c',
272 'url.c',
273 'utils.c',
274 'version.c',
275 }},
276 sources.libavformat,
277 'libavcodec.a.d',
278 'libavutil.a',
279})
280
281lib('libavutil.a', {
282 expand{'libavutil/', {
283 'adler32.c',
284 'aes.c',
285 'aes_ctr.c',
286 'ambient_viewing_environment.c',
287 'audio_fifo.c',
288 'avstring.c',
289 'avsscanf.c',
290 'base64.c',
291 'blowfish.c',
292 'bprint.c',
293 'buffer.c',
294 'cast5.c',
295 'camellia.c',
296 'channel_layout.c',
297 'cpu.c',
298 'crc.c',
299 'csp.c',
300 'des.c',
301 'detection_bbox.c',
302 'dict.c',
303 'display.c',
304 'dovi_meta.c',
305 'downmix_info.c',
306 'encryption_info.c',
307 'error.c',
308 'eval.c',
309 'executor.c',
310 'fifo.c',
311 'file.c',
312 'file_open.c',
313 'float_dsp.c',
314 'fixed_dsp.c',
315 'frame.c',
316 'hash.c',
317 'hdr_dynamic_metadata.c',
318 'hdr_dynamic_vivid_metadata.c',
319 'hmac.c',
320 'hwcontext.c',
321 'iamf.c',
322 'imgutils.c',
323 'integer.c',
324 'intmath.c',
325 'lfg.c',
326 'lls.c',
327 'log.c',
328 'log2_tab.c',
329 'lzo.c',
330 'mathematics.c',
331 'mastering_display_metadata.c',
332 'md5.c',
333 'mem.c',
334 'murmur3.c',
335 'opt.c',
336 'parseutils.c',
337 'pixdesc.c',
338 'pixelutils.c',
339 'random_seed.c',
340 'rational.c',
341 'reverse.c',
342 'rc4.c',
343 'ripemd.c',
344 'samplefmt.c',
345 'sha.c',
346 'sha512.c',
347 'slicethread.c',
348 'spherical.c',
349 'stereo3d.c',
350 'threadmessage.c',
351 'time.c',
352 'timecode.c',
353 'timestamp.c',
354 'tree.c',
355 'twofish.c',
356 'utils.c',
357 'xga_font_data.c',
358 'xtea.c',
359 'tea.c',
360 'tx.c',
361 'tx_float.c',
362 'tx_double.c',
363 'tx_int32.c',
364 'uuid.c',
365 'version.c',
366 'video_enc_params.c',
367 'video_hint.c',
368 'film_grain_params.c',
369 'x86/cpu.c',
370 'x86/fixed_dsp_init.c',
371 'x86/float_dsp_init.c',
372 'x86/imgutils_init.c',
373 'x86/lls_init.c',
374 'x86/cpuid.asm',
375 'x86/fixed_dsp.asm',
376 'x86/float_dsp.asm',
377 'x86/imgutils.asm',
378 'x86/lls.asm',
379 'x86/tx_float.asm',
380 }},
381 sources.libavutil,
382})
383
384lib('libswresample.a', {
385 expand{'libswresample/', {
386 'audioconvert.c',
387 'dither.c',
388 'options.c',
389 'rematrix.c',
390 'resample.c',
391 'resample_dsp.c',
392 'swresample.c',
393 'swresample_frame.c',
394 'version.c',
395 'x86/audio_convert.asm',
396 'x86/rematrix.asm',
397 'x86/resample.asm',
398 'x86/audio_convert_init.c',
399 'x86/rematrix_init.c',
400 'x86/resample_init.c',
401 }},
402 sources.libswresample,
403 'libavutil.a',
404})
405
406lib('libswscale.a', {
407 expand{'libswscale/', {
408 'alphablend.c',
409 'hscale.c',
410 'hscale_fast_bilinear.c',
411 'gamma.c',
412 'half2float.c',
413 'input.c',
414 'options.c',
415 'output.c',
416 'rgb2rgb.c',
417 'slice.c',
418 'swscale.c',
419 'swscale_unscaled.c',
420 'utils.c',
421 'version.c',
422 'yuv2rgb.c',
423 'vscale.c',
424 'x86/rgb2rgb.c',
425 'x86/swscale.c',
426 'x86/yuv2rgb.c',
427 'x86/hscale_fast_bilinear_simd.c',
428 'x86/input.asm',
429 'x86/output.asm',
430 'x86/scale.asm',
431 'x86/scale_avx2.asm',
432 'x86/rgb_2_rgb.asm',
433 'x86/yuv_2_rgb.asm',
434 'x86/yuv2yuvX.asm',
435 }},
436 sources.libswscale,
437 'libavutil.a',
438})
439end)
440
441local libs = {
442 'libavcodec.a.d',
443 'libavdevice.a.d',
444 'libavfilter.a.d',
445 'libavformat.a.d',
446 'libavutil.a',
447 'libswresample.a.d',
448 'libswscale.a.d',
449}
450
451cc('fftools/cmdutils.c', {'$gendir/deps'})
452cc('fftools/opt_common.c', {'$gendir/deps'})
453
454exe('ffprobe', {paths[[fftools/(ffprobe.c cmdutils.c.o opt_common.c.o)]], libs})
455file('bin/ffprobe', '755', '$outdir/ffprobe')
456
457exe('ffmpeg', {paths[[
458 fftools/(
459 ffmpeg.c
460 ffmpeg_dec.c
461 ffmpeg_demux.c
462 ffmpeg_enc.c
463 ffmpeg_filter.c
464 ffmpeg_hw.c
465 ffmpeg_mux.c
466 ffmpeg_mux_init.c
467 ffmpeg_opt.c
468 ffmpeg_sched.c
469 objpool.c
470 sync_queue.c
471 thread_queue.c
472 cmdutils.c.o
473 opt_common.c.o
474 )
475]], libs})
476file('bin/ffmpeg', '755', '$outdir/ffmpeg')
477
478rule('texi2mdoc', [[$builddir/pkg/texi2mdoc/host/texi2mdoc -d 'August 2, 2024' -I $outdir $in >$out]])
479build('texi2mdoc', '$outdir/ffprobe.1', {'$srcdir/doc/ffprobe.texi', '|', '$outdir/config.texi', '$builddir/pkg/texi2mdoc/host/texi2mdoc'})
480build('texi2mdoc', '$outdir/ffmpeg.1', {'$srcdir/doc/ffmpeg.texi', '|', '$outdir/config.texi', '$builddir/pkg/texi2mdoc/host/texi2mdoc'})
481man{'$outdir/ffprobe.1', '$outdir/ffmpeg.1'}
482
483fetch 'git'