aboutsummaryrefslogtreecommitdiffstats
path: root/src/blind-stack.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2017-01-13 09:05:08 +0100
committerMattias Andrée <maandree@kth.se>2017-01-13 09:05:08 +0100
commit4674ec0e4b833ab0d0365225ba99228df14abe87 (patch)
tree1b89fe1559fc9a2422e20048700e694a72d17751 /src/blind-stack.c
parentvu-from-video: fix Y'UV encoding + add vu-to-video (diff)
downloadblind-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.c80
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;
+}