Introduction
Introduction Statistics Contact Development Disclaimer Help
Add blind-dual-key - blind - suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log
Files
Refs
README
LICENSE
---
commit 34d326d46d31332fa2182793475672617933a939
parent 88752940275b41cf4b8c978f226ff7d55a5f6575
Author: Mattias Andrée <[email protected]>
Date: Wed, 5 Jul 2017 19:29:13 +0200
Add blind-dual-key
Signed-off-by: Mattias Andrée <[email protected]>
Diffstat:
M Makefile | 1 +
M README | 3 +++
A man/blind-dual-key.1 | 55 +++++++++++++++++++++++++++++…
M man/blind.7 | 3 +++
A src/blind-dual-key.c | 81 ++++++++++++++++++++++++++++++
5 files changed, 143 insertions(+), 0 deletions(-)
---
diff --git a/Makefile b/Makefile
@@ -20,6 +20,7 @@ BIN =\
blind-dissolve\
blind-dot-product\
blind-double-sine-wave\
+ blind-dual-key\
blind-extend\
blind-extract-alpha\
blind-find-rectangle\
diff --git a/README b/README
@@ -60,6 +60,9 @@ UTILITIES
blind-double-sine-wave(1)
Apply double-sine-wave repetition to gradient
+ blind-dual-key(1)
+ Apply transparency to a video based on two videos and two key
+
blind-extend(1)
Add margins to a video
diff --git a/man/blind-dual-key.1 b/man/blind-dual-key.1
@@ -0,0 +1,55 @@
+.TH BLIND-DUAL-KEY 1 blind
+.SH NAME
+blind-dual-key - Apply transparency to a video based on two videos and two key
+.SH SYNOPSIS
+.B blind-dual-key
+.I X
+.I Y
+.I Z
+.I dual-X
+.I dual-Y
+.I dual-Z
+.I dual-video
+.SH DESCRIPTION
+.B blind-dual-key
+reads a video from stdin and a video
+.IR dual-video .
+These two videos should be idential, except
+with two different background colours. The
+background colour used in the video from
+stdin should be specified in the arguments
+.IR X ,
+.IR Y ,
+and
+.IR Z ,
+using the CIE XYZ colour model. The
+background colour used in the video from
+.I dual-video
+should be specified in the arguments
+.IR dual-X ,
+.IR dual-Y ,
+and
+.IR dual-Z ,
+using the CIE XYZ colour model. Using this information,
+.B blind-dual-key
+reconstruct the alpha channel of the video
+and prints the video with its alpha channel to
+stdout.
+.SH NOTES
+.B blind-dual-key
+may be changed in the future to use some other colour model,
+therefore, it is recommended to also use
+.BR blind-colour-ciexyz (1)
+if you are specifying the colour in CIE XYZ.
+.P
+When making a video whose transparancy is recovered with
+.BR blind-dual-key ,
+select to opposite background colours, for
+example black and white or green and magenta.
+.SH SEE ALSO
+.BR blind (7),
+.BR blind-colour-ciexyz (1),
+.BR blind-colour-srgb (1)
+.SH AUTHORS
+Mattias Andrée
+.RI < [email protected] >
diff --git a/man/blind.7 b/man/blind.7
@@ -76,6 +76,9 @@ Calculate the dot product of colours in a video
.BR blind-double-sine-wave (1)
Apply double-sine-wave repetition to gradient
.TP
+.BR blind-dual-key(1)
+Apply transparency to a video based on two videos and two key
+.TP
.BR blind-extend (1)
Add margins to a video
.TP
diff --git a/src/blind-dual-key.c b/src/blind-dual-key.c
@@ -0,0 +1,81 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+
+USAGE("[-m] X Y Z dual-X dual-Y dual-Z dual-stream")
+
+static double X1, Y1, Z1, X2, Y2, Z2;
+
+#define PROCESS(TYPE)\
+ do {\
+ size_t i;\
+ TYPE x1k = (TYPE)X1, y1k = (TYPE)Y1, z1k = (TYPE)Z1;\
+ TYPE x2k = (TYPE)X2, y2k = (TYPE)Y2, z2k = (TYPE)Z2;\
+ TYPE x1, y1, z1, a1, x2, y2, z2, a2;\
+ TYPE alpha, xalpha, yalpha, zalpha;\
+ for (i = 0; i < n; i += stream->pixel_size) {\
+ x1 = ((TYPE *)(stream->buf + i))[0];\
+ y1 = ((TYPE *)(stream->buf + i))[1];\
+ z1 = ((TYPE *)(stream->buf + i))[2];\
+ a1 = ((TYPE *)(stream->buf + i))[3];\
+ x2 = ((TYPE *)(dual->buf + i))[0];\
+ y2 = ((TYPE *)(dual->buf + i))[1];\
+ z2 = ((TYPE *)(dual->buf + i))[2];\
+ a2 = ((TYPE *)(dual->buf + i))[3];\
+ if (x1 == x2 && y1 == y2 && z1 == z2) {\
+ if (a1 != a2)\
+ ((TYPE *)(stream->buf + i))[3] = (a1 +…
+ continue;\
+ }\
+ xalpha = x1 == x2 ? (TYPE)0 : (x2 - x1 + x1k - x2k) / …
+ yalpha = y1 == y2 ? (TYPE)0 : (y2 - y1 + y1k - y2k) / …
+ zalpha = z1 == z2 ? (TYPE)0 : (z2 - z1 + z1k - z2k) / …
+ alpha = xalpha > yalpha ? xalpha : yalpha;\
+ alpha = alpha > zalpha ? alpha : zalpha;\
+ if (!alpha) {\
+ ((TYPE *)(stream->buf + i))[0] = (TYPE)0;\
+ ((TYPE *)(stream->buf + i))[1] = (TYPE)0;\
+ ((TYPE *)(stream->buf + i))[2] = (TYPE)0;\
+ ((TYPE *)(stream->buf + i))[3] = (TYPE)0;\
+ } else {\
+ ((TYPE *)(stream->buf + i))[0] = ((x1 - x1k + …
+ ((TYPE *)(stream->buf + i))[1] = ((y1 - y1k + …
+ ((TYPE *)(stream->buf + i))[2] = ((z1 - z1k + …
+ ((TYPE *)(stream->buf + i))[3] = (a1 + a2) / 2…
+ }\
+ }\
+ } while (0)
+
+static void process_lf(struct stream *stream, struct stream *dual, size_t n) {…
+static void process_f (struct stream *stream, struct stream *dual, size_t n) {…
+
+int
+main(int argc, char *argv[])
+{
+ struct stream stream, dual;
+ void (*process)(struct stream *stream, struct stream *dual, size_t n);
+
+ UNOFLAGS(argc != 7);
+
+ X1 = etolf_arg("the X value", argv[0]);
+ Y1 = etolf_arg("the Y value", argv[1]);
+ Z1 = etolf_arg("the Z value", argv[2]);
+
+ X2 = etolf_arg("the dual-X value", argv[3]);
+ Y2 = etolf_arg("the dual-Y value", argv[4]);
+ Z2 = etolf_arg("the dual-Z value", argv[5]);
+
+ eopen_stream(&stream, NULL);
+ eopen_stream(&dual, argv[6]);
+
+ if (!strcmp(stream.pixfmt, "xyza"))
+ process = process_lf;
+ else if (!strcmp(stream.pixfmt, "xyza f"))
+ process = process_f;
+ else
+ eprintf("pixel format %s is not supported, try xyza\n", stream…
+
+ fprint_stream_head(stdout, &stream);
+ efflush(stdout, "<stdout>");
+ process_two_streams(&stream, &dual, STDOUT_FILENO, "<stdout>", process…
+ return 0;
+}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.