aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2017-06-03 18:38:37 +0200
committerMattias Andrée <maandree@kth.se>2017-06-03 18:38:37 +0200
commit3e0822a8a5127a5ba395bc506622af73d75af0ab (patch)
tree66545cb970d0aaf2ee8ba55bf0e40ffbc9675b8f /src
parentThere is no reason to add support for pipes in blind-rewrite-head (diff)
downloadblind-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 'src')
-rw-r--r--src/blind-repeat.c59
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>:");