blind

suckless command-line video editing utility
git clone git://git.suckless.org/blind
Log | Files | Refs | README | LICENSE

commit 4a3ac9442a7e6fb810f3c56b4a00ffa120cae475
parent 80d76b61b0e2b1224f8b0417658285b90934880e
Author: Mattias Andrée <maandree@kth.se>
Date:   Sun,  9 Apr 2017 11:19:31 +0200

Add blind-skip-pattern

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
MMakefile | 1+
MTODO | 1-
Mman/blind-next-frame.1 | 3++-
Aman/blind-skip-pattern.1 | 26++++++++++++++++++++++++++
Asrc/blind-skip-pattern.c | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 113 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile @@ -28,6 +28,7 @@ BIN =\ blind-set-luma\ blind-set-saturation\ blind-single-colour\ + blind-skip-pattern\ blind-split\ blind-stack\ blind-time-blur\ diff --git a/TODO b/TODO @@ -14,7 +14,6 @@ blind-affine-colour apply an affine transformation to the colour of each pixel, -l for linear transformation, -p for transforming each pixel with their own transformation. blind-invert-chroma invert the chroma -blind-skip-pattern discard frames according to pattern, e.g. every other frame blind-from-sent convert a sent presentation to a one-frame-per-slide blind video blind-from-video: add options to: diff --git a/man/blind-next-frame.1 b/man/blind-next-frame.1 @@ -50,7 +50,8 @@ An error occurred. .BR blind-read-head (1), .BR blind-write-head (1), .BR blind-to-image (1), -.BR blind-from-image (1) +.BR blind-from-image (1), +.BR blind-skip-pattern (1) .SH AUTHORS Mattias Andrée .RI < maandree@kth.se > diff --git a/man/blind-skip-pattern.1 b/man/blind-skip-pattern.1 @@ -0,0 +1,26 @@ +.TH BLIND-SKIP-PATTERN 1 blind +.SH NAME +blind-skip-pattern - Skips frames in a video according to pattern +.SH SYNOPSIS +.B blind-skip-pattern +.RI ( skipped-frames +| +.RI + included-frames )\ ... +.SH DESCRIPTION +For every argument, +.B blind-skip-pattern +skips +.I skipped-frames +frames from stdin or prints +.I included-frames +frames from stdin to stdout, +until the end of stdin is reached. +After the last argument, +.B blind-skip-pattern +jumps back to the first argument. +.SH SEE ALSO +.BR blind (7), +.BR blind-next-frame (1), +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/src/blind-skip-pattern.c b/src/blind-skip-pattern.c @@ -0,0 +1,84 @@ +/* See LICENSE file for copyright and license details. */ +#include "stream.h" +#include "util.h" + +#include <inttypes.h> +#include <string.h> +#include <unistd.h> + +USAGE("(skipped-frames | +included-frames) ...") + +static int +process_frame(struct stream *stream, int include, size_t rown) +{ + size_t h, n; + int anything = 0; + + for (h = stream->height; h;) { + h--; + for (n = rown; n; n -= stream->ptr) { + stream->ptr = 0; + if (!eread_stream(stream, n)) + goto done; + anything = 1; + if (include) + ewriteall(STDOUT_FILENO, stream->buf, stream->ptr, "<stdout>"); + } + } +done: + + if (anything && (h || n || stream->frames)) + eprintf("%s: is shorted than expected\n", stream->file); + + return !anything; +} + +int +main(int argc, char *argv[]) +{ + struct stream stream; + int i, include; + size_t f, n, rown, total = 0; + char *includes; + size_t *ns; + + UNOFLAGS(!argc); + + stream.fd = STDIN_FILENO; + stream.file = "<stdin>"; + einit_stream(&stream); + + includes = emalloc((size_t)argc); + ns = ecalloc((size_t)argc, sizeof(*ns)); + + for (i = 0; i < argc; i++) { + include = argv[i][0] == '+'; + n = etozu_arg(include ? "included frame count" : "skipped frame count", + argv[i] + include, 0, SIZE_MAX); + ns[i] = n; + includes[i] = (char)include; + } + if (!total) + eprintf("null pattern is not allowed"); + + for (i = 0, total = 0, f = stream.frames;; i = (i + 1) % argc) { + include = (int)includes[i]; + for (n = ns[i]; n-- && f--;) + total += (size_t)include; + } + + stream.frames = total; + fprint_stream_head(stdout, &stream); + efflush(stdout, "<stdout>"); + + rown = stream.width * stream.pixel_size; + for (i = 0;; i = (i + 1) % argc) { + include = (int)includes[i]; + n = ns[i]; + while (n-- && process_frame(&stream, include, rown)); + } + + free(includes); + free(ns); + return 0; +}