blind-primary-key - blind - suckless command-line video editing utility
HTML git clone git://git.suckless.org/blind
DIR Log
DIR Files
DIR Refs
DIR README
DIR LICENSE
---
blind-primary-key (3235B)
---
1 #!/usr/bin/env bash
2
3 set -e
4
5 if printf '%s\n' "$0" | grep / >/dev/null 2>/dev/null; then
6 export PATH="$(printf '%s\n' "$0" | tr '/\n' '\n/' | sed \$d | tr '/\n' '\n/'):${PATH}"
7 fi
8
9 pid=$$
10 o='0 0 0 0'
11 E='1 1 1 1'
12
13 x=x; y=y; z=z
14 ciexyy=0
15 zflag=
16 grey=0
17 keep=0
18
19 usage () {
20 xyy="-z x1 y1 x2 y2 x3 y3 [white-x white-y]"
21 xyz="X1 Y1 Z1 X2 Y2 Z2 X3 Y3 Z3 [white-X white-Y white-Z]"
22 printf 'usage: %s [-1 | -2 | -3] [-gk] [%s | %s]\n' "$0" "$xyy" "$xyz" >&2
23 exit 1
24 }
25
26 while ! test $# = 0; do
27 if test "$1" = --; then
28 shift 1
29 break
30 elif test "$(printf '%s\n' "$1" | sed 's/^\(.\).*$/\1/')" = -; then
31 arg="$(printf '%s\n' "$1" | sed 's/^.//')"
32 shift 1
33 while test -n "$arg"; do
34 flag="$(printf '%s\n' "$arg" | sed 's/^\(.\).*$/\1/')"
35 arg="$(printf '%s\n' "$arg" | sed 's/^.//')"
36 if test "$flag" = 1; then
37 x=x; y=y; z=z
38 elif test "$flag" = 2; then
39 x=y; y=z; z=x
40 elif test "$flag" = 3; then
41 x=z; y=x; z=y
42 elif test "$flag" = g; then
43 grey=1
44 elif test "$flag" = k; then
45 keep=1
46 elif test "$flag" = z; then
47 ciexyy=1
48 else
49 usage
50 fi
51 done
52 else
53 break
54 fi
55 done
56
57 a=$(( ( 3 - $ciexyy ) * 3 ))
58 b=$(( ( 3 - $ciexyy ) * 4 ))
59 if test $# != 0 && test $# != $a && test $# != $b; then
60 usage
61 elif test $ciexyy = 1 && test $# = 0; then
62 usage
63 fi
64
65 read frames width height pixfmt < <(blind-read-head)
66
67 if test $# = 0; then
68 convert () { cat; }
69 unconvert () { cat; }
70 else
71 if test $ciexyy = 1; then
72 zflag=-z
73 fi
74 convert () {
75 blind-affine-colour -al \
76 <(blind-colour-matrix -F "$pixfmt" $zflag -- "$@" | \
77 blind-tee \
78 >(blind-invert-matrix -e | \blind-to-named -a blind-${pid}-invmat) | \
79 blind-repeat inf -)
80 }
81 unconvert () {
82 blind-affine-colour -al \
83 <(blind-from-named -a blind-${pid}-invmat \
84 blind-arithm -xyz max <(blind-single-colour -w 3 -h 3 1) | \
85 blind-repeat inf -)
86 }
87 fi
88
89 if test $keep = 0; then
90 primary () { blind-from-named -a blind-${pid}-$x "$@"; }
91 keep_primary () { "$@"; }
92 else
93 primary () {
94 blind-from-named -a blind-${pid}-$x \
95 blind-tee >(blind-to-named -a blind-${pid}-k) | \
96 "$@"
97 }
98 keep_primary () {
99 if test $x = x; then
100 X=; Y=y; Z=z
101 elif test $x = y; then
102 X=x; Y=; Z=z
103 else
104 X=x; Y=y; Z=
105 fi
106 blind-from-named -f 7 -a blind-${pid}-k \
107 blind-arithm -a$X$Y$Z add /dev/fd/7 | \
108 "$@"
109 }
110 fi
111
112 if test $grey = 0; then
113 finalise () { unconvert; }
114 else
115 finalise () {
116 unconvert | blind-set-saturation <(blind-single-colour -f inf -w $width -h $height 0)
117 }
118 fi
119
120 (blind-write-head $frames $width $height "$pixfmt" ; cat) | \
121 convert "$@" | \
122 blind-split-chans -c \
123 >(blind-to-named -a blind-${pid}-x) \
124 >(blind-to-named -a blind-${pid}-y) \
125 >(blind-to-named -a blind-${pid}-z) \
126 - | \
127 blind-arithm mul \
128 <(blind-single-colour -f inf -w $width -h $height 0 0 0 1 | \
129 blind-arithm sub \
130 <(primary blind-affine-colour -l \
131 <(printf '%s %s %s %s\n' \
132 1 4 4 xyza \
133 $o $o $o $o \
134 $o $o $o $o \
135 $o $o $o $o \
136 $E $E $E $o | \
137 blind-from-text | \
138 blind-repeat inf -))) | \
139 keep_primary \
140 blind-from-named -f 8 -a blind-${pid}-$y blind-arithm add /dev/fd/8 | \
141 blind-from-named -f 9 -a blind-${pid}-$z blind-arithm add /dev/fd/9 | \
142 finalise