aboutsummaryrefslogtreecommitdiffstats
path: root/src/blind-from-portable.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2017-08-05 00:03:44 +0200
committerMattias Andrée <maandree@kth.se>2017-08-05 00:03:44 +0200
commitba67e5506bd93eef064d72883ff94dbadee14082 (patch)
tree2c3c77cc1d9e951d8f59f778e1c3f9226ed03f56 /src/blind-from-portable.c
parentfix typo and alphabetical order of commands (diff)
downloadblind-ba67e5506bd93eef064d72883ff94dbadee14082.tar.gz
blind-ba67e5506bd93eef064d72883ff94dbadee14082.tar.bz2
blind-ba67e5506bd93eef064d72883ff94dbadee14082.tar.xz
Add support for skipping conversion to CIEXYZ (not complete)
Some tools are colour space agnostic or even encoding agnostic, by skipping conversion to CIEXYZ when these tools are used, the rendering time can be significantly reduced. The video can also be split horizontally and vertically, and latted merged back, so it is not necessary to convert the entire video if only parts of it actually need it. Because some tools are less agnostic than other tools, partial conversion to CIEXYZ is also added. blind-convert must be updated, and all tools most be test Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src/blind-from-portable.c')
-rw-r--r--src/blind-from-portable.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/src/blind-from-portable.c b/src/blind-from-portable.c
index c51e2db..e80510b 100644
--- a/src/blind-from-portable.c
+++ b/src/blind-from-portable.c
@@ -1,4 +1,5 @@
/* See LICENSE file for copyright and license details. */
+#define INCLUDE_UINT16
#include "common.h"
USAGE("[-s]")
@@ -47,7 +48,7 @@ static int strict = 1;
return ret;\
} while (0)
-#define PROCESS(ITYPE, OTYPE, BITS)\
+#define PROCESS_FLOAT(ITYPE, OTYPE, BITS)\
do {\
size_t i, n;\
ITYPE *ibuf = (ITYPE *)(stream->buf);\
@@ -55,15 +56,19 @@ static int strict = 1;
: alloca(sizeof(stream->buf) / sizeof(ITYPE) * sizeof(OTYPE));\
strict *= !USING_BINARY##BITS;\
if (!strict && sizeof(ITYPE) != sizeof(OTYPE))\
- eprintf("-s is required on this machine\n");\
+ eprintf("-s is supported not on this machine\n");\
+ if (stream->endian == HOST_ENDIAN && !strict) {\
+ esend_stream(stream, STDOUT_FILENO, "<stdout>");\
+ break;\
+ }\
do {\
n = stream->ptr / sizeof(ITYPE);\
if (strict) {\
for (i = 0; i < n; i++)\
- obuf[i] = conv_##OTYPE(le##BITS##toh(ibuf[i]));\
+ obuf[i] = conv_##OTYPE(letoh(ibuf[i]));\
} else {\
for (i = 0; i < n; i++)\
- obuf[i] = *(OTYPE *)&(ITYPE){le##BITS##toh(ibuf[i])};\
+ obuf[i] = *(OTYPE *)&(ITYPE){letoh(ibuf[i])};\
}\
ewriteall(STDOUT_FILENO, obuf, n * sizeof(OTYPE), "<stdout>");\
n *= sizeof(ITYPE);\
@@ -73,11 +78,32 @@ static int strict = 1;
eprintf("%s: incomplete frame\n", stream->file);\
} while (0)
+#define PROCESS_INTEGER(TYPE)\
+ do {\
+ size_t i, n;\
+ TYPE *buf = (TYPE *)(stream->buf);\
+ if (stream->endian == HOST_ENDIAN) {\
+ esend_stream(stream, STDOUT_FILENO, "<stdout>");\
+ break;\
+ }\
+ do {\
+ n = stream->ptr / sizeof(TYPE);\
+ for (i = 0; i < n; i++)\
+ buf[i] = letoh(buf[i]);\
+ n *= sizeof(TYPE);\
+ ewriteall(STDOUT_FILENO, 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);\
+ } while (0)
+
static double conv_double(uint64_t portable) {CONV(uint64_t, int64_t, double, 11, 1023, 52);}
static float conv_float (uint32_t portable) {CONV(uint32_t, int32_t, float, 8, 127, 23);}
-static void process_lf(struct stream *stream) {PROCESS(uint64_t, double, 64);}
-static void process_f (struct stream *stream) {PROCESS(uint32_t, float, 32);}
+static void process_lf (struct stream *stream) {PROCESS_FLOAT(uint64_t, double, 64);}
+static void process_f (struct stream *stream) {PROCESS_FLOAT(uint32_t, float, 32);}
+static void process_u16(struct stream *stream) {PROCESS_INTEGER(uint16_t);}
int
main(int argc, char *argv[])
@@ -97,9 +123,15 @@ main(int argc, char *argv[])
usage();
eopen_stream(&stream, NULL);
+#if defined(HOST_ENDIAN_IS_LITTLE_ENDIAN)
+ if (stream.endian == LITTLE_ENDIAN)
+ stream.endian = HOST_ENDIAN;
+#elif defined(HOST_ENDIAN_IS_BIG_ENDIAN)
+ if (stream.endian == BIG_ENDIAN)
+ stream.endian = HOST_ENDIAN;
+#endif
SELECT_PROCESS_FUNCTION(&stream);
-
fprint_stream_head(stdout, &stream);
efflush(stdout, "<stdout>");
process(&stream);