blind-transition.c - blind - suckless command-line video editing utility | |
git clone git://git.suckless.org/blind | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
blind-transition.c (2753B) | |
--- | |
1 /* See LICENSE file for copyright and license details. */ | |
2 #include "common.h" | |
3 | |
4 USAGE("[-ir] [-s softness-stream]") | |
5 | |
6 static size_t fm; | |
7 static double fm_double; | |
8 static float fm_float; | |
9 static int reverse = 0; | |
10 static int invert = 0; | |
11 static const char *softness_file = NULL; | |
12 static struct stream softness; | |
13 | |
14 #define PROCESS(TYPE)\ | |
15 do {\ | |
16 size_t i, j = 0;\ | |
17 TYPE a, s, t = fm ? (TYPE)(reverse ? fm - f : f) / fm_##… | |
18 if (!softness_file) {\ | |
19 for (i = 0; i < n; i += stream->pixel_size) {\ | |
20 a = ((TYPE *)(stream->buf + i))[1];\ | |
21 if (invert)\ | |
22 a = (TYPE)1 - a;\ | |
23 a = (TYPE)(a >= t);\ | |
24 ((TYPE *)(stream->buf + i))[0] = a * (TY… | |
25 ((TYPE *)(stream->buf + i))[1] = a;\ | |
26 ((TYPE *)(stream->buf + i))[2] = a * (TY… | |
27 ((TYPE *)(stream->buf + i))[3] = 1;\ | |
28 }\ | |
29 } else {\ | |
30 for (i = 0; i < n; i += stream->pixel_size, j +=… | |
31 while (j + softness.pixel_size > softnes… | |
32 memmove(softness.buf, softness.b… | |
33 j = 0;\ | |
34 if (!eread_stream(&softness, SIZ… | |
35 return;\ | |
36 }\ | |
37 s = ((TYPE *)(softness.buf + j))[1];\ | |
38 s *= ((TYPE *)(softness.buf + j))[3];\ | |
39 a = ((TYPE *)(stream->buf + i))[1];\ | |
40 if (invert)\ | |
41 a = (TYPE)1 - a;\ | |
42 a = (a / (1 + 2 * s) + s - t) / s;\ | |
43 a = a < 0 ? (TYPE)0 : a > 1 ? (TYPE)1 : … | |
44 ((TYPE *)(stream->buf + i))[0] = a * (TY… | |
45 ((TYPE *)(stream->buf + i))[1] = a;\ | |
46 ((TYPE *)(stream->buf + i))[2] = a * (TY… | |
47 ((TYPE *)(stream->buf + i))[3] = 1;\ | |
48 }\ | |
49 }\ | |
50 } while (0) | |
51 | |
52 static void process_lf(struct stream *stream, size_t n, size_t f) {PROCE… | |
53 static void process_f (struct stream *stream, size_t n, size_t f) {PROCE… | |
54 | |
55 int | |
56 main(int argc, char *argv[]) | |
57 { | |
58 struct stream stream; | |
59 void (*process)(struct stream *stream, size_t n, size_t f); | |
60 | |
61 ARGBEGIN { | |
62 case 'i': | |
63 invert = 1; | |
64 break; | |
65 case 'r': | |
66 reverse = 1; | |
67 break; | |
68 case 's': | |
69 softness_file = UARGF(); | |
70 break; | |
71 default: | |
72 usage(); | |
73 } ARGEND; | |
74 | |
75 if (argc) | |
76 usage(); | |
77 | |
78 eopen_stream(&stream, NULL); | |
79 if (softness_file) { | |
80 eopen_stream(&softness, softness_file); | |
81 echeck_compat(&stream, &softness); | |
82 } | |
83 | |
84 CHECK_ALPHA(&stream); | |
85 CHECK_COLOUR_SPACE(&stream, CIEXYZ); | |
86 if (stream.encoding == DOUBLE) | |
87 process = process_lf; | |
88 else if (stream.encoding == FLOAT) | |
89 process = process_f; | |
90 else | |
91 eprintf("pixel format %s is not supported, try xyza\n", … | |
92 | |
93 if (!stream.frames) | |
94 eprintf("video's length is not recorded"); | |
95 | |
96 fprint_stream_head(stdout, &stream); | |
97 efflush(stdout, "<stdout>"); | |
98 fm_double = (double)(fm = stream.frames - 1); | |
99 fm_float = (float)fm_double; | |
100 process_each_frame_segmented(&stream, STDOUT_FILENO, "<stdout>",… | |
101 return 0; | |
102 } |