blind

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

commit 56ed14063c8b2c82d5ea0652028f47f76cb710f0
parent d967cd0ef2e9d510f2c2588d47a9e811ebff7fda
Author: Mattias Andrée <maandree@kth.se>
Date:   Mon,  3 Jul 2017 14:30:44 +0200

Document blind-coordinate-field, blind-*-gradient, and blind-*-wave (sinc still pending), and sinus => sine

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

Diffstat:
Makefile | 4++--
README | 53+++++++++++++++++++++++++++++++++++++++++++++++------
TODO | 1+
man/blind-cone-gradient.1 | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
man/blind-coordinate-field.1 | 50++++++++++++++++++++++++++++++++++++++++++++++++++
man/blind-double-sine-wave.1 | 34++++++++++++++++++++++++++++++++++
man/blind-linear-gradient.1 | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
man/blind-radial-gradient.1 | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
man/blind-round-wave.1 | 34++++++++++++++++++++++++++++++++++
man/blind-sawtooth-wave.1 | 35+++++++++++++++++++++++++++++++++++
man/blind-sine-wave.1 | 34++++++++++++++++++++++++++++++++++
man/blind-spiral-gradient.1 | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
man/blind-square-gradient.1 | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
man/blind-triangular-wave.1 | 38++++++++++++++++++++++++++++++++++++++
man/blind.7 | 55+++++++++++++++++++++++++++++++++++++++++++++++--------
src/blind-double-sine-wave.c | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/blind-double-sinus-wave.c | 94-------------------------------------------------------------------------------
src/blind-sine-wave.c | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/blind-sinus-wave.c | 94-------------------------------------------------------------------------------
19 files changed, 897 insertions(+), 204 deletions(-)

