master hovercats/oakiss / pkg / ffmpeg / gen.lua
  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'