diff options
| author | Mattias Andrée <maandree@kth.se> | 2017-06-03 18:38:37 +0200 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2017-06-03 18:38:37 +0200 |
| commit | 3e0822a8a5127a5ba395bc506622af73d75af0ab (patch) | |
| tree | 66545cb970d0aaf2ee8ba55bf0e40ffbc9675b8f /src/blind-repeat.c | |
| parent | There is no reason to add support for pipes in blind-rewrite-head (diff) | |
| download | blind-3e0822a8a5127a5ba395bc506622af73d75af0ab.tar.gz blind-3e0822a8a5127a5ba395bc506622af73d75af0ab.tar.bz2 blind-3e0822a8a5127a5ba395bc506622af73d75af0ab.tar.xz | |
blind-repeat: add -f and fix reading from file bug
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
| -rw-r--r-- | src/blind-repeat.c | 59 |
1 files changed, 53 insertions, 6 deletions
diff --git a/src/blind-repeat.c b/src/blind-repeat.c index b7763eb..e56586d 100644 --- a/src/blind-repeat.c +++ b/src/blind-repeat.c @@ -1,7 +1,7 @@ /* See LICENSE file for copyright and license details. */ #include "common.h" -USAGE("(count | 'inf') file") +USAGE("([-f] count | 'inf') file") static size_t count = 0; static int inf; @@ -10,6 +10,7 @@ static struct stream stream; static int repeat_regular_file(void) { + stream.ptr = 0; while (inf || count--) { fadvise_sequential(stream.fd, (off_t)(stream.headlen), 0); elseek(stream.fd, (off_t)(stream.headlen), SEEK_SET, stream.file); @@ -20,6 +21,22 @@ repeat_regular_file(void) } static int +repeat_regular_file_framewise(void) +{ + size_t i; + off_t off = (off_t)(stream.headlen); + stream.ptr = 0; + echeck_dimensions(&stream, WIDTH | HEIGHT | LENGTH, "input"); + for (;; off += (off_t)(stream.frame_size)) { + for (i = 0; i < count; i++) { + elseek(stream.fd, off, SEEK_SET, stream.file); + if (!esend_frames(&stream, STDOUT_FILENO, 1, "<stdout>")) + return 0; + } + } +} + +static int repeat_stdin(void) { size_t ptr = stream.ptr; @@ -32,24 +49,54 @@ repeat_stdin(void) return free(buf), 0; } +static int +repeat_stdin_framewise(void) +{ + char *buf; + size_t i; + echeck_dimensions(&stream, WIDTH | HEIGHT, "input"); + buf = emalloc(stream.frame_size); + while (eread_frame(&stream, buf)) + for (i = 0; i < count; i++) + if (writeall(STDOUT_FILENO, buf, stream.frame_size)) + return free(buf), -1; + return free(buf), 0; +} + int main(int argc, char *argv[]) { - UNOFLAGS(argc != 2); + int framewise = 0; - if ((inf = !strcmp(argv[0], "inf"))) + ARGBEGIN { + case 'f': + framewise = 1; + break; + default: + usage(); + } ARGEND; + + if (argc != 2) + usage(); + + if ((inf = !strcmp(argv[0], "inf"))) { + if (framewise) + usage(); einf_check_fd(STDOUT_FILENO, "<stdout>"); - else + } else { count = etozu_arg("the count", argv[0], 0, SIZE_MAX); + } eopen_stream(&stream, !strcmp(argv[1], "-") ? NULL : argv[1]); - if (count > SIZE_MAX / stream.frames) + if (stream.frames && count > SIZE_MAX / stream.frames) eprintf("%s: video is too long\n", stream.file); stream.frames *= count; fprint_stream_head(stdout, &stream); efflush(stdout, "<stdout>"); - if (!strcmp(argv[1], "-") ? repeat_stdin() : repeat_regular_file()) + if (!strcmp(argv[1], "-") + ? (framewise ? repeat_stdin_framewise() : repeat_stdin()) + : (framewise ? repeat_regular_file_framewise(): repeat_regular_file())) if (!inf || errno != EPIPE) eprintf("write <stdout>:"); |