diff --git a/Makefile b/Makefile @@ -19,7 +19,7 @@ BIN =\ blind-disperse\ blind-dissolve\ blind-dot-product\ - blind-double-sinus-wave\ + blind-double-sine-wave\ blind-extend\ blind-find-rectangle\ blind-flip\ @@ -50,7 +50,7 @@ BIN =\ blind-set-saturation\ blind-single-colour\ blind-sinc-wave\ - blind-sinus-wave\ + blind-sine-wave\ blind-skip-pattern\ blind-spiral-gradient\ blind-split\ diff --git a/README b/README @@ -30,26 +30,35 @@ UTILITIES blind-concat(1) Concatenate videos + blind-cone-gradient(1) + Generate a video with a cone gradient + blind-convert(1) Change pixel format of a video - blind-cross-product(1) - Calculate the cross product of colours in a video + blind-coordinate-field(1) + Generate a video where each pixel indicate their position blind-crop(1) Extract subframes for all frames + blind-cross-product(1) + Calculate the cross product of colours in a video + blind-cut(1) Retain consecutive frames - blind-dot-product(1) - Calculate the dot product of colours in a video + blind-disperse(1) + Framewise split a video into multiple videos blind-dissolve(1) Fade a video by chaning it's alpha channel - blind-disperse(1) - Framewise split a video into multiple videos + blind-dot-product(1) + Calculate the dot product of colours in a video + + blind-double-sine-wave(1) + Apply double-sine-wave repetition to gradient blind-extend(1) Add margins to a video @@ -90,6 +99,9 @@ UTILITIES blind-make-kernel(1) Create a custom convolution matrix + blind-linear-gradient(1) + Generate a video with a linear gradient + blind-next-frame(1) Extracts the next frame from a video @@ -102,6 +114,9 @@ UTILITIES blind-quaternion-product(1) Calculate the quaternion product of colours in a video + blind-radial-gradient(1) + Generate a video with a radial gradient + blind-read-head(1) Reads the head from a video @@ -123,6 +138,12 @@ UTILITIES blind-rotate-270(1) Rotate a video 270 degrees clockwise + blind-round-wave(1) + Apply round wave repetition to gradient + + blind-sawtooth-wave(1) + Apply sawtooth-wave repetition to gradient + blind-set-alpha(1) Multiply the alpha channel of a video @@ -132,12 +153,26 @@ UTILITIES blind-set-saturation(1) Multiply the saturation of a video + blind-sine-wave(1) + Apply sine-wave repetition to gradient + +TODO blind-sinc-wave + + blind-sinc-wave(1) + Apply cardinal sine-wave repetition to gradient + blind-single-colour(1) Generate a single-colour video + blind-sine-wave(1) + Apply sine-wave repetition to gradient + blind-skip-pattern(1) Skips frames in a video according to pattern + blind-spiral-gradient(1) + Generate a video with a spiral gradient + blind-split(1) Split a video, by frame, into multiple videos @@ -147,6 +182,9 @@ UTILITIES blind-split-rows(1) Split a video horizontally into multiple videos + blind-square-gradient(1) + Generate a video with a square gradient + blind-stack(1) Overlay videos @@ -177,6 +215,9 @@ UTILITIES blind-transpose(1) Transpose a video + blind-triangular-wave(1) + Apply triangular wave repetition to gradient + blind-unpremultiply(1) Unpremultiply the alpha channel of a video diff --git a/TODO b/TODO @@ -70,6 +70,7 @@ UNTESTED: blind-cross-product blind-quaternion-product blind-vector-projection + blind-coordinate-field HELP REQUIRED: diff --git a/man/blind-cone-gradient.1 b/man/blind-cone-gradient.1 @@ -0,0 +1,63 @@ +.TH BLIND-CONE-GRADIENT 1 blind +.SH NAME +blind-cone-gradient - Generate a video with a cone gradient +.SH SYNOPSIS +.B blind-cone-gradient +[-a | -s] +-w +.I width +-h +.I height +.SH DESCRIPTION +.B blind-cone-gradient +prints a video with a cone gradient to stdout, +parameters for each from is read from each frame +in stdin. The gradient is stored in all channels +of the video. +.P +The video in stdin must contain exactly 2 or 3 +pixels per frame. The first pixel shall point to +the beginning of the gradient (where the value is +0) and the second pixel shall point to the end of +the gradient (where the value is 1). In these +pixels, the value of the first channel specifies +the X-position and the value of the second +channel specifies Y-position, the other channels +are ignored. +.P +If there is a third pixel, in frames in stdin, all +values in the gradient are multipled by the value +in the second channel (the Y channel) of the third +pixel in stdin; the rest of the channels in this +pixel is ignored. +.SH OPTIONS +.TP +.B -a +Make the gradient increase anticlockwise +instead of clockwise. +.TP +.B -s +Make the gradient increase symmetrically +instead of clockwise. +.TP +.BR -w " "\fIwidth\fP +The width of the video, in pixels. +.TP +.BR -h " "\fIheight\fP +The height of the video, in pixels. +.SH SEE ALSO +.BR blind (7), +.BR blind-from-text (7), +.BR blind-double-sine-wave (1), +.BR blind-round-wave (1), +.BR blind-sawtooth-wave (1), +.BR blind-sinc-wave (1), +.BR blind-sine-wave (1), +.BR blind-triangular-wave (1), +.BR blind-linear-gradient (1), +.BR blind-radial-gradient (1), +.BR blind-spiral-gradient (1), +.BR blind-square-gradient (1) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind-coordinate-field.1 b/man/blind-coordinate-field.1 @@ -0,0 +1,50 @@ +.TH BLIND-COORDINATE-FIELD 1 blind +.SH NAME +blind-coordinate-field - Generate a video where each pixel indicate their position +.SH SYNOPSIS +.B blind-coordinate-field +[-f +.I frames +| -f +.RB ' inf '] +[-F +.IR pixel-format ] +-w +.I width +-h +.I height +.SH DESCRIPTION +.B blind-coordinate-field +prints a video to stdout. +The values in first channel will be the X-position +for each pixel, and the first channel will be the +Y-position for each pixel. The values in the other +channels will be zero. +.SH OPTIONS +.TP +.BR -f " "\fIframes\fP +The number of frames in the video. If +.I frames +is +.RB ' inf ', +the number of frames will be specified as 0 in the output's +head (works fine with most +.B blind +tools) but the video will be printed to stdout until there are +no processes with an open read end to this process's stdout. +.TP +.BR -F " "\fIpixel-format\fP +Select pixel format, see +.BR blind-convert (1) +for more information. +.TP +.BR -w " "\fIwidth\fP +The width of the video, in pixels. +.TP +.BR -h " "\fIheight\fP +The height of the video, in pixels. +.SH SEE ALSO +.BR blind (7) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind-double-sine-wave.1 b/man/blind-double-sine-wave.1 @@ -0,0 +1,34 @@ +.TH BLIND-DOUBLE-SINE-WAVE 1 blind +.SH NAME +blind-double-sine-wave - Apply double-sine-wave repetition to gradient +.SH SYNOPSIS +.B blind-double-sine-wave +[-e] +.SH DESCRIPTION +.B blind-double-sine-wave +reads a video from stdin, applies a filter to +each channel to it, and prints the result to +stdout. The filter is designed for applying +repetition to a gradient, and thus assumes the +range of visible values is [0, 1]. The applied +filter creates a double-sine-wave. +.SH OPTIONS +.TP +.B -e +Apply optimisation that assumes all channels +are identical. +.SH SEE ALSO +.BR blind (7), +.BR blind-round-wave (1), +.BR blind-sawtooth-wave (1), +.BR blind-sinc-wave (1), +.BR blind-sine-wave (1), +.BR blind-triangular-wave (1), +.BR blind-cone-gradient (1), +.BR blind-linear-gradient (1), +.BR blind-radial-gradient (1), +.BR blind-spiral-gradient (1), +.BR blind-square-gradient (1) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind-linear-gradient.1 b/man/blind-linear-gradient.1 @@ -0,0 +1,59 @@ +.TH BLIND-LINEAR-GRADIENT 1 blind +.SH NAME +blind-linear-gradient - Generate a video with a linear gradient +.SH SYNOPSIS +.B blind-linear-gradient +[-b] +-w +.I width +-h +.I height +.SH DESCRIPTION +.B blind-linear-gradient +prints a video with a linear gradient to stdout, +parameters for each from is read from each frame +in stdin. The gradient is stored in all channels +of the video. +.P +The video in stdin must contain exactly 2 pixels +per frame. The first pixel shall point to the +beginning of the gradient (where the value is 0) +and the second pixel shall point to the end of +the gradient (where the value is 1). In these +pixels, the value of the first channel specifies +the X-position and the value of the second +channel specifies Y-position, the other channels +are ignored. +.SH NOTES +Pixels before the beginning of the gradient have +negative values, and pixels after the end of the +gradient have values larger than 1. +.BR blind-*-wave (1) +commands can be used to put all values between +0 and 1. +.SH OPTIONS +.TP +.B -b +Create a bilinear gradient. +.TP +.BR -w " "\fIwidth\fP +The width of the video, in pixels. +.TP +.BR -h " "\fIheight\fP +The height of the video, in pixels. +.SH SEE ALSO +.BR blind (7), +.BR blind-from-text (7), +.BR blind-double-sine-wave (1), +.BR blind-round-wave (1), +.BR blind-sawtooth-wave (1), +.BR blind-sinc-wave (1), +.BR blind-sine-wave (1), +.BR blind-triangular-wave (1), +.BR blind-cone-gradient (1), +.BR blind-radial-gradient (1), +.BR blind-spiral-gradient (1), +.BR blind-square-gradient (1) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind-radial-gradient.1 b/man/blind-radial-gradient.1 @@ -0,0 +1,79 @@ +.TH BLIND-RADIAL-GRADIENT 1 blind +.SH NAME +blind-radial-gradient - Generate a video with a radial gradient +.SH SYNOPSIS +.B blind-radial-gradient +-w +.I width +-h +.I height +.SH DESCRIPTION +.B blind-radial-gradient +prints a video with a radial gradient to stdout, +parameters for each from is read from each frame +in stdin. The gradient is stored in all channels +of the video. +.P +The video in stdin must contain exactly 2 or 3 +pixels per frame. The first pixel shall point to +the beginning of the gradient (where the value is +0) and the second pixel shall point to the end of +the gradient (where the value is 1). In these +pixels, the value of the first channel specifies +the X-position and the value of the second +channel specifies Y-position, the other channels +are ignored. +.P +If there is a third pixel, in frames in stdin, it +specified parameters to make the gradient elliptic +or superelliptic. For a completely circular +gradient its values should be 2, 2, and 1 for the +first, second, and third channels, respectively; +the fourth channel (the alpha channel) is ignored. +If we name these values, +.IR a , +.IR b , +and +.IR m , +their is an imaginary superelliptic, on which the +values of the gradient is 1, determined by the +equation +.RI || p ||^ a +|| r / m ||^ b =1, +where +.I p +and +.I r +is the projection and rejection, respectively, +of the normalised vector from beginning of the +gradient to a pixel onto the vector from the +beginning of the gradient to the end of the +gradient. +.SH NOTES +Pixels after the end of the gradient have values +larger than 1. +.BR blind-*-wave (1) +commands can be used to put all values between +0 and 1. +.SH OPTIONS +.TP +.BR -w " "\fIwidth\fP +The width of the video, in pixels. +.TP +.BR -h " "\fIheight\fP +The height of the video, in pixels. +.SH SEE ALSO +.BR blind (7), +.BR blind-from-text (7), +.BR blind-double-sine-wave (1), +.BR blind-round-wave (1), +.BR blind-sawtooth-wave (1), +.BR blind-sinc-wave (1), +.BR blind-sine-wave (1), +.BR blind-triangular-wave (1), +.BR blind-cone-gradient (1), +.BR blind-linear-gradient (1), +.BR blind-spiral-gradient (1), +.BR blind-square-gradient (1) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind-round-wave.1 b/man/blind-round-wave.1 @@ -0,0 +1,34 @@ +.TH BLIND-ROUND-WAVE 1 blind +.SH NAME +blind-round-wave - Apply round-wave repetition to gradient +.SH SYNOPSIS +.B blind-round-wave +[-e] +.SH DESCRIPTION +.B blind-round-wave +reads a video from stdin, applies a filter to +each channel to it, and prints the result to +stdout. The filter is designed for applying +repetition to a gradient, and thus assumes the +range of visible values is [0, 1]. The applied +filter creates a round wave. +.SH OPTIONS +.TP +.B -e +Apply optimisation that assumes all channels +are identical. +.SH SEE ALSO +.BR blind (7), +.BR blind-double-sine-wave (1), +.BR blind-sawtooth-wave (1), +.BR blind-sinc-wave (1), +.BR blind-sine-wave (1), +.BR blind-triangular-wave (1), +.BR blind-cone-gradient (1), +.BR blind-linear-gradient (1), +.BR blind-radial-gradient (1), +.BR blind-spiral-gradient (1), +.BR blind-square-gradient (1) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind-sawtooth-wave.1 b/man/blind-sawtooth-wave.1 @@ -0,0 +1,35 @@ +.TH BLIND-SAWTOOTH-WAVE 1 blind +.SH NAME +blind-sawtooth-wave - Apply sawtooth-wave repetition to gradient +.SH SYNOPSIS +.B blind-sawtooth-wave +[-e] +.SH DESCRIPTION +.B blind-sawtooth-wave +reads a video from stdin, applies a filter to +each channel to it, and prints the result to +stdout. The filter is designed for applying +repetition to a gradient, and thus assumes the +range of visible values is [0, 1]. The applied +filter creates a sawtooth-wave. +.SH OPTIONS +.TP +.B -e +Apply optimisation that assumes all channels +are identical. +.SH SEE ALSO +.BR blind (7), +.BR blind-double-sine-wave (1), +.BR blind-round-wave (1), +.BR blind-sawtooth-wave (1), +.BR blind-sinc-wave (1), +.BR blind-sine-wave (1), +.BR blind-triangular-wave (1), +.BR blind-cone-gradient (1), +.BR blind-linear-gradient (1), +.BR blind-radial-gradient (1), +.BR blind-spiral-gradient (1), +.BR blind-square-gradient (1) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind-sine-wave.1 b/man/blind-sine-wave.1 @@ -0,0 +1,34 @@ +.TH BLIND-SINE-WAVE 1 blind +.SH NAME +blind-sine-wave - Apply sine-wave repetition to gradient +.SH SYNOPSIS +.B blind-sine-wave +[-e] +.SH DESCRIPTION +.B blind-sine-wave +reads a video from stdin, applies a filter to +each channel to it, and prints the result to +stdout. The filter is designed for applying +repetition to a gradient, and thus assumes the +range of visible values is [0, 1]. The applied +filter creates a sine-wave. +.SH OPTIONS +.TP +.B -e +Apply optimisation that assumes all channels +are identical. +.SH SEE ALSO +.BR blind (7), +.BR blind-double-sine-wave (1), +.BR blind-round-wave (1), +.BR blind-sawtooth-wave (1), +.BR blind-sinc-wave (1), +.BR blind-triangular-wave (1), +.BR blind-cone-gradient (1), +.BR blind-linear-gradient (1), +.BR blind-radial-gradient (1), +.BR blind-spiral-gradient (1), +.BR blind-square-gradient (1) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind-spiral-gradient.1 b/man/blind-spiral-gradient.1 @@ -0,0 +1,123 @@ +.TH BLIND-SPIRAL-GRADIENT 1 blind +.SH NAME +blind-spiral-gradient - Generate a video with a spiral gradient +.SH SYNOPSIS +.B blind-spiral-gradient +[-al] +-w +.I width +-h +.I height +.SH DESCRIPTION +.B blind-spiral-gradient +prints a video with a spiral gradient to stdout, +parameters for each from is read from each frame +in stdin. The gradient is stored in all channels +of the video. +.P +The video in stdin must contain 2 to 5 pixels per +frame (inclusively). The first pixel shall point +to the beginning of the gradient (where the value +is 0) and the second pixel shall point to the end +of the gradient (where the value is 1). In these +pixels, the value of the first channel specifies +the X-position and the value of the second +channel specifies Y-position, the other channels +are ignored. The angle of the vector between these +two pixels determine the angle of the spiral. +.P +If there are four or five pixel in each frame in +stdin, the third and fourth pixels are used to +modify the shape of the spiral so that it is +based on a superellipse instead of a circle. +The first and second channel of third pixel creates +a vector that is normalised. This vector and its +normal creates the basis an imaginary coordinate +system with its origo at the beginning of the spiral. +The superellipse defined by the equation +.RI | x |^ a +| y / m |^ b =1, +where +.I x +is the distance from origo along the vector, +.I y +is the distance from origo along the vector's normal, +.IR a , +.IR b , +and +.I m +are the values of the first, second, and third +channels, respectively, in the fourth pixel. and has +the distance 1 from origo at all points on it. If +.IR a , +.IR b , +and +.I m +have the values 2, 2, and 1, respectively, these +pixels have no effect on the spiral's shape. +The third and fourth channels in the third pixel +and the fourth channel in the fourth pixel are +ignored. +.P +If there are three or five pixels, the channels, +in order, in the last pixel, specifies the value +.IR a , +.IR e , +.IR p , +and +.IR k , +whose default values are 0, 1, 1, and 1, respectively. +.I k +is ignored unless +.B -l +is used. If +.B -l +is not used, the spiral is defined by the equation +.IR r = a +( b /( 2\fBpi\fP )^ e ) v ^( ep ). +If +.B -l +is used, the spiral is defined by the equation +.RI log( r / k )= a +(log( b )/( 2\fBpi\fP )^ e ) v ^( ep ). +.I r +is defined as the distance from the center of the +spiral, +.I b +is defined as the distance between the points +specified in the first and second pixel from stdin, +and +.I v +is defined as the angle. +.SH NOTES +Pixels after the end of the gradient have values +larger than 1. +.BR blind-*-wave (1) +commands can be used to put all values between +0 and 1. +.SH OPTIONS +.TP +.B -a +Create a spiral that gones anticlockwise. +.TP +.B -l +Create a logarithmic spiral. +.TP +.BR -w " "\fIwidth\fP +The width of the video, in pixels. +.TP +.BR -h " "\fIheight\fP +The height of the video, in pixels. +.SH SEE ALSO +.BR blind (7), +.BR blind-from-text (7), +.BR blind-double-sine-wave (1), +.BR blind-round-wave (1), +.BR blind-sawtooth-wave (1), +.BR blind-sinc-wave (1), +.BR blind-sine-wave (1), +.BR blind-triangular-wave (1), +.BR blind-cone-gradient (1), +.BR blind-linear-gradient (1), +.BR blind-radial-gradient (1), +.BR blind-square-gradient (1) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind-square-gradient.1 b/man/blind-square-gradient.1 @@ -0,0 +1,63 @@ +.TH BLIND-SQUARE-GRADIENT 1 blind +.SH NAME +blind-square-gradient - Generate a video with a square gradient +.SH SYNOPSIS +.B blind-square-gradient +[-b] +-w +.I width +-h +.I height +.SH DESCRIPTION +.B blind-square-gradient +prints a video with a square gradient to stdout, +parameters for each from is read from each frame +in stdin. The gradient is stored in all channels +of the video. +.P +The video in stdin must contain exactly 2 or 3 +pixels per frame. The first pixel shall point to +the beginning of the gradient (where the value is +0) and the second pixel shall point to the end of +the gradient (where the value is 1). In these +pixels, the value of the first channel specifies +the X-position and the value of the second +channel specifies Y-position, the other channels +are ignored. +.P +If there is a third pixel, in frames in stdin, +the value of the second channel (the Y channel) +is used to modify the shape of the square, making +it rectangular; the other channels are ignored. +The axis perpendicular to the vector between +the beginning and end of the gradient is divided +by this value. +.SH NOTES +Pixels after the end of the gradient have values +larger than 1. +.BR blind-*-wave (1) +commands can be used to put all values between +0 and 1. +.SH OPTIONS +.TP +.BR -w " "\fIwidth\fP +The width of the video, in pixels. +.TP +.BR -h " "\fIheight\fP +The height of the video, in pixels. +.SH SEE ALSO +.BR blind (7), +.BR blind-from-text (7), +.BR blind-double-sine-wave (1), +.BR blind-round-wave (1), +.BR blind-sawtooth-wave (1), +.BR blind-sinc-wave (1), +.BR blind-sine-wave (1), +.BR blind-triangular-wave (1), +.BR blind-cone-gradient (1), +.BR blind-linear-gradient (1), +.BR blind-radial-gradient (1), +.BR blind-spiral-gradient (1) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind-triangular-wave.1 b/man/blind-triangular-wave.1 @@ -0,0 +1,38 @@ +.TH BLIND-TRIANGULAR-WAVE 1 blind +.SH NAME +blind-triangular-wave - Apply triangular-wave repetition to gradient +.SH SYNOPSIS +.B blind-triangular-wave +[-es] +.SH DESCRIPTION +.B blind-triangular-wave +reads a video from stdin, applies a filter to +each channel to it, and prints the result to +stdout. The filter is designed for applying +repetition to a gradient, and thus assumes the +range of visible values is [0, 1]. The applied +filter creates a triangular wave. +.SH OPTIONS +.TP +.B -e +Apply optimisation that assumes all channels +are identical. +.TP +.B -s +Apply a variation of the filter that is +more appropriate for spiral gradient. +.SH SEE ALSO +.BR blind (7), +.BR blind-double-sine-wave (1), +.BR blind-round-wave (1), +.BR blind-sawtooth-wave (1), +.BR blind-sinc-wave (1), +.BR blind-sine-wave (1), +.BR blind-cone-gradient (1), +.BR blind-linear-gradient (1), +.BR blind-radial-gradient (1), +.BR blind-spiral-gradient (1), +.BR blind-square-gradient (1) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > diff --git a/man/blind.7 b/man/blind.7 @@ -29,10 +29,12 @@ Place videos side by side Stack videos vertically .TP .BR blind-colour-ciexyz (1) -Convert CIE XYZ for use with blind-single-colour(1) +Convert CIE XYZ for use with +.BR blind-single-colour (1) .TP .BR blind-colour-srgb (1) -Convert sRGB for use with blind-single-colour(1) +Convert sRGB for use with +.BR blind-single-colour (1) .TP .BR blind-compress (1) Compress a video for network transmission @@ -40,30 +42,40 @@ Compress a video for network transmission .BR blind-concat (1) Concatenate videos .TP +.BR blind-cone-gradient (1) +Generate a video with a cone gradient +.TP .BR blind-convert (1) Change pixel format of a video .TP -.BR blind-cross-product (1) -Calculate the cross product of colours in a video +.BR blind-coordinate-field (1) +Generate a video where each pixel indicate their position .TP .BR blind-crop (1) Extract subframes for all frames .TP +.BR blind-cross-product (1) +Calculate the cross product of colours in a video +.TP .BR blind-cut (1) Retain consecutive frames .TP .BR blind-decompress (1) -Decompress a video compressed by blind-compress(1) -.TP -.BR blind-dissolve (1) -Fade a video by chaning it's alpha channel +Decompress a video compressed by +.BR blind-compress (1) .TP .BR blind-disperse (1) Framewise split a video into multiple videos .TP +.BR blind-dissolve (1) +Fade a video by chaning it's alpha channel +.TP .BR blind-dot-product (1) Calculate the dot product of colours in a video .TP +.BR blind-double-sine-wave (1) +Apply double-sine-wave repetition to gradient +.TP .BR blind-extend (1) Add margins to a video .TP @@ -100,6 +112,9 @@ Framewise interleave videos .BR blind-invert-luma (1) Invert the luminosity of a video .TP +.BR blind-linear-gradient (1) +Generate a video with a linear gradient +.TP .BR blind-make-kernel (1) Create a custom convolution matrix .TP @@ -115,6 +130,9 @@ Premultiply the alpha channel of a video .BR blind-quaternion-product (1) Calculate the quaternion product of colours in a video .TP +.BR blind-radial-gradient (1) +Generate a video with a radial gradient +.TP .BR blind-read-head (1) Reads the head from a video .TP @@ -136,6 +154,12 @@ Rotate a video 180 degrees .BR blind-rotate-270 (1) Rotate a video 270 degrees clockwise .TP +.BR blind-round-wave (1) +Apply round wave repetition to gradient +.TP +.BR blind-sawtooth-wave (1) +Apply sawtooth-wave repetition to gradient +.TP .BR blind-set-alpha (1) Multiply the alpha channel of a video .TP @@ -145,12 +169,21 @@ Multiply the luminosity of a video .BR blind-set-saturation (1) Multiply the saturation of a video .TP +.BR blind-sinc-wave (1) +Apply cardinal sine-wave repetition to gradient +.TP .BR blind-single-colour (1) Generate a single-colour video .TP +.BR blind-sine-wave (1) +Apply sine-wave repetition to gradient +.TP .BR blind-skip-pattern (1) Skips frames in a video according to pattern .TP +.BR blind-spiral-gradient (1) +Generate a video with a spiral gradient +.TP .BR blind-split (1) Split a video, by frame, into multiple videos .TP @@ -160,6 +193,9 @@ Split a video vertically into multiple videos .BR blind-split-rows (1) Split a video horizontally into multiple videos .TP +.BR blind-square-gradient (1) +Generate a video with a square gradient +.TP .BR blind-stack (1) Overlay videos .TP @@ -192,6 +228,9 @@ Perform framewise translation of a video .BR blind-transpose (1) Transpose a video .TP +.BR blind-triangular-wave (1) +Apply triangular wave repetition to gradient +.TP .BR blind-unpremultiply (1) Unpremultiply the alpha channel of a video .TP diff --git a/src/blind-double-sine-wave.c b/src/blind-double-sine-wave.c @@ -0,0 +1,94 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" + +USAGE("[-e]") + +static int equal = 0; + + +#define PROCESS(TYPE, SUFFIX)\ + static void\ + process_##SUFFIX(struct stream *stream)\ + {\ + size_t i, n;\ + TYPE x, y, z, a;\ + do {\ + n = stream->ptr / stream->pixel_size;\ + if (equal) {\ + for (i = 0; i < n; i++) {\ + a = ((TYPE *)(stream->buf))[4 * i + 3];\ + a = posmod(a, (TYPE)2);\ + a = a > 1 ? 2 - a : a;\ + a = 1 - (sin(a * (2 * (TYPE)M_PI)) + 1) / 2;\ + ((TYPE *)(stream->buf))[4 * i + 0] = a;\ + ((TYPE *)(stream->buf))[4 * i + 1] = a;\ + ((TYPE *)(stream->buf))[4 * i + 2] = a;\ + ((TYPE *)(stream->buf))[4 * i + 3] = a;\ + }\ + } else {\ + for (i = 0; i < n; i++) {\ + x = ((TYPE *)(stream->buf))[4 * i + 0];\ + y = ((TYPE *)(stream->buf))[4 * i + 1];\ + z = ((TYPE *)(stream->buf))[4 * i + 2];\ + a = ((TYPE *)(stream->buf))[4 * i + 3];\ + x = posmod(x, (TYPE)1);\ + y = posmod(y, (TYPE)1);\ + z = posmod(z, (TYPE)1);\ + a = posmod(a, (TYPE)1);\ + x = x > 1 ? 2 - x : x;\ + y = y > 1 ? 2 - y : y;\ + z = z > 1 ? 2 - z : z;\ + a = a > 1 ? 2 - a : a;\ + x = 1 - (sin(x * (2 * (TYPE)M_PI)) + 1) / 2;\ + y = 1 - (sin(y * (2 * (TYPE)M_PI)) + 1) / 2;\ + z = 1 - (sin(z * (2 * (TYPE)M_PI)) + 1) / 2;\ + a = 1 - (sin(a * (2 * (TYPE)M_PI)) + 1) / 2;\ + ((TYPE *)(stream->buf))[4 * i + 0] = x;\ + ((TYPE *)(stream->buf))[4 * i + 1] = y;\ + ((TYPE *)(stream->buf))[4 * i + 2] = z;\ + ((TYPE *)(stream->buf))[4 * i + 3] = a;\ + }\ + }\ + n *= stream->pixel_size;\ + ewriteall(STDOUT_FILENO, stream->buf, n, "<stdout>");\ + memmove(stream->buf, stream->buf + n, stream->ptr -= n);\ + } while (eread_stream(stream, SIZE_MAX));\ + if (stream->ptr)\ + eprintf("%s: incomplete frame\n", stream->file);\ + } + +PROCESS(double, lf) +PROCESS(float, f) + + +int +main(int argc, char *argv[]) +{ + struct stream stream; + void (*process)(struct stream *stream); + + ARGBEGIN { + case 'e': + equal = 1; + break; + default: + usage(); + } ARGEND; + + if (argc) + usage(); + + eopen_stream(&stream, NULL); + + if (!strcmp(stream.pixfmt, "xyza")) + process = process_lf; + else if (!strcmp(stream.pixfmt, "xyza f")) + process = process_f; + else + eprintf("pixel format %s is not supported, try xyza\n", stream.pixfmt); + + fprint_stream_head(stdout, &stream); + efflush(stdout, "<stdout>"); + process(&stream); + return 0; +} diff --git a/src/blind-double-sinus-wave.c b/src/blind-double-sinus-wave.c @@ -1,94 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include "common.h" - -USAGE("[-e]") - -static int equal = 0; - - -#define PROCESS(TYPE, SUFFIX)\ - static void\ - process_##SUFFIX(struct stream *stream)\ - {\ - size_t i, n;\ - TYPE x, y, z, a;\ - do {\ - n = stream->ptr / stream->pixel_size;\ - if (equal) {\ - for (i = 0; i < n; i++) {\ - a = ((TYPE *)(stream->buf))[4 * i + 3];\ - a = posmod(a, (TYPE)2);\ - a = a > 1 ? 2 - a : a;\ - a = 1 - (sin(a * (2 * (TYPE)M_PI)) + 1) / 2;\ - ((TYPE *)(stream->buf))[4 * i + 0] = a;\ - ((TYPE *)(stream->buf))[4 * i + 1] = a;\ - ((TYPE *)(stream->buf))[4 * i + 2] = a;\ - ((TYPE *)(stream->buf))[4 * i + 3] = a;\ - }\ - } else {\ - for (i = 0; i < n; i++) {\ - x = ((TYPE *)(stream->buf))[4 * i + 0];\ - y = ((TYPE *)(stream->buf))[4 * i + 1];\ - z = ((TYPE *)(stream->buf))[4 * i + 2];\ - a = ((TYPE *)(stream->buf))[4 * i + 3];\ - x = posmod(x, (TYPE)1);\ - y = posmod(y, (TYPE)1);\ - z = posmod(z, (TYPE)1);\ - a = posmod(a, (TYPE)1);\ - x = x > 1 ? 2 - x : x;\ - y = y > 1 ? 2 - y : y;\ - z = z > 1 ? 2 - z : z;\ - a = a > 1 ? 2 - a : a;\ - x = 1 - (sin(x * (2 * (TYPE)M_PI)) + 1) / 2;\ - y = 1 - (sin(y * (2 * (TYPE)M_PI)) + 1) / 2;\ - z = 1 - (sin(z * (2 * (TYPE)M_PI)) + 1) / 2;\ - a = 1 - (sin(a * (2 * (TYPE)M_PI)) + 1) / 2;\ - ((TYPE *)(stream->buf))[4 * i + 0] = x;\ - ((TYPE *)(stream->buf))[4 * i + 1] = y;\ - ((TYPE *)(stream->buf))[4 * i + 2] = z;\ - ((TYPE *)(stream->buf))[4 * i + 3] = a;\ - }\ - }\ - n *= stream->pixel_size;\ - ewriteall(STDOUT_FILENO, stream->buf, n, "<stdout>");\ - memmove(stream->buf, stream->buf + n, stream->ptr -= n);\ - } while (eread_stream(stream, SIZE_MAX));\ - if (stream->ptr)\ - eprintf("%s: incomplete frame\n", stream->file);\ - } - -PROCESS(double, lf) -PROCESS(float, f) - - -int -main(int argc, char *argv[]) -{ - struct stream stream; - void (*process)(struct stream *stream); - - ARGBEGIN { - case 'e': - equal = 1; - break; - default: - usage(); - } ARGEND; - - if (argc) - usage(); - - eopen_stream(&stream, NULL); - - if (!strcmp(stream.pixfmt, "xyza")) - process = process_lf; - else if (!strcmp(stream.pixfmt, "xyza f")) - process = process_f; - else - eprintf("pixel format %s is not supported, try xyza\n", stream.pixfmt); - - fprint_stream_head(stdout, &stream); - efflush(stdout, "<stdout>"); - process(&stream); - return 0; -} diff --git a/src/blind-sine-wave.c b/src/blind-sine-wave.c @@ -0,0 +1,94 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" + +USAGE("[-e]") + +static int equal = 0; + + +#define PROCESS(TYPE, SUFFIX)\ + static void\ + process_##SUFFIX(struct stream *stream)\ + {\ + size_t i, n;\ + TYPE x, y, z, a;\ + do {\ + n = stream->ptr / stream->pixel_size;\ + if (equal) {\ + for (i = 0; i < n; i++) {\ + a = ((TYPE *)(stream->buf))[4 * i + 3];\ + a = posmod(a, (TYPE)2);\ + a = a > 1 ? 2 - a : a;\ + a = 1 - (cos(a * (TYPE)M_PI) + 1) / 2;\ + ((TYPE *)(stream->buf))[4 * i + 0] = a;\ + ((TYPE *)(stream->buf))[4 * i + 1] = a;\ + ((TYPE *)(stream->buf))[4 * i + 2] = a;\ + ((TYPE *)(stream->buf))[4 * i + 3] = a;\ + }\ + } else {\ + for (i = 0; i < n; i++) {\ + x = ((TYPE *)(stream->buf))[4 * i + 0];\ + y = ((TYPE *)(stream->buf))[4 * i + 1];\ + z = ((TYPE *)(stream->buf))[4 * i + 2];\ + a = ((TYPE *)(stream->buf))[4 * i + 3];\ + x = posmod(x, (TYPE)1);\ + y = posmod(y, (TYPE)1);\ + z = posmod(z, (TYPE)1);\ + a = posmod(a, (TYPE)1);\ + x = x > 1 ? 2 - x : x;\ + y = y > 1 ? 2 - y : y;\ + z = z > 1 ? 2 - z : z;\ + a = a > 1 ? 2 - a : a;\ + x = 1 - (cos(x * (TYPE)M_PI) + 1) / 2;\ + y = 1 - (cos(y * (TYPE)M_PI) + 1) / 2;\ + z = 1 - (cos(z * (TYPE)M_PI) + 1) / 2;\ + a = 1 - (cos(a * (TYPE)M_PI) + 1) / 2;\ + ((TYPE *)(stream->buf))[4 * i + 0] = x;\ + ((TYPE *)(stream->buf))[4 * i + 1] = y;\ + ((TYPE *)(stream->buf))[4 * i + 2] = z;\ + ((TYPE *)(stream->buf))[4 * i + 3] = a;\ + }\ + }\ + n *= stream->pixel_size;\ + ewriteall(STDOUT_FILENO, stream->buf, n, "<stdout>");\ + memmove(stream->buf, stream->buf + n, stream->ptr -= n);\ + } while (eread_stream(stream, SIZE_MAX));\ + if (stream->ptr)\ + eprintf("%s: incomplete frame\n", stream->file);\ + } + +PROCESS(double, lf) +PROCESS(float, f) + + +int +main(int argc, char *argv[]) +{ + struct stream stream; + void (*process)(struct stream *stream); + + ARGBEGIN { + case 'e': + equal = 1; + break; + default: + usage(); + } ARGEND; + + if (argc) + usage(); + + eopen_stream(&stream, NULL); + + if (!strcmp(stream.pixfmt, "xyza")) + process = process_lf; + else if (!strcmp(stream.pixfmt, "xyza f")) + process = process_f; + else + eprintf("pixel format %s is not supported, try xyza\n", stream.pixfmt); + + fprint_stream_head(stdout, &stream); + efflush(stdout, "<stdout>"); + process(&stream); + return 0; +} diff --git a/src/blind-sinus-wave.c b/src/blind-sinus-wave.c @@ -1,94 +0,0 @@ -/* See LICENSE file for copyright and license details. */ -#include "common.h" - -USAGE("[-e]") - -static int equal = 0; - - -#define PROCESS(TYPE, SUFFIX)\ - static void\ - process_##SUFFIX(struct stream *stream)\ - {\ - size_t i, n;\ - TYPE x, y, z, a;\ - do {\ - n = stream->ptr / stream->pixel_size;\ - if (equal) {\ - for (i = 0; i < n; i++) {\ - a = ((TYPE *)(stream->buf))[4 * i + 3];\ - a = posmod(a, (TYPE)2);\ - a = a > 1 ? 2 - a : a;\ - a = 1 - (cos(a * (TYPE)M_PI) + 1) / 2;\ - ((TYPE *)(stream->buf))[4 * i + 0] = a;\ - ((TYPE *)(stream->buf))[4 * i + 1] = a;\ - ((TYPE *)(stream->buf))[4 * i + 2] = a;\ - ((TYPE *)(stream->buf))[4 * i + 3] = a;\ - }\ - } else {\ - for (i = 0; i < n; i++) {\ - x = ((TYPE *)(stream->buf))[4 * i + 0];\ - y = ((TYPE *)(stream->buf))[4 * i + 1];\ - z = ((TYPE *)(stream->buf))[4 * i + 2];\ - a = ((TYPE *)(stream->buf))[4 * i + 3];\ - x = posmod(x, (TYPE)1);\ - y = posmod(y, (TYPE)1);\ - z = posmod(z, (TYPE)1);\ - a = posmod(a, (TYPE)1);\ - x = x > 1 ? 2 - x : x;\ - y = y > 1 ? 2 - y : y;\ - z = z > 1 ? 2 - z : z;\ - a = a > 1 ? 2 - a : a;\ - x = 1 - (cos(x * (TYPE)M_PI) + 1) / 2;\ - y = 1 - (cos(y * (TYPE)M_PI) + 1) / 2;\ - z = 1 - (cos(z * (TYPE)M_PI) + 1) / 2;\ - a = 1 - (cos(a * (TYPE)M_PI) + 1) / 2;\ - ((TYPE *)(stream->buf))[4 * i + 0] = x;\ - ((TYPE *)(stream->buf))[4 * i + 1] = y;\ - ((TYPE *)(stream->buf))[4 * i + 2] = z;\ - ((TYPE *)(stream->buf))[4 * i + 3] = a;\ - }\ - }\ - n *= stream->pixel_size;\ - ewriteall(STDOUT_FILENO, stream->buf, n, "<stdout>");\ - memmove(stream->buf, stream->buf + n, stream->ptr -= n);\ - } while (eread_stream(stream, SIZE_MAX));\ - if (stream->ptr)\ - eprintf("%s: incomplete frame\n", stream->file);\ - } - -PROCESS(double, lf) -PROCESS(float, f) - - -int -main(int argc, char *argv[]) -{ - struct stream stream; - void (*process)(struct stream *stream); - - ARGBEGIN { - case 'e': - equal = 1; - break; - default: - usage(); - } ARGEND; - - if (argc) - usage(); - - eopen_stream(&stream, NULL); - - if (!strcmp(stream.pixfmt, "xyza")) - process = process_lf; - else if (!strcmp(stream.pixfmt, "xyza f")) - process = process_f; - else - eprintf("pixel format %s is not supported, try xyza\n", stream.pixfmt); - - fprint_stream_head(stdout, &stream); - efflush(stdout, "<stdout>"); - process(&stream); - return 0; -}