commit 80d76b61b0e2b1224f8b0417658285b90934880e
parent a8c1739dffa17720e6d79cda7c2952141d650701
Author: Mattias Andrée <maandree@kth.se>
Date: Sun, 9 Apr 2017 10:16:50 +0200
blind-next-frame: add -f flag: read multiple frames
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat:
16 files changed, 46 insertions(+), 29 deletions(-)
diff --git a/TODO b/TODO
@@ -25,8 +25,6 @@ blind-from-video: add options to:
print to stdout (up to user to direct to /dev/null
for discarding)
-blind-next-frame: add option to read multiple frames
-
Add [-j jobs] to blind-from-video and blind-to-video.
diff --git a/man/blind-next-frame.1 b/man/blind-next-frame.1
@@ -3,6 +3,8 @@
blind-next-frame - Extracts the next frame from a video
.SH SYNOPSIS
.B blind-next-frame
+[-f
+.IR frames ]
.I width
.I height
.IR pixel-format " ..."
@@ -27,6 +29,12 @@ And argument following
is appended to
.I pixel-format
with <space> in between.
+.SH OPTIONS
+.TP
+.BR -f " "\fIframes\fP
+Read and output the first
+.I frames
+frames rather than the first single frame.
.SH EXIT STATUS
.TP
0
diff --git a/src/arg.h b/src/arg.h
@@ -77,7 +77,7 @@ extern char *argv0;
#define LNGARG() &argv[0][0]
-#define ENOFLAGS(...) ARGBEGIN {\
+#define UNOFLAGS(...) ARGBEGIN {\
default:\
usage();\
} ARGEND;\
diff --git a/src/blind-compress.c b/src/blind-compress.c
@@ -38,7 +38,7 @@ main(int argc, char *argv[])
size_t *cmp = NULL;
size_t cmpsize = 0;
- ENOFLAGS(argc);
+ UNOFLAGS(argc);
stream.file = "<stdin>";
stream.fd = STDIN_FILENO;
diff --git a/src/blind-cut.c b/src/blind-cut.c
@@ -19,7 +19,7 @@ main(int argc, char *argv[])
char buf[BUFSIZ];
int to_end = 0;
- ENOFLAGS(argc != 3);
+ UNOFLAGS(argc != 3);
if (!strcmp(argv[0], "end"))
eprintf("refusing to create video with zero frames\n");
diff --git a/src/blind-decompress.c b/src/blind-decompress.c
@@ -14,7 +14,7 @@ main(int argc, char *argv[])
char *buf;
size_t n, m, fptr, sptr, same = 0, diff = 0;
- ENOFLAGS(argc);
+ UNOFLAGS(argc);
stream.file = "<stdin>";
stream.fd = STDIN_FILENO;
diff --git a/src/blind-flip.c b/src/blind-flip.c
@@ -14,7 +14,7 @@ main(int argc, char *argv[])
size_t n, ptr, row_size;
char *buf;
- ENOFLAGS(argc);
+ UNOFLAGS(argc);
stream.file = "<stdin>";
stream.fd = STDIN_FILENO;
diff --git a/src/blind-flop.c b/src/blind-flop.c
@@ -15,7 +15,7 @@ main(int argc, char *argv[])
char *buf, *image;
size_t i, j, n, m;
- ENOFLAGS(argc);
+ UNOFLAGS(argc);
stream.file = "<stdin>";
stream.fd = STDIN_FILENO;
diff --git a/src/blind-from-text.c b/src/blind-from-text.c
@@ -37,7 +37,7 @@ main(int argc, char *argv[])
ssize_t len;
void (*process)(void) = NULL;
- ENOFLAGS(argc);
+ UNOFLAGS(argc);
len = getline(&line, &size, stdin);
if (len < 0) {
diff --git a/src/blind-next-frame.c b/src/blind-next-frame.c
@@ -6,19 +6,27 @@
#include <string.h>
#include <unistd.h>
-USAGE("width height pixel-format ...")
+USAGE("[-f frames] width height pixel-format ...")
int
main(int argc, char *argv[])
{
struct stream stream;
- size_t n, w;
+ size_t n, w, h = 0;
int i, anything = 0;
char *p;
- ENOFLAGS(argc < 3);
-
stream.frames = 1;
+
+ ARGBEGIN {
+ case 'f':
+ stream.frames = etozu_flag('f', UARGF(), 1, SIZE_MAX);
+ break;
+ } ARGEND;
+
+ if (argc < 3)
+ usage();
+
stream.fd = STDIN_FILENO;
stream.file = "<stdin>";
stream.pixfmt[0] = '\0';
@@ -44,20 +52,23 @@ main(int argc, char *argv[])
enfflush(2, stdout, "<stdout>");
w = stream.width * stream.pixel_size;
- while (stream.height) {
- stream.height--;
- for (n = w; n; n -= stream.ptr) {
- stream.ptr = 0;
- if (!enread_stream(2, &stream, n))
- goto done;
- anything = 1;
- enwriteall(2, STDOUT_FILENO, stream.buf, stream.ptr, "<stdout>");
+ while (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))
+ goto done;
+ anything = 1;
+ enwriteall(2, STDOUT_FILENO, stream.buf, stream.ptr, "<stdout>");
+ }
}
}
done:
- if (anything && (stream.height || n))
- enprintf(2, "incomplete frame\n");
+ if (anything && (h || n || stream.frames))
+ enprintf(2, "%s: is shorted than expected\n", stream.file);
return !anything;
}
diff --git a/src/blind-read-head.c b/src/blind-read-head.c
@@ -16,7 +16,7 @@ main(int argc, char *argv[])
size_t i, ptr;
ssize_t r;
- ENOFLAGS(argc);
+ UNOFLAGS(argc);
for (ptr = 0; ptr < sizeof(buf);) {
r = read(STDIN_FILENO, buf + ptr, 1);
diff --git a/src/blind-repeat.c b/src/blind-repeat.c
@@ -98,7 +98,7 @@ main(int argc, char *argv[])
size_t count = 0;
int inf = 0;
- ENOFLAGS(argc != 2);
+ UNOFLAGS(argc != 2);
if (!strcmp(argv[0], "inf"))
inf = 1;
diff --git a/src/blind-set-luma.c b/src/blind-set-luma.c
@@ -92,7 +92,7 @@ main(int argc, char *argv[])
struct stream colour, luma;
void (*process)(struct stream *colour, struct stream *luma, size_t n);
- ENOFLAGS(argc != 1);
+ UNOFLAGS(argc != 1);
colour.file = "<stdin>";
colour.fd = STDIN_FILENO;
diff --git a/src/blind-to-text.c b/src/blind-to-text.c
@@ -27,7 +27,7 @@ main(int argc, char *argv[])
size_t n;
void (*process)(struct stream *stream, size_t n) = NULL;
- ENOFLAGS(argc);
+ UNOFLAGS(argc);
stream.file = "<stdin>";
stream.fd = STDIN_FILENO;
diff --git a/src/blind-transpose.c b/src/blind-transpose.c
@@ -16,7 +16,7 @@ main(int argc, char *argv[])
char *buf, *image;
size_t n, imgw, srcw, srch, ps, x, y, i, b, dx;
- ENOFLAGS(argc);
+ UNOFLAGS(argc);
stream.file = "<stdin>";
stream.fd = STDIN_FILENO;
diff --git a/src/blind-write-head.c b/src/blind-write-head.c
@@ -6,7 +6,7 @@ USAGE("parameters ...")
int
main(int argc, char *argv[])
{
- ENOFLAGS(!argc);
+ UNOFLAGS(!argc);
printf("%s", *argv++);
while (*argv)