From 3e0822a8a5127a5ba395bc506622af73d75af0ab Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sat, 3 Jun 2017 18:38:37 +0200 Subject: blind-repeat: add -f and fix reading from file bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/blind-repeat.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 6 deletions(-) (limited to 'src/blind-repeat.c') 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); @@ -19,6 +20,22 @@ repeat_regular_file(void) return 0; } +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, "")) + return 0; + } + } +} + static int repeat_stdin(void) { @@ -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, ""); - 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, ""); - 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 :"); -- cgit v1.2.3-70-g09d2