Introduction
Introduction Statistics Contact Development Disclaimer Help
blind-temporal-arithm.c - blind - suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log
Files
Refs
README
LICENSE
---
blind-temporal-arithm.c (2413B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include "common.h"
3
4 USAGE("operation")
5
6 /* Because the syntax for a function returning a function pointer is dis…
7 typedef void (*process_func)(struct stream *stream, void *image);
8
9 #define LIST_OPERATORS(PIXFMT, TYPE)\
10 X(add, *img + *buf, PIXFMT, TYPE)\
11 X(mul, *img * *buf, PIXFMT, TYPE)\
12 X(min, MIN(*img, *buf), PIXFMT, TYPE)\
13 X(max, MAX(*img, *buf), PIXFMT, TYPE)
14
15 #define X(NAME, ALGO, PIXFMT, TYPE)\
16 static void\
17 process_##PIXFMT##_##NAME(struct stream *stream, void *image)\
18 {\
19 TYPE *buf, *img = image;\
20 size_t i, n, j = 0, m = stream->frame_size / sizeof(TYPE…
21 do {\
22 n = stream->ptr / sizeof(TYPE);\
23 buf = (TYPE *)(stream->buf);\
24 for (i = 0; i < n; i++, buf++) {\
25 *img = ALGO;\
26 if (++j == m) {\
27 j = 0;\
28 img = image;\
29 } else {\
30 img++;\
31 }\
32 }\
33 n *= sizeof(TYPE);\
34 memmove(stream->buf, stream->buf + n, stream->pt…
35 } while (eread_stream(stream, SIZE_MAX));\
36 }
37 LIST_OPERATORS(lf, double)
38 LIST_OPERATORS(f, float)
39 #undef X
40
41 static process_func
42 get_process_lf(const char *operation)
43 {
44 #define X(NAME, _ALGO, PIXFMT, TYPE)\
45 if (!strcmp(operation, #NAME)) return process_##PIXFMT##_##NAME;
46 LIST_OPERATORS(lf, double)
47 #undef X
48 eprintf("algorithm not recognised: %s\n", operation);
49 return NULL;
50 }
51
52 static process_func
53 get_process_f(const char *operation)
54 {
55 #define X(NAME, _ALGO, PIXFMT, TYPE)\
56 if (!strcmp(operation, #NAME)) return process_##PIXFMT##_##NAME;
57 LIST_OPERATORS(f, float)
58 #undef X
59 eprintf("algorithm not recognised: %s\n", operation);
60 return NULL;
61 }
62
63 int
64 main(int argc, char *argv[])
65 {
66 struct stream stream;
67 process_func process;
68 char *img;
69
70 UNOFLAGS(argc != 1);
71
72 eopen_stream(&stream, NULL);
73
74 if (stream.encoding == DOUBLE)
75 process = get_process_lf(argv[0]);
76 else if (stream.encoding == FLOAT)
77 process = get_process_f(argv[0]);
78 else
79 eprintf("pixel format %s is not supported, try xyza\n", …
80
81 echeck_dimensions(&stream, WIDTH | HEIGHT, NULL);
82 img = emalloc(stream.frame_size);
83 if (!eread_frame(&stream, img))
84 eprintf("video has no frames\n");
85
86 process(&stream, img);
87 if (stream.ptr)
88 eprintf("%s: incomplete frame\n", stream.file);
89
90 stream.frames = 1;
91 fprint_stream_head(stdout, &stream);
92 efflush(stdout, "<stdout>");
93 ewriteall(STDOUT_FILENO, img, stream.frame_size, "<stdout>");
94 free(img);
95 return 0;
96 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.