diff options
| author | Mattias Andrée <maandree@kth.se> | 2017-01-13 09:05:08 +0100 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2017-01-13 09:05:08 +0100 |
| commit | 4674ec0e4b833ab0d0365225ba99228df14abe87 (patch) | |
| tree | 1b89fe1559fc9a2422e20048700e694a72d17751 /src/blind-stack.c | |
| parent | vu-from-video: fix Y'UV encoding + add vu-to-video (diff) | |
| download | blind-4674ec0e4b833ab0d0365225ba99228df14abe87.tar.gz blind-4674ec0e4b833ab0d0365225ba99228df14abe87.tar.bz2 blind-4674ec0e4b833ab0d0365225ba99228df14abe87.tar.xz | |
Rename to blind
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/blind-stack.c')
| -rw-r--r-- | src/blind-stack.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/blind-stack.c b/src/blind-stack.c new file mode 100644 index 0000000..a03fd91 --- /dev/null +++ b/src/blind-stack.c @@ -0,0 +1,80 @@ +/* See LICENSE file for copyright and license details. */ +#include "stream.h" +#include "util.h" + +#include <fcntl.h> +#include <inttypes.h> +#include <string.h> +#include <unistd.h> + +USAGE("[-b] bottom-stream ... top-stream") + +#define PROCESS_LINEAR_3CH_ALPHA(TYPE, BLEND)\ + do {\ + TYPE x1, y1, z1, a1;\ + TYPE x2, y2, z2, a2;\ + size_t i, j;\ + for (i = 0; i < n; i += streams->pixel_size) {\ + x1 = ((TYPE *)(streams[0].buf + i))[0];\ + y1 = ((TYPE *)(streams[0].buf + i))[1];\ + z1 = ((TYPE *)(streams[0].buf + i))[2];\ + a1 = ((TYPE *)(streams[0].buf + i))[3];\ + for (j = 1; j < n_streams; j++) {\ + x2 = ((TYPE *)(streams[j].buf + i))[0];\ + y2 = ((TYPE *)(streams[j].buf + i))[1];\ + z2 = ((TYPE *)(streams[j].buf + i))[2];\ + a2 = ((TYPE *)(streams[j].buf + i))[3];\ + if (BLEND)\ + a2 /= j + 1;\ + x1 = x1 * a1 * (1 - a2) + x2 * a2;\ + y1 = y1 * a1 * (1 - a2) + y2 * a2;\ + z1 = z1 * a1 * (1 - a2) + z2 * a2;\ + a1 = a1 * (1 - a2) + a2;\ + }\ + ((TYPE *)(streams[0].buf + i))[0] = x1;\ + ((TYPE *)(streams[0].buf + i))[1] = y1;\ + ((TYPE *)(streams[0].buf + i))[2] = z1;\ + ((TYPE *)(streams[0].buf + i))[3] = a1;\ + }\ + } while (0) + +static void process_xyza (struct stream *streams, size_t n_streams, size_t n) { PROCESS_LINEAR_3CH_ALPHA(double, 0); } +static void process_xyza_b(struct stream *streams, size_t n_streams, size_t n) { PROCESS_LINEAR_3CH_ALPHA(double, 1); } + +int +main(int argc, char *argv[]) +{ + struct stream *streams; + size_t n_streams, i; + int blend = 0; + void (*process)(struct stream *streams, size_t n_streams, size_t n) = NULL; + + ARGBEGIN { + case 'b': + blend = 1; + break; + default: + usage(); + } ARGEND; + + if (argc < 2) + usage(); + + n_streams = (size_t)argc; + streams = ecalloc(n_streams, sizeof(*streams)); + + for (i = 0; i < n_streams; i++) { + streams[i].file = argv[i]; + streams[i].fd = eopen(streams[i].file, O_RDONLY); + } + + if (!strcmp(streams->pixfmt, "xyza")) + process = blend ? process_xyza_b : process_xyza; + else + eprintf("pixel format %s is not supported, try xyza\n", streams->pixfmt); + + process_multiple_streams(streams, n_streams, STDOUT_FILENO, "<stdout>", process); + + free(streams); + return 0; +} |
