commit 91eae00bfa6abfb4b50833768d54ac48678c88f6
parent d5f9bf804180f50d1a025b3cf70e12238c79cfb3
Author: Mattias Andrée <maandree@kth.se>
Date: Wed, 31 May 2017 21:06:25 +0200
blind-stack: add -s
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat:
4 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/man/blind-stack.1 b/man/blind-stack.1
@@ -3,7 +3,7 @@
blind-stack - Overlay videos
.SH SYNOPSIS
.B blind-stack
-[-b]
+[-bs]
.IR bottom-stream
.RI "... " top-stream
.SH DESCRIPTION
@@ -30,6 +30,10 @@ Instead of drawing the videos on top of each
other, for each pixel in each frame, print the
average colour for each input stream's
corresponding pixel and frame.
+.TP
+.B -s
+The output video will be as long as the shortest
+input video, rather than as the longest.
.SH SEE ALSO
.BR blind (7),
.BR blind-dissolve (1),
diff --git a/src/blind-stack.c b/src/blind-stack.c
@@ -1,7 +1,7 @@
/* See LICENSE file for copyright and license details. */
#include "common.h"
-USAGE("[-b] bottom-stream ... top-stream")
+USAGE("[-bs] bottom-stream ... top-stream")
#define PROCESS(TYPE, BLEND)\
do {\
@@ -42,13 +42,16 @@ main(int argc, char *argv[])
{
struct stream *streams;
size_t n_streams, i, frames = 0, tmp;
- int blend = 0;
+ int blend = 0, shortest = 0;
void (*process)(struct stream *streams, size_t n_streams, size_t n);
ARGBEGIN {
case 'b':
blend = 1;
break;
+ case 's':
+ shortest = 1;
+ break;
default:
usage();
} ARGEND;
@@ -61,7 +64,7 @@ main(int argc, char *argv[])
for (i = 0; i < n_streams; i++) {
eopen_stream(streams + i, argv[i]);
- if (streams[i].frames > frames)
+ if (shortest ? (streams[i].frames && streams[i].frames) < frames : streams[i].frames > frames)
frames = streams[i].frames;
}
@@ -76,7 +79,7 @@ main(int argc, char *argv[])
fprint_stream_head(stdout, streams);
efflush(stdout, "<stdout>");
streams->frames = tmp;
- process_multiple_streams(streams, n_streams, STDOUT_FILENO, "<stdout>", process);
+ process_multiple_streams(streams, n_streams, STDOUT_FILENO, "<stdout>", shortest, process);
free(streams);
return 0;
diff --git a/src/stream.c b/src/stream.c
@@ -398,7 +398,7 @@ nprocess_two_streams(int status, struct stream *left, struct stream *right, int
void
nprocess_multiple_streams(int status, struct stream *streams, size_t n_streams, int output_fd, const char* output_fname,
- void (*process)(struct stream *streams, size_t n_streams, size_t n))
+ int shortest, void (*process)(struct stream *streams, size_t n_streams, size_t n))
{
size_t closed, i, j, n;
@@ -411,6 +411,8 @@ nprocess_multiple_streams(int status, struct stream *streams, size_t n_streams,
if (streams[i].ptr < sizeof(streams->buf) && !enread_stream(status, streams + i, SIZE_MAX)) {
close(streams[i].fd);
streams[i].fd = -1;
+ if (shortest)
+ return;
}
if (streams[i].ptr && streams[i].ptr < n)
n = streams[i].ptr;
diff --git a/src/stream.h b/src/stream.h
@@ -90,7 +90,7 @@ void nprocess_two_streams(int status, struct stream *left, struct stream *right,
void (*process)(struct stream *left, struct stream *right, size_t n));
void nprocess_multiple_streams(int status, struct stream *streams, size_t n_streams, int output_fd, const char* output_fname,
- void (*process)(struct stream *streams, size_t n_streams, size_t n));
+ int shortest, void (*process)(struct stream *streams, size_t n_streams, size_t n));
void nprocess_each_frame_two_streams(int status, struct stream *left, struct stream *right, int output_fd, const char* output_fname,
void (*process)(char *restrict output, char *restrict lbuf, char *restrict rbuf,