blind-interleave.c - blind - suckless command-line video editing utility
(HTM) git clone git://git.suckless.org/blind
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
blind-interleave.c (1041B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include "common.h"
3
4 USAGE("(file frames) ...")
5
6 int
7 main(int argc, char *argv[])
8 {
9 struct stream *streams;
10 size_t parts, length = 0, *frames, i;
11
12 UNOFLAGS(argc % 2 || !argc);
13
14 parts = (size_t)argc / 2;
15 streams = emalloc2(parts, sizeof(*streams));
16 frames = alloca(parts * sizeof(*frames));
17
18 for (i = 0; i < parts; i++) {
19 eopen_stream(streams + i, argv[i * 2]);
20 frames[i] = etozu_arg("frames", argv[i * 2 + 1], 1, SIZE_MAX);
21 if (i)
22 echeck_compat(streams, streams + i);
23 }
24 for (i = 0; i < parts; i++) {
25 if (!streams[i].frames || streams[i].frames > SIZE_MAX - length) {
26 length = 0;
27 break;
28 }
29 length += streams[i].frames;
30 }
31
32 streams->frames = length;
33 fprint_stream_head(stdout, streams);
34 efflush(stdout, "<stdout>");
35
36 for (i = 0; i < parts; i++, i = i == parts ? 0 : i)
37 if (esend_frames(streams + i, STDOUT_FILENO, frames[i], "<stdout>") != frames[i])
38 break;
39 for (i = 0; i < parts; i++)
40 close(streams[i].fd);
41
42 free(streams);
43 return 0;
44 }