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