commit 38e538e53941c94e4acdfccc2aa933e5f936cce1
parent b640dfad6fd5c0ae3a9bfdd9b4bd54e387b0cc51
Author: Mattias Andrée <maandree@kth.se>
Date: Sun, 6 Aug 2017 12:46:50 +0200
Fix bugs in blind-from-video
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat:
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/src/blind-from-video.c b/src/blind-from-video.c
@@ -186,7 +186,7 @@ main(int argc, char *argv[])
char *data;
const char *pixfmt = "xyza";
ssize_t headlen;
- size_t length, frame_size;
+ size_t length, frame_size, pixel_size;
int outfd, skip_length = 0;
struct stat st;
@@ -220,23 +220,27 @@ main(int argc, char *argv[])
outfile = argv[1] ? argv[1] : "-";
pixfmt = get_pixel_format(pixfmt, "xyza");
- if (!strcmp(pixfmt, "xyza"))
+ if (!strcmp(pixfmt, "xyza")) {
convert_segment = convert_segment_xyza;
- else if (!strcmp(pixfmt, "xyza f"))
+ pixel_size = 4 * sizeof(double);
+ } else if (!strcmp(pixfmt, "xyza f")) {
convert_segment = convert_segment_xyzaf;
- else if (!strcmp(pixfmt, "raw0"))
+ pixel_size = 4 * sizeof(float);
+ } else if (!strcmp(pixfmt, "raw0")) {
convert_segment = NULL;
- else
+ pixel_size = 4 * sizeof(uint16_t);
+ } else {
eprintf("pixel format %s is not supported, try xyza or raw0 and blind-convert\n", pixfmt);
+ }
if (!width)
get_metadata(infile, &width, &height);
if (width > SIZE_MAX / height)
eprintf("video frame too large\n");
frame_size = width * height;
- if (4 * sizeof(double) > SIZE_MAX / frame_size)
+ if (pixel_size > SIZE_MAX / frame_size)
eprintf("video frame too large\n");
- frame_size *= 4 * sizeof(double);
+ frame_size *= pixel_size;
if (!strcmp(outfile, "-")) {
outfile = "<stdout>";
@@ -254,12 +258,17 @@ main(int argc, char *argv[])
convert(infile, outfd, outfile, width, height, frame_rate);
+ if (outfd == STDOUT_FILENO)
+ return 0;
+
if (fstat(outfd, &st))
eprintf("fstat %s:", outfile);
length = (size_t)(st.st_size);
+ if (skip_length)
+ length -= (size_t)headlen;
if (length % frame_size)
- eprintf("<subprocess>: incomplete frame");
+ eprintf("<subprocess>: incomplete frame\n");
frames = length / frame_size;
if (!skip_length) {