aboutsummaryrefslogtreecommitdiffstats
path: root/src/blind-to-video.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/blind-to-video.c')
-rw-r--r--src/blind-to-video.c98
1 files changed, 51 insertions, 47 deletions
diff --git a/src/blind-to-video.c b/src/blind-to-video.c
index 2bebe9b..a98d719 100644
--- a/src/blind-to-video.c
+++ b/src/blind-to-video.c
@@ -12,53 +12,55 @@ USAGE("[-d] frame-rate ffmpeg-arguments ...")
static int draft = 0;
static int fd;
-static void
-process_xyza(struct stream *stream, size_t n)
-{
- char *buf = stream->buf;
- double *pixel, r, g, b;
- uint16_t *pixels, *end;
- uint16_t pixbuf[1024];
- long int a, y, u, v;
- size_t ptr;
- pixels = pixbuf;
- end = pixbuf + ELEMENTSOF(pixbuf);
- if (draft) {
- for (ptr = 0; ptr < n; ptr += 4 * sizeof(double)) {
- pixel = (double *)(buf + ptr);
- ciexyz_to_scaled_yuv(pixel[0], pixel[1], pixel[2], &r, &g, &b);
- y = (long int)r + 16L * 256L;
- u = (long int)g + 128L * 256L;
- v = (long int)b + 128L * 256L;
- *pixels++ = 0xFFFFU;
- *pixels++ = htole16((uint16_t)CLIP(0, y, 0xFFFFL));
- *pixels++ = htole16((uint16_t)CLIP(0, u, 0xFFFFL));
- *pixels++ = htole16((uint16_t)CLIP(0, v, 0xFFFFL));
- if (pixels == end)
- ewriteall(fd, pixels = pixbuf, sizeof(pixbuf), "<subprocess>");
- }
- } else {
- for (ptr = 0; ptr < n; ptr += 4 * sizeof(double)) {
- pixel = (double *)(buf + ptr);
- a = (long int)(pixel[3] * 0xFFFFL);
- ciexyz_to_srgb(pixel[0], pixel[1], pixel[2], &r, &g, &b);
- r = srgb_encode(r);
- g = srgb_encode(g);
- b = srgb_encode(b);
- srgb_to_yuv(r, g, b, pixel + 0, pixel + 1, pixel + 2);
- y = (long int)(pixel[0] * 0xFFFFL) + 16L * 256L;
- u = (long int)(pixel[1] * 0xFFFFL) + 128L * 256L;
- v = (long int)(pixel[2] * 0xFFFFL) + 128L * 256L;
- *pixels++ = htole16((uint16_t)CLIP(0, a, 0xFFFFL));
- *pixels++ = htole16((uint16_t)CLIP(0, y, 0xFFFFL));
- *pixels++ = htole16((uint16_t)CLIP(0, u, 0xFFFFL));
- *pixels++ = htole16((uint16_t)CLIP(0, v, 0xFFFFL));
- if (pixels == end)
- ewriteall(fd, pixels = pixbuf, sizeof(pixbuf), "<subprocess>");
- }
- }
- ewriteall(fd, pixbuf, (size_t)(pixels - pixbuf) * sizeof(*pixels), "<subprocess>");
-}
+#define PROCESS(TYPE, SUFFIX)\
+ do {\
+ char *buf = stream->buf;\
+ TYPE *pixel, r, g, b;\
+ uint16_t *pixels, *end;\
+ uint16_t pixbuf[BUFSIZ / sizeof(uint16_t)];\
+ long int a, y, u, v;\
+ size_t ptr;\
+ pixels = pixbuf;\
+ end = pixbuf + ELEMENTSOF(pixbuf);\
+ if (draft) {\
+ for (ptr = 0; ptr < n; ptr += 4 * sizeof(TYPE)) {\
+ pixel = (TYPE *)(buf + ptr);\
+ ciexyz_to_scaled_yuv##SUFFIX(pixel[0], pixel[1], pixel[2], &r, &g, &b);\
+ y = (long int)r + 16L * 256L;\
+ u = (long int)g + 128L * 256L;\
+ v = (long int)b + 128L * 256L;\
+ *pixels++ = 0xFFFFU;\
+ *pixels++ = htole16((uint16_t)CLIP(0, y, 0xFFFFL));\
+ *pixels++ = htole16((uint16_t)CLIP(0, u, 0xFFFFL));\
+ *pixels++ = htole16((uint16_t)CLIP(0, v, 0xFFFFL));\
+ if (pixels == end)\
+ ewriteall(fd, pixels = pixbuf, sizeof(pixbuf), "<subprocess>");\
+ }\
+ } else {\
+ for (ptr = 0; ptr < n; ptr += 4 * sizeof(TYPE)) {\
+ pixel = (TYPE *)(buf + ptr);\
+ a = (long int)(pixel[3] * 0xFFFFL);\
+ ciexyz_to_srgb##SUFFIX(pixel[0], pixel[1], pixel[2], &r, &g, &b);\
+ r = srgb_encode##SUFFIX(r);\
+ g = srgb_encode##SUFFIX(g);\
+ b = srgb_encode##SUFFIX(b);\
+ srgb_to_yuv##SUFFIX(r, g, b, pixel + 0, pixel + 1, pixel + 2);\
+ y = (long int)(pixel[0] * 0xFFFFL) + 16L * 256L;\
+ u = (long int)(pixel[1] * 0xFFFFL) + 128L * 256L;\
+ v = (long int)(pixel[2] * 0xFFFFL) + 128L * 256L;\
+ *pixels++ = htole16((uint16_t)CLIP(0, a, 0xFFFFL));\
+ *pixels++ = htole16((uint16_t)CLIP(0, y, 0xFFFFL));\
+ *pixels++ = htole16((uint16_t)CLIP(0, u, 0xFFFFL));\
+ *pixels++ = htole16((uint16_t)CLIP(0, v, 0xFFFFL));\
+ if (pixels == end)\
+ ewriteall(fd, pixels = pixbuf, sizeof(pixbuf), "<subprocess>");\
+ }\
+ }\
+ ewriteall(fd, pixbuf, (size_t)(pixels - pixbuf) * sizeof(*pixels), "<subprocess>");\
+ } while (0)
+
+static void process_xyza (struct stream *stream, size_t n) {PROCESS(double,);}
+static void process_xyzaf(struct stream *stream, size_t n) {PROCESS(float, _f);}
int
main(int argc, char *argv[])
@@ -99,6 +101,8 @@ main(int argc, char *argv[])
if (!strcmp(stream.pixfmt, "xyza"))
process = process_xyza;
+ else if (!strcmp(stream.pixfmt, "xyza f"))
+ process = process_xyzaf;
else
eprintf("pixel format %s is not supported, try xyza\n", stream.pixfmt);