blind

suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log | Files | Refs | README | LICENSE

commit 878849c465604d90d236b3c8766bf75a4b6836d2
parent 4df594b3f48679f594e6f738981cb3baca8a42d9
Author: Mattias Andrée <maandree@kth.se>
Date:   Sun,  7 May 2017 16:48:25 +0200

Add blind-convert

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
MMakefile | 1+
Asrc/blind-convert.c | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/blind-next-frame.c | 5++---
Msrc/stream.c | 2++
4 files changed, 87 insertions(+), 3 deletions(-)

diff --git a/Makefile b/Makefile @@ -7,6 +7,7 @@ BIN =\ blind-colour-srgb\ blind-compress\ blind-concat\ + blind-convert\ blind-crop\ blind-cut\ blind-decompress\ diff --git a/src/blind-convert.c b/src/blind-convert.c @@ -0,0 +1,82 @@ +/* See LICENSE file for copyright and license details. */ +#include "stream.h" +#include "util.h" + +#include <string.h> + +USAGE("pixel-format ...") + +static void (*outconv)(double x, double y, double z, double a); + +#define INCONV(TYPE)\ + do {\ + TYPE *pixel, x, y, z, a;\ + size_t n;\ + do {\ + pixel = (TYPE *)stream->buf;\ + for (n = stream->ptr / stream->pixel_size; n--; pixel += 4) {\ + x = (TYPE)(pixel[0]);\ + y = (TYPE)(pixel[1]);\ + z = (TYPE)(pixel[2]);\ + a = (TYPE)(pixel[3]);\ + outconv(x, y, z, a);\ + }\ + n = stream->ptr - (stream->ptr % stream->pixel_size);\ + 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);\ + } while (0) + +#define OUTCONV(TYPE)\ + do {\ + TYPE pixel[4];\ + pixel[0] = (TYPE)x;\ + pixel[1] = (TYPE)y;\ + pixel[2] = (TYPE)z;\ + pixel[3] = (TYPE)a;\ + ewriteall(STDOUT_FILENO, pixel, sizeof(pixel), "<stdout>");\ + } while (0) + +static void inconv_xyza (struct stream *stream) {INCONV(double);} +static void inconv_xyzaf(struct stream *stream) {INCONV(float);} + +static void outconv_xyza (double x, double y, double z, double a) {OUTCONV(double);} +static void outconv_xyzaf(double x, double y, double z, double a) {OUTCONV(float);} + +int +main(int argc, char *argv[]) +{ + struct stream stream; + const char *pixfmt; + void (*inconv)(struct stream *stream); + + UNOFLAGS(!argc); + + eopen_stream(&stream, NULL); + + if (!strcmp(stream.pixfmt, "xyza")) + inconv = inconv_xyza; + else if (!strcmp(stream.pixfmt, "xyza f")) + inconv = inconv_xyzaf; + else + eprintf("input pixel format %s is not supported\n", stream.pixfmt); + + pixfmt = stream.pixfmt; + while (*argv) + pixfmt = get_pixel_format(*argv++, pixfmt); + + if (!strcmp(pixfmt, "xyza")) + outconv = outconv_xyza; + else if (!strcmp(pixfmt, "xyza f")) + outconv = outconv_xyzaf; + else + eprintf("output pixel format %s is not supported\n", pixfmt); + + strcpy(stream.pixfmt, pixfmt); + fprint_stream_head(stdout, &stream); + efflush(stdout, "<stdout>"); + + inconv(&stream); + return 0; +} diff --git a/src/blind-next-frame.c b/src/blind-next-frame.c @@ -56,9 +56,8 @@ main(int argc, char *argv[]) w = stream.width * stream.pixel_size; for (; stream.frames; stream.frames--) { for (h = stream.height; h; h--) { - for (n = w; n; n -= stream.ptr) { - stream.ptr = 0; - if (!enread_stream(2, &stream, n)) + for (n = w; n; n -= stream.ptr, stream.ptr = 0) { + if (!stream.ptr && !enread_stream(2, &stream, n)) goto done; anything = 1; enwriteall(2, STDOUT_FILENO, stream.buf, stream.ptr, "<stdout>"); diff --git a/src/stream.c b/src/stream.c @@ -106,6 +106,8 @@ set_pixel_size(struct stream *stream) { if (!strcmp(stream->pixfmt, "xyza")) stream->pixel_size = 4 * sizeof(double); + else if (!strcmp(stream->pixfmt, "xyza f")) + stream->pixel_size = 4 * sizeof(float); else return -1; return 0;