| blind-sinc-wave.c - blind - suckless command-line video editing utility | |
| git clone git://git.suckless.org/blind | |
| Log | |
| Files | |
| Refs | |
| README | |
| 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\… | |
| 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… | |
| 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 + theta… | |
| 76 theta0->ptr -= theta0->frame_siz… | |
| 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 + … | |
| 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 + … | |
| 96 y = (y ? sin(y + theta0y) / y : sin(y + … | |
| 97 z = (z ? sin(z + theta0z) / z : sin(z + … | |
| 98 a = (a ? sin(a + theta0a) / a : sin(a + … | |
| 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 |