aboutsummaryrefslogtreecommitdiffstats
path: root/src/blind-chroma-key.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/blind-chroma-key.c')
-rw-r--r--src/blind-chroma-key.c116
1 files changed, 60 insertions, 56 deletions
diff --git a/src/blind-chroma-key.c b/src/blind-chroma-key.c
index b9deadb..f670317 100644
--- a/src/blind-chroma-key.c
+++ b/src/blind-chroma-key.c
@@ -1,64 +1,11 @@
/* See LICENSE file for copyright and license details. */
+#ifndef TYPE
#include "common.h"
USAGE("key-stream")
-#define PROCESS(TYPE, SUFFIX)\
- static void\
- process_##SUFFIX(struct stream *stream, struct stream *key)\
- {\
- size_t i, n, m = 0;\
- TYPE x1, y1, z1, a1, a2, variance2, *keyxyza;\
- TYPE x, y, z, d;\
- do {\
- if (!m) {\
- m = stream->frame_size;\
- while (key->ptr < key->frame_size)\
- if (!eread_stream(key, key->frame_size - key->ptr))\
- return;\
- keyxyza = (TYPE *)(key->buf);\
- x1 = keyxyza[0];\
- y1 = keyxyza[1];\
- z1 = keyxyza[2];\
- a1 = keyxyza[3];\
- x = x1 - keyxyza[4];\
- y = y1 - keyxyza[5];\
- z = z1 - keyxyza[6];\
- a2 = keyxyza[7];\
- variance2 = x * x + y * y + z * z;\
- /* TODO add more formulae: https://en.wikipedia.org/wiki/Color_difference */\
- if (a2 > a1) {\
- a1 = 1 - a1;\
- a2 = 1 - a2;\
- }\
- memmove(key->buf, key->buf + key->frame_size,\
- key->ptr -= key->frame_size);\
- }\
- n = MIN(stream->ptr, m) / stream->pixel_size;\
- for (i = 0; i < n; i++) {\
- x = ((TYPE *)(stream->buf))[4 * i + 0] - x1;\
- y = ((TYPE *)(stream->buf))[4 * i + 1] - y1;\
- z = ((TYPE *)(stream->buf))[4 * i + 2] - z1;\
- d = x * x + y * y + z * z;\
- if (d <= variance2) {\
- if (a1 == a2)\
- d = 0;\
- else\
- d = sqrt(d / variance2) * (a1 - a2) + a2;\
- ((TYPE *)(stream->buf))[4 * i + 3] *= d;\
- }\
- }\
- n *= stream->pixel_size;\
- m -= n;\
- ewriteall(STDOUT_FILENO, stream->buf, n, "<stdout>");\
- memmove(stream->buf, stream->buf + n, stream->ptr -= n);\
- } while (eread_stream(stream, SIZE_MAX));\
- if (stream->ptr)\
- eprintf("%s: incomplete frame\n", stream->file);\
- }
-
-PROCESS(double, lf)
-PROCESS(float, f)
+#define FILE "blind-chroma-key.c"
+#include "define-functions.h"
int
main(int argc, char *argv[])
@@ -89,3 +36,60 @@ main(int argc, char *argv[])
process(&stream, &key);
return 0;
}
+
+#else
+
+static void
+PROCESS(struct stream *stream, struct stream *key)
+{
+ size_t i, n, m = 0;
+ TYPE x1, y1, z1, a1, a2, variance2, *keyxyza;
+ TYPE x, y, z, d;
+ do {
+ if (!m) {
+ m = stream->frame_size;
+ while (key->ptr < key->frame_size)
+ if (!eread_stream(key, key->frame_size - key->ptr))
+ return;
+ keyxyza = (TYPE *)(key->buf);
+ x1 = keyxyza[0];
+ y1 = keyxyza[1];
+ z1 = keyxyza[2];
+ a1 = keyxyza[3];
+ x = x1 - keyxyza[4];
+ y = y1 - keyxyza[5];
+ z = z1 - keyxyza[6];
+ a2 = keyxyza[7];
+ variance2 = x * x + y * y + z * z;
+ /* TODO add more formulae: https://en.wikipedia.org/wiki/Color_difference */
+ if (a2 > a1) {
+ a1 = 1 - a1;
+ a2 = 1 - a2;
+ }
+ memmove(key->buf, key->buf + key->frame_size,
+ key->ptr -= key->frame_size);
+ }
+ n = MIN(stream->ptr, m) / stream->pixel_size;
+ for (i = 0; i < n; i++) {
+ x = ((TYPE *)(stream->buf))[4 * i + 0] - x1;
+ y = ((TYPE *)(stream->buf))[4 * i + 1] - y1;
+ z = ((TYPE *)(stream->buf))[4 * i + 2] - z1;
+ d = x * x + y * y + z * z;
+ if (d <= variance2) {
+ if (a1 == a2)
+ d = 0;
+ else
+ d = sqrt(d / variance2) * (a1 - a2) + a2;
+ ((TYPE *)(stream->buf))[4 * i + 3] *= d;
+ }
+ }
+ n *= stream->pixel_size;
+ m -= n;
+ ewriteall(STDOUT_FILENO, stream->buf, n, "<stdout>");
+ memmove(stream->buf, stream->buf + n, stream->ptr -= n);
+ } while (eread_stream(stream, SIZE_MAX));
+ if (stream->ptr)
+ eprintf("%s: incomplete frame\n", stream->file);
+}
+
+#endif