commit 4751eda976c09f2409e93364b6b76fdc950bcda6
parent b518ce8977c0b97dd2236fc8cbc7dad1dd70511b
Author: Mattias Andrée <maandree@kth.se>
Date: Fri, 2 Jun 2017 21:30:19 +0200
Add blind-interleave, blind-cat-rows, and blind-cat-cols
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat:
5 files changed, 134 insertions(+), 3 deletions(-)
diff --git a/Makefile b/Makefile
@@ -3,6 +3,8 @@ include $(CONFIGFILE)
BIN =\
blind-arithm\
+ blind-cat-cols\
+ blind-cat-rows\
blind-colour-ciexyz\
blind-colour-srgb\
blind-compress\
@@ -22,6 +24,7 @@ BIN =\
blind-from-text\
blind-from-video\
blind-gauss-blur\
+ blind-interleave\
blind-invert-luma\
blind-make-kernel\
blind-next-frame\
diff --git a/TODO b/TODO
@@ -1,8 +1,11 @@
Write manpages for:
+ blind-interleave framewise interleave videos
blind-disperse inverse of blind-interleave
Useful for processing a video on multiple computers
blind-split-rows split stream into multiple streams by splitting video horizontally
blind-split-cols split stream into multiple streams by splitting video vertically
+ blind-cat-rows merge video by vertically stacking streams (inverse of blind-split-rows)
+ blind-cat-cols merge video by putting streams beside each other (inverse of blind-split-cols)
blind-transform affine transformation by matrix multiplication, -t for tiling, -s for
improve quality on downscaling (pixels' neighbours must not change).
@@ -22,7 +25,6 @@ blind-affine-colour apply an affine transformation to the colour of each pixel,
-p for transforming each pixel with their own transformation.
blind-invert-chroma invert the chroma
blind-from-sent convert a sent presentation to a one-frame-per-slide blind video.
-blind-interleave framewise interleave videos
blind-kirsch https://en.wikipedia.org/wiki/Kirsch_operator
blind-gaussian-noise https://en.wikipedia.org/wiki/Gaussian_noise
@@ -48,8 +50,6 @@ blind-mean mean of multiple streams
https://en.wikipedia.org/wiki/Logarithmic_mean
https://en.wikipedia.org/wiki/Stolarsky_mean
blind-temporal-arithm blind-arithm but over all frames in a video instead of over all streams
-blind-cat-rows merge video by vertically stacking streams (inverse of blind-split-rows)
-blind-cat-cols merge video by putting streams beside each other (inverse of blind-split-cols)
blind-from-video: add options to:
* just run ffmpeg just print the output
diff --git a/src/blind-cat-cols.c b/src/blind-cat-cols.c
@@ -0,0 +1,42 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("(file columns) ...")
+
+int
+main(int argc, char *argv[])
+{
+ struct stream *streams;
+ size_t parts, width = 0, *cols, i;
+
+ UNOFLAGS(argc % 2 || !argc);
+
+ parts = (size_t)argc / 2;
+ streams = emalloc2(parts, sizeof(*streams));
+ cols = alloca(parts * sizeof(*cols));
+
+ for (i = 0; i < parts; i++) {
+ eopen_stream(streams + i, argv[i * 2]);
+ cols[i] = etozu_arg("columns", argv[i * 2 + 1], 1, SIZE_MAX);
+ if (streams[i].width > SIZE_MAX - width)
+ eprintf("output video is too tall\n");
+ width += streams[i].width;
+ if (i) {
+ streams[i].width = streams->width;
+ echeck_compat(streams, streams + i);
+ }
+ }
+
+ streams->width = width;
+ fprint_stream_head(stdout, streams);
+ efflush(stdout, "<stdout>");
+
+ for (i = 0; i < parts; i++, i = i == parts ? 0 : i)
+ if (esend_pixels(streams + i, STDOUT_FILENO, cols[i], "<stdout>") != cols[i])
+ break;
+ for (i = 0; i < parts; i++)
+ close(streams[i].fd);
+
+ free(streams);
+ return 0;
+}
diff --git a/src/blind-cat-rows.c b/src/blind-cat-rows.c
@@ -0,0 +1,42 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("(file rows) ...")
+
+int
+main(int argc, char *argv[])
+{
+ struct stream *streams;
+ size_t parts, height = 0, *rows, i;
+
+ UNOFLAGS(argc % 2 || !argc);
+
+ parts = (size_t)argc / 2;
+ streams = emalloc2(parts, sizeof(*streams));
+ rows = alloca(parts * sizeof(*rows));
+
+ for (i = 0; i < parts; i++) {
+ eopen_stream(streams + i, argv[i * 2]);
+ rows[i] = etozu_arg("rows", argv[i * 2 + 1], 1, SIZE_MAX);
+ if (streams[i].height > SIZE_MAX - height)
+ eprintf("output video is too wide\n");
+ height += streams[i].height;
+ if (i) {
+ streams[i].height = streams->height;
+ echeck_compat(streams, streams + i);
+ }
+ }
+
+ streams->height = height;
+ fprint_stream_head(stdout, streams);
+ efflush(stdout, "<stdout>");
+
+ for (i = 0; i < parts; i++, i = i == parts ? 0 : i)
+ if (esend_rows(streams + i, STDOUT_FILENO, rows[i], "<stdout>") != rows[i])
+ break;
+ for (i = 0; i < parts; i++)
+ close(streams[i].fd);
+
+ free(streams);
+ return 0;
+}
diff --git a/src/blind-interleave.c b/src/blind-interleave.c
@@ -0,0 +1,44 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("(file frames) ...")
+
+int
+main(int argc, char *argv[])
+{
+ struct stream *streams;
+ size_t parts, length = 0, *frames, i;
+
+ UNOFLAGS(argc % 2 || !argc);
+
+ parts = (size_t)argc / 2;
+ streams = emalloc2(parts, sizeof(*streams));
+ frames = alloca(parts * sizeof(*frames));
+
+ for (i = 0; i < parts; i++) {
+ eopen_stream(streams + i, argv[i * 2]);
+ frames[i] = etozu_arg("frames", argv[i * 2 + 1], 1, SIZE_MAX);
+ if (i)
+ echeck_compat(streams, streams + i);
+ }
+ for (i = 0; i < parts; i++) {
+ if (!streams[i].frames || streams[i].frames > SIZE_MAX - length) {
+ length = 0;
+ break;
+ }
+ length += streams[i].frames;
+ }
+
+ streams->frames = length;
+ fprint_stream_head(stdout, streams);
+ efflush(stdout, "<stdout>");
+
+ for (i = 0; i < parts; i++, i = i == parts ? 0 : i)
+ if (esend_frames(streams + i, STDOUT_FILENO, frames[i], "<stdout>") != frames[i])
+ break;
+ for (i = 0; i < parts; i++)
+ close(streams[i].fd);
+
+ free(streams);
+ return 0;
+}