blind-sinc-wave.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-sinc-wave.c (3022B)
---
1 /* See LICENSE file for copyright and license details. */
2 #ifndef TYPE
3 #include "common.h"
4
5 USAGE("[-e] [theta0-stream]")
6
7 static int equal = 0;
8
9 #define FILE "blind-sinc-wave.c"
10 #include "define-functions.h"
11
12 int
13 main(int argc, char *argv[])
14 {
15 struct stream stream, theta0;
16 int have_theta0;
17 void (*process)(struct stream *grad, struct stream *theta0);
18
19 ARGBEGIN {
20 case 'e':
21 equal = 1;
22 break;
23 default:
24 usage();
25 } ARGEND;
26
27 if (argc > 1)
28 usage();
29
30 eopen_stream(&stream, NULL);
31 if ((have_theta0 = argc == 1)) {
32 eopen_stream(&theta0, argv[0]);
33 if (theta0.width != 1 || theta0.height != 1)
34 eprintf("theta0-stream must be of dimension 1x1\n");
35 }
36
37 SELECT_PROCESS_FUNCTION(&stream);
38 CHECK_CHANS(&stream, == 3, == 1);
39 CHECK_N_CHAN(&stream, 4, 4);
40
41 if (have_theta0 && strcmp(stream.pixfmt, theta0.pixfmt))
42 eprintf("videos use incompatible pixel formats\n");
43
44 echeck_dimensions(&stream, WIDTH | HEIGHT, NULL);
45
46 fprint_stream_head(stdout, &stream);
47 efflush(stdout, "<stdout>");
48 process(&stream, have_theta0 ? &theta0 : NULL);
49 return 0;
50 }
51
52 #else
53
54 static void
55 PROCESS(struct stream *grad, struct stream *theta0)
56 {
57 size_t i, n, m = 0;
58 TYPE *theta0xyza;
59 TYPE x, theta0x = 0;
60 TYPE y, theta0y = 0;
61 TYPE z, theta0z = 0;
62 TYPE a, theta0a = 0;
63 do {
64 if (!m) {
65 m = grad->frame_size;
66 if (theta0) {
67 while (theta0->ptr < theta0->frame_size)
68 if (!eread_stream(theta0, theta0->frame_size - theta0->ptr))
69 return;
70 theta0xyza = (TYPE *)theta0->buf;
71 theta0x = (theta0xyza)[0];
72 theta0y = (theta0xyza)[1];
73 theta0z = (theta0xyza)[2];
74 theta0a = (theta0xyza)[3];
75 memmove(theta0->buf, theta0->buf + theta0->frame_size,
76 theta0->ptr -= theta0->frame_size);
77 }
78 }
79 n = MIN(grad->ptr, m) / grad->pixel_size;
80 if (equal) {
81 for (i = 0; i < n; i++) {
82 a = ((TYPE *)(grad->buf))[4 * i + 3];
83 a = (a ? sin(a + theta0y) / a : sin(a + theta0y)) / 2 + (TYPE)0.5;
84 ((TYPE *)(grad->buf))[4 * i + 0] = a;
85 ((TYPE *)(grad->buf))[4 * i + 1] = a;
86 ((TYPE *)(grad->buf))[4 * i + 2] = a;
87 ((TYPE *)(grad->buf))[4 * i + 3] = a;
88 }
89 } else {
90 for (i = 0; i < n; i++) {
91 x = ((TYPE *)(grad->buf))[4 * i + 0];
92 y = ((TYPE *)(grad->buf))[4 * i + 1];
93 z = ((TYPE *)(grad->buf))[4 * i + 2];
94 a = ((TYPE *)(grad->buf))[4 * i + 3];
95 x = (x ? sin(x + theta0x) / x : sin(x + theta0x)) / 2 + (TYPE)0.5;
96 y = (y ? sin(y + theta0y) / y : sin(y + theta0y)) / 2 + (TYPE)0.5;
97 z = (z ? sin(z + theta0z) / z : sin(z + theta0z)) / 2 + (TYPE)0.5;
98 a = (a ? sin(a + theta0a) / a : sin(a + theta0a)) / 2 + (TYPE)0.5;
99 ((TYPE *)(grad->buf))[4 * i + 0] = x;
100 ((TYPE *)(grad->buf))[4 * i + 1] = y;
101 ((TYPE *)(grad->buf))[4 * i + 2] = z;
102 ((TYPE *)(grad->buf))[4 * i + 3] = a;
103 }
104 }
105 n *= grad->pixel_size;
106 m -= n;
107 ewriteall(STDOUT_FILENO, grad->buf, n, "<stdout>");
108 memmove(grad->buf, grad->buf + n, grad->ptr -= n);
109 } while (eread_stream(grad, SIZE_MAX));
110 if (grad->ptr)
111 eprintf("%s: incomplete frame\n", grad->file);
112 }
113
114 #endif