Introduction
Introduction Statistics Contact Development Disclaimer Help
blind*-mean: add -d and replace power with power-stream - blind - suckless comm…
git clone git://git.suckless.org/blind
Log
Files
Refs
README
LICENSE
---
commit ffeba5cae6ebf01f421e11eee2c4d050da0bb3f3
parent bd8018a737281770159231c060f3bfd30788a430
Author: Mattias Andrée <[email protected]>
Date: Wed, 26 Jul 2017 16:26:05 +0200
blind*-mean: add -d and replace power with power-stream
Signed-off-by: Mattias Andrée <[email protected]>
Diffstat:
M TODO | 2 --
M man/blind-mean.1 | 52 ++++++++++++++++++-----------…
M man/blind-spatial-mean.1 | 24 +++++++++++++++---------
M man/blind-temporal-mean.1 | 29 +++++++++++++++++++----------
M src/blind-mean.c | 53 +++++++++++++++++++----------…
M src/blind-spatial-mean.c | 52 +++++++++++++++++++++--------…
M src/blind-temporal-mean.c | 60 +++++++++++++++++++----------…
7 files changed, 169 insertions(+), 103 deletions(-)
---
diff --git a/TODO b/TODO
@@ -1,5 +1,3 @@
-blind-*-mean: replace power with power-stream
-
blind-transform affine transformation by matrix multiplication,…
improve quality on downscaling (pixels' neighb…
blind-apply-map remap pixels (distortion) using the X and Y val…
diff --git a/man/blind-mean.1 b/man/blind-mean.1
@@ -3,14 +3,14 @@
blind-mean - Calcuate the mean over videos for each pixel in each frame
.SH SYNOPSIS
.B blind-mean
-[-g | -h | -H | -i | -l
-.I power
+[-d | -g | -h | -H | -i | -l
+.I power-stream
| -L | -p
-.I power
+.I power-stream
| -s
-.I power
+.I power-stream
| -v | -z
-.IR power ]
+.IR power-stream ]
.I stream-1
.IR stream-2 \ ...
.SH DESCRIPTION
@@ -26,24 +26,29 @@ Unless otherwise specified, the arithmetic mean
is calculated.
.SH OPTIONS
.TP
+.B -d
+Calculate the standard deviation.
+.TP
.B -g
Calculate the geometric mean.
.TP
.B -h
Calculate the harmonic mean.
.TP
-.B -i
-Calculate the identric mean.
-.TP
.B -H
Calculate the Heronian mean.
No arguments after
.I stream-2
are allowed if this flag is used.
.TP
-.BR -l \ \fIpower\fP
-Calculate the Lehmer mean with the specified
-.IR power .
+.B -i
+Calculate the identric mean.
+.TP
+.BR -l \ \fIpower-stream\fP
+Calculate the Lehmer mean with the power
+specified in the same frame and pixel in
+the video
+.IR power-stream .
.TP
.B -L
Calculate the logarithmic mean.
@@ -51,15 +56,17 @@ No arguments after
.I stream-2
are allowed if this flag is used.
.TP
-.BR -p \ \fIpower\fP
+.BR -p \ \fIpower-stream\fP
Calculate the power mean (Hölder mean) with
-the specified
-.IR power .
+the power specified in the same frame and
+pixel in the video
+.IR power-stream .
.TP
-.BR -s \ \fIpower\fP
-Calculate the Stolarsky mean with
-the specified
-.IR power .
+.BR -s \ \fIpower-stream\fP
+Calculate the Stolarsky mean with the power
+specified in the same frame and pixel in
+the video
+.IR power-stream .
No arguments after
.I stream-2
are allowed if this flag is used.
@@ -67,10 +74,11 @@ are allowed if this flag is used.
.B -v
Calculate the variance.
.TP
-.BR -z \ \fIpower\fP
-Calculate the Heinz meanw ith
-the specified
-.IR power .
+.BR -z \ \fIpower-stream\fP
+Calculate the Heinz mean with the power
+specified in the same frame and pixel in
+the video
+.IR power-stream .
No arguments after
.I stream-2
are allowed if this flag is used.
diff --git a/man/blind-spatial-mean.1 b/man/blind-spatial-mean.1
@@ -3,10 +3,10 @@
blind-spatial-mean - Calculate the mean over all pixel for each frame in a vid…
.SH SYNOPSIS
.B blind-spatial-mean
-[-g | -h | -l
-.I power
+[-d | -g | -h | -l
+.I power-stream
| -p
-.I power
+.I power-stream
| -v]
.SH DESCRIPTION
.B blind-spatial-mean
@@ -19,20 +19,26 @@ Unless otherwise specified, the arithmetic mean
is calculated.
.SH OPTIONS
.TP
+.B -d
+Calculate the standard deviation.
+.TP
.B -g
Calculate the geometric mean.
.TP
.B -h
Calculate the harmonic mean.
.TP
-.BR -l \ \fIpower\fP
-Calculate the Lehmer mean with the specified
-.IR power .
+.BR -l \ \fIpower-stream\fP
+Calculate the Lehmer mean with the power
+specified in the same single-pixel frame
+in the video
+.IR power-stream .
.TP
-.BR -p \ \fIpower\fP
+.BR -p \ \fIpower-stream\fP
Calculate the power mean (Hölder mean) with
-the specified
-.IR power .
+the power specified in the same single-pixel
+frame in the video
+.IR power-stream .
.TP
.B -v
Calculate the variance.
diff --git a/man/blind-temporal-mean.1 b/man/blind-temporal-mean.1
@@ -3,10 +3,10 @@
blind-temporal-mean - Calculate the mean over all frames in a video for each p…
.SH SYNOPSIS
.B blind-temporal-mean
-[-g | -h | -l
-.I power
+[-d | -g | -h | -l
+.I power-stream
| -p
-.I power
+.I power-stream
| -v]
.SH DESCRIPTION
.B blind-temporal-mean
@@ -19,20 +19,26 @@ Unless otherwise specified, the arithmetic mean
is calculated.
.SH OPTIONS
.TP
+.B -d
+Calculate the standard deviation.
+.TP
.B -g
Calculate the geometric mean.
.TP
.B -h
Calculate the harmonic mean.
.TP
-.BR -l \ \fIpower\fP
-Calculate the Lehmer mean with the specified
-.IR power .
+.BR -l \ \fIpower-stream\fP
+Calculate the Lehmer mean with the power
+specified in the same pixel in the single-frame
+video
+.IR power-stream .
.TP
-.BR -p \ \fIpower\fP
+.BR -p \ \fIpower-stream\fP
Calculate the power mean (Hölder mean) with
-the specified
-.IR power .
+the power specified in the same pixel in the
+single-frame video
+.IR power-stream .
.TP
.B -v
Calculate the variance.
@@ -40,10 +46,13 @@ Calculate the variance.
.B blind-temporal-mean
requires enough free memory to load two full frames memory.
A frame requires 32 bytes per pixel it contains. If
-.B -l
+.B -p
or
.B -v
is used, enough free memory to load three full frames
+memory is required. If
+.B -l
+is used, enough free memory to load four full frames
memory is required.
.P
.B blind-temporal-mean
diff --git a/src/blind-mean.c b/src/blind-mean.c
@@ -1,7 +1,7 @@
/* See LICENSE file for copyright and license details. */
#include "common.h"
-USAGE("[-g | -h | -H | -i | -l power | -L | -p power | -s power | -v | -z powe…
+USAGE("[-d | -g | -h | -H | -i | -l power-stream | -L | -p power-stream | -s p…
/* TODO add [-w weight-stream] for [-ghlpv] */
/* Because the syntax for a function returning a function pointer is disgustin…
@@ -18,6 +18,9 @@ typedef void (*process_func)(struct stream *streams, size_t n…
#define LIST_MEANS(TYPE)\
/* [default] arithmetic mean */\
X(ARITHMETIC, arithmetic, sn = (TYPE)1 / sn, 0, img += val, img *= sn)…
+ /* standard deviation */\
+ X(STANDARD_DEVIATION, sd, sn = (TYPE)1 / sn, 0, (img += val * val, aux…
+ img = nnpow((img - aux * aux * sn) * sn, (TYPE)0.5))\
/* geometric mean */\
X(GEOMETRIC, geometric, sn = (TYPE)1 / sn, 1, img *= val, img = nnpow(…
/* harmonic mean */\
@@ -30,32 +33,32 @@ typedef void (*process_func)(struct stream *streams, size_t…
img = auxs[0] == auxs[1] ? auxs[0] :\
nnpow(nnpow(auxs[0], auxs[0]) / nnpow(auxs[1], auxs[1]), auxs[…
/* Lehmer mean */\
- X(LEHMER, lehmer, (a = (TYPE)power, b = a - (TYPE)1), 0,\
- (img += nnpow(val, a), aux += nnpow(val, b)), img /= aux)\
+ X(LEHMER, lehmer,, 0, (img += nnpow(val, *pows), aux += nnpow(val, *po…
/* logarithmic mean */\
X(LOGARITHMIC, logarithmic,, 0, auxs[j] = val,\
img = auxs[0] == auxs[1] ? auxs[0] : (!auxs[0] || !auxs[1]) ? (TYPE)…
(auxs[1] - auxs[0]) / log(auxs[1] / auxs[0]))\
/* power mean (Hölder mean) (m = 2 for root square mean; m = 3 for cu…
- X(POWER, power, (a = (TYPE)power, b = (TYPE)(1. / power), sn = (TYPE)1…
- img += nnpow(val, a), img = nnpow(img, b) * sn)\
+ X(POWER, power, sn = (TYPE)1 / sn, 0,\
+ img += nnpow(val, *pows), img = nnpow(img, (TYPE)1 / *pows) * sn)\
/* Stolarsky mean */\
- X(STOLARSKY, stolarsky, (a = (TYPE)power, b = (TYPE)(1. / (power - 1.)…
+ X(STOLARSKY, stolarsky,, 0, auxs[j] = val,\
img = auxs[0] == auxs[1] ? auxs[0] :\
- nnpow((nnpow(auxs[0], auxs[0]) - nnpow(auxs[1], auxs[1])) /\
- (a * (auxs[0] - auxs[1])), b))\
+ nnpow((nnpow(auxs[0], *pows) - nnpow(auxs[1], *pows)) /\
+ (*pows * (auxs[0] - auxs[1])), (TYPE)1 / (*pows - (TYPE)…
/* variance */\
X(VARIANCE, variance, sn = (TYPE)1 / sn, 0, (img += val * val, aux += …
img = (img - aux * aux * sn) * sn)\
/* Heinz mean */\
- X(HEINZ, heinz, (a = (TYPE)power, b = (TYPE)1 - a), 0, auxs[j] = val,\
- img = (nnpow(auxs[0], a) * nnpow(auxs[1], b) + nnpow(auxs[0], b) * n…
+ X(HEINZ, heinz,, 0, auxs[j] = val,\
+ img = (nnpow(auxs[0], *pows) * nnpow(auxs[1], (TYPE)1 - *pows) +\
+ nnpow(auxs[0], (TYPE)1 - *pows) * nnpow(auxs[1], *pows)) / (T…
#define X(V, ...) V,
enum method { LIST_MEANS() };
#undef X
-static double power;
+static const char *power_file = NULL;
#define aux (*auxs)
#define MAKE_PROCESS(PIXFMT, TYPE,\
@@ -64,9 +67,12 @@ static double power;
process_##PIXFMT##_##NAME(struct stream *streams, size_t n_streams, si…
{\
size_t i, j;\
- TYPE img, auxs[2], val, a, b, sn = (TYPE)n_streams;\
+ TYPE img, auxs[2], val, a, sn;\
+ TYPE *pows = power_file ? (TYPE *)(streams[n_streams - 1].buf)…
+ n_streams -= (size_t)!!power_file;\
+ sn = (TYPE)n_streams;\
INIT;\
- for (i = 0; i < n; i += sizeof(TYPE)) {\
+ for (i = 0; i < n; i += sizeof(TYPE), pows++) {\
img = auxs[0] = auxs[1] = INITIAL;\
for (j = 0; j < n_streams; j++) {\
val = *(TYPE *)(streams[j].buf + i);\
@@ -75,7 +81,7 @@ static double power;
FINALISE_SUBCELL;\
*(TYPE *)(streams->buf + i) = img;\
}\
- (void) aux, (void) a, (void) b, (void) sn;\
+ (void) aux, (void) a, (void) pows, (void) sn;\
}
#define X(...) MAKE_PROCESS(lf, double, __VA_ARGS__)
LIST_MEANS(double)
@@ -103,7 +109,11 @@ main(int argc, char *argv[])
enum method method = ARITHMETIC;
int i, two = 0;
+
ARGBEGIN {
+ case 'd':
+ method = STANDARD_DEVIATION;
+ break;
case 'g':
method = GEOMETRIC;
break;
@@ -120,7 +130,7 @@ main(int argc, char *argv[])
break;
case 'l':
method = LEHMER;
- power = etolf_flag('l', UARGF());
+ power_file = UARGF();
break;
case 'L':
method = LOGARITHMIC;
@@ -128,12 +138,12 @@ main(int argc, char *argv[])
break;
case 'p':
method = POWER;
- power = etolf_flag('p', UARGF());
+ power_file = UARGF();
break;
case 's':
method = STOLARSKY;
two = 1;
- power = etolf_flag('s', UARGF());
+ power_file = UARGF();
break;
case 'v':
method = VARIANCE;
@@ -141,7 +151,7 @@ main(int argc, char *argv[])
case 'z':
method = HEINZ;
two = 1;
- power = etolf_flag('z', UARGF());
+ power_file = UARGF();
break;
default:
usage();
@@ -150,12 +160,14 @@ main(int argc, char *argv[])
if (argc < 2 || (argc > 2 && two))
usage();
- streams = alloca((size_t)argc * sizeof(*streams));
+ streams = alloca((size_t)(argc + !!power_file) * sizeof(*streams));
for (i = 0; i < argc; i++) {
eopen_stream(streams + i, argv[i]);
if (streams[i].frames && streams[i].frames < frames)
frames = streams[i].frames;
}
+ if (power_file != NULL)
+ eopen_stream(streams + argc, power_file);
if (streams->encoding == DOUBLE)
process = process_functions_lf[method];
@@ -166,6 +178,7 @@ main(int argc, char *argv[])
fprint_stream_head(stdout, streams);
efflush(stdout, "<stdout>");
streams->frames = tmp;
- process_multiple_streams(streams, (size_t)argc, STDOUT_FILENO, "<stdou…
+ process_multiple_streams(streams, (size_t)(argc + !!power_file),
+ STDOUT_FILENO, "<stdout>", 1, process);
return 0;
}
diff --git a/src/blind-spatial-mean.c b/src/blind-spatial-mean.c
@@ -1,12 +1,13 @@
/* See LICENSE file for copyright and license details. */
#include "common.h"
-USAGE("[-g | -h | -l power | -p power | -v]")
+USAGE("[-d | -g | -h | -l power-stream | -p power-stream | -v]")
/* TODO add [-w weight-stream] for [-ghlpv] */
/* Because the syntax for a function returning a function pointer is disgustin…
typedef void (*process_func)(struct stream *stream);
+#define C (j & 3)
/*
* X-parameter 1: method enum value
* X-parameter 2: identifier-friendly name
@@ -17,37 +18,41 @@ typedef void (*process_func)(struct stream *stream);
*/
#define LIST_MEANS(TYPE)\
/* [default] arithmetic mean */\
- X(ARITHMETIC, arithmetic,, 0, img[j & 3] += *buf, img[j & 3] /= pixels…
+ X(ARITHMETIC, arithmetic,, 0, img[C] += *buf, img[C] /= pixels)\
+ /* standard deviation */\
+ X(STANDARD_DEVIATION, sd,, 0, (img[C] += *buf * *buf, aux[C] += *buf),\
+ img[C] = nnpow((img[C] - aux[C] * aux[C] / pixels) / pixels, (TYPE)0…
/* geometric mean */\
- X(GEOMETRIC, geometric,, 1, img[j & 3] *= *buf, img[j & 3] = nnpow(img…
+ X(GEOMETRIC, geometric,, 1, img[C] *= *buf, img[C] = nnpow(img[C], 1 /…
/* harmonic mean */\
- X(HARMONIC, harmonic,, 0, img[j & 3] += (TYPE)1 / *buf, img[j & 3] = p…
+ X(HARMONIC, harmonic,, 0, img[C] += (TYPE)1 / *buf, img[C] = pixels / …
/* Lehmer mean */\
- X(LEHMER, lehmer, (a = (TYPE)power, b = a - (TYPE)1), 0,\
- (img[j & 3] += nnpow(*buf, a), aux[j & 3] += nnpow(*buf, b)), img[j …
+ X(LEHMER, lehmer, (a[0] = powers[0] - (TYPE)1, a[1] = powers[1] - (TYP…
+ a[2] = powers[2] - (TYPE)1, a[3] = powers[3] - (TYP…
+ (img[C] += nnpow(*buf, powers[C]), aux[C] += nnpow(*buf, a[C])), img…
/* power mean (Hölder mean) (m = 2 for root square mean; m = 3 for cu…
- X(POWER, power, a = (TYPE)power, 0, img[j & 3] += nnpow(*buf, a),\
- img[j & 3] = nnpow(img[j & 3], (TYPE)(1. / power)) / pixels)\
+ X(POWER, power,, 0, img[C] += nnpow(*buf, powers[C]),\
+ img[C] = nnpow(img[C], (TYPE)1 / powers[C]) / pixels)\
/* variance */\
- X(VARIANCE, variance,, 0, (img[j & 3] += *buf * *buf, aux[j & 3] += *b…
- img[j & 3] = (img[j & 3] - aux[j & 3] * aux[j & 3] / pixels) / pixel…
+ X(VARIANCE, variance,, 0, (img[C] += *buf * *buf, aux[C] += *buf),\
+ img[C] = (img[C] - aux[C] * aux[C] / pixels) / pixels)
#define X(V, ...) V,
enum method { LIST_MEANS() };
#undef X
-static double power;
+static struct stream power;
+static const char *power_file = NULL;
#define MAKE_PROCESS(PIXFMT, TYPE,\
_1, NAME, INIT, INITIAL, PROCESS_SUBCELL, FINALISE_SUBCEL…
static void\
process_##PIXFMT##_##NAME(struct stream *stream)\
{\
- TYPE img[4], aux[4], *buf, a, b;\
+ TYPE img[4], aux[4], *buf, a[4], powers[4];\
TYPE pixels = (TYPE)(stream->frame_size / sizeof(img));\
size_t i, n, j = 0, m = stream->frame_size / sizeof(*img);\
int first = 1;\
- INIT;\
do {\
n = stream->ptr / stream->pixel_size * stream->n_chan;\
buf = (TYPE *)(stream->buf);\
@@ -60,6 +65,9 @@ static double power;
ewriteall(STDOUT_FILENO, img, …
}\
first = 0;\
+ if (power_file && !eread_frame(&power,…
+ return;\
+ INIT;\
img[0] = aux[0] = INITIAL;\
img[1] = aux[1] = INITIAL;\
img[2] = aux[2] = INITIAL;\
@@ -75,7 +83,7 @@ static double power;
FINALISE_SUBCELL;\
ewriteall(STDOUT_FILENO, img, sizeof(img), "<stdout>")…
}\
- (void) aux, (void) a, (void) b, (void) pixels;\
+ (void) aux, (void) a, (void) powers, (void) pixels;\
}
#define X(...) MAKE_PROCESS(lf, double, __VA_ARGS__)
LIST_MEANS(double)
@@ -84,6 +92,7 @@ LIST_MEANS(double)
LIST_MEANS(float)
#undef X
#undef MAKE_PROCESS
+#undef C
#define X(ID, NAME, ...) [ID] = process_lf_##NAME,
static const process_func process_functions_lf[] = { LIST_MEANS() };
@@ -101,6 +110,9 @@ main(int argc, char *argv[])
enum method method = ARITHMETIC;
ARGBEGIN {
+ case 'd':
+ method = STANDARD_DEVIATION;
+ break;
case 'g':
method = GEOMETRIC;
break;
@@ -109,11 +121,11 @@ main(int argc, char *argv[])
break;
case 'l':
method = LEHMER;
- power = etolf_flag('l', UARGF());
+ power_file = UARGF();
break;
case 'p':
method = POWER;
- power = etolf_flag('p', UARGF());
+ power_file = UARGF();
break;
case 'v':
method = VARIANCE;
@@ -126,13 +138,19 @@ main(int argc, char *argv[])
usage();
eopen_stream(&stream, NULL);
+ if (power_file != NULL) {
+ eopen_stream(&power, power_file);
+ if (power.width != 1 || power.height != 1)
+ eprintf("%s: videos do not have the 1x1 geometry\n", p…
+ if (strcmp(power.pixfmt, stream.pixfmt))
+ eprintf("videos use incompatible pixel formats\n");
+ }
if (stream.encoding == DOUBLE)
process = process_functions_lf[method];
else
process = process_functions_f[method];
-
if (DPRINTF_HEAD(STDOUT_FILENO, stream.frames, 1, 1, stream.pixfmt) < …
eprintf("dprintf:");
process(&stream);
diff --git a/src/blind-temporal-mean.c b/src/blind-temporal-mean.c
@@ -1,7 +1,7 @@
/* See LICENSE file for copyright and license details. */
#include "common.h"
-USAGE("[-g | -h | -l power | -p power | -v]")
+USAGE("[-d | -g | -h | -l power-stream | -p power-stream | -v]")
/* TODO add [-w weight-stream] for [-ghlpv] */
/* Because the syntax for a function returning a function pointer is disgustin…
@@ -19,24 +19,26 @@ typedef void (*process_func)(struct stream *stream, void *b…
*/
#define LIST_MEANS(TYPE)\
/* [default] arithmetic mean */\
- X(ARITHMETIC, arithmetic, 1, COPY_FRAME,, *img1 += *buf,\
- a = (TYPE)1 / (TYPE)frame, *img1 *= a)\
+ X(ARITHMETIC, arithmetic, 1, COPY_FRAME,, *img += *buf,\
+ a = (TYPE)1 / (TYPE)frame, *img *= a)\
+ /* standard deviation */\
+ X(STANDARD_DEVIATION, sd, 2, ZERO_AND_PROCESS_FRAME,, (*img += *buf * …
+ a = (TYPE)1 / (TYPE)frame, *img = nnpow((*img - *aux * *aux * a) * a…
/* geometric mean */\
- X(GEOMETRIC, geometric, 1, COPY_FRAME,, *img1 *= *buf,\
- a = (TYPE)1 / (TYPE)frame, *img1 = nnpow(*img1, a))\
+ X(GEOMETRIC, geometric, 1, COPY_FRAME,, *img *= *buf,\
+ a = (TYPE)1 / (TYPE)frame, *img = nnpow(*img, a))\
/* harmonic mean */\
- X(HARMONIC, harmonic, 1, ZERO_AND_PROCESS_FRAME,, *img1 += (TYPE)1 / *…
- a = (TYPE)frame, *img1 = a / *img1)\
+ X(HARMONIC, harmonic, 1, ZERO_AND_PROCESS_FRAME,, *img += (TYPE)1 / *b…
+ a = (TYPE)frame, *img = a / *img)\
/* Lehmer mean */\
- X(LEHMER, lehmer, 2, ZERO_AND_PROCESS_FRAME, (a = (TYPE)power, b = a -…
- (*img1 += nnpow(*buf, a), *img2 += nnpow(*buf, b)),, *img1 /= *img2)\
+ X(LEHMER, lehmer, 2, ZERO_AND_PROCESS_FRAME,,\
+ (*img += nnpow(*buf, *pows), *aux += nnpow(*buf, *pows - (TYPE)1)),,…
/* power mean (Hölder mean) (m = 2 for root square mean; m = 3 for cu…
- X(POWER, power, 1, ZERO_AND_PROCESS_FRAME, a = (TYPE)power,\
- *img1 += nnpow(*buf, a), (a = (TYPE)1 / (TYPE)frame, b = (TYPE)(1. /…
- *img1 = a * nnpow(*img1, b))\
+ X(POWER, power, 1, ZERO_AND_PROCESS_FRAME,, *img += nnpow(*buf, *pows)…
+ a = (TYPE)1 / (TYPE)frame, *img = a * nnpow(*img, (TYPE)1 / *pows))\
/* variance */\
- X(VARIANCE, variance, 2, ZERO_AND_PROCESS_FRAME,, (*img1 += *buf * *bu…
- a = (TYPE)1 / (TYPE)frame, *img1 = (*img1 - *img2 * *img2 * a) * a)
+ X(VARIANCE, variance, 2, ZERO_AND_PROCESS_FRAME,, (*img += *buf * *buf…
+ a = (TYPE)1 / (TYPE)frame, *img = (*img - *aux * *aux * a) * a)
enum first_frame_action {
COPY_FRAME,
@@ -48,31 +50,31 @@ enum first_frame_action {
enum method { LIST_MEANS() };
#undef X
-static double power;
+static void *powerbuf = NULL;
#define MAKE_PROCESS(PIXFMT, TYPE,\
_1, NAME, _3, _4, PRE_PROCESS, PROCESS_SUBCELL, PRE_FINAL…
static void\
process_##PIXFMT##_##NAME(struct stream *stream, void *buffer, void *i…
{\
- TYPE *buf = buffer, *img1 = image, a, b;\
- TYPE *img2 = (TYPE *)(((char *)image) + stream->frame_size);\
+ TYPE *buf = buffer, *img = image, a, *pows = powerbuf;\
+ TYPE *aux = (TYPE *)(((char *)image) + stream->frame_size);\
size_t x, y, z;\
if (!buf) {\
PRE_FINALISE;\
for (z = 0; z < stream->n_chan; z++)\
for (y = 0; y < stream->height; y++)\
- for (x = 0; x < stream->width; x++, im…
+ for (x = 0; x < stream->width; x++, im…
FINALISE_SUBCELL;\
} else {\
PRE_PROCESS;\
for (z = 0; z < stream->n_chan; z++)\
for (y = 0; y < stream->height; y++)\
- for (x = 0; x < stream->width; x++, im…
+ for (x = 0; x < stream->width; x++, im…
PROCESS_SUBCELL;\
}\
}\
- (void) img2, (void) a, (void) b, (void) frame;\
+ (void) aux, (void) a, (void) pows, (void) frame;\
}
#define X(...) MAKE_PROCESS(lf, double, __VA_ARGS__)
LIST_MEANS(double)
@@ -93,14 +95,18 @@ static const process_func process_functions_f[] = { LIST_ME…
int
main(int argc, char *argv[])
{
- struct stream stream;
+ struct stream stream, power;
void *buf, *img;
process_func process;
size_t frames, images;
enum method method = ARITHMETIC;
enum first_frame_action first_frame_action;
+ const char *power_file = NULL;
ARGBEGIN {
+ case 'd':
+ method = STANDARD_DEVIATION;
+ break;
case 'g':
method = GEOMETRIC;
break;
@@ -109,11 +115,11 @@ main(int argc, char *argv[])
break;
case 'l':
method = LEHMER;
- power = etolf_flag('l', UARGF());
+ power_file = UARGF();
break;
case 'p':
method = POWER;
- power = etolf_flag('p', UARGF());
+ power_file = UARGF();
break;
case 'v':
method = VARIANCE;
@@ -138,6 +144,13 @@ main(int argc, char *argv[])
#undef X
eopen_stream(&stream, NULL);
+ if (power_file != NULL) {
+ eopen_stream(&power, power_file);
+ echeck_compat(&stream, &power);
+ powerbuf = emalloc(power.frame_size);
+ if (!eread_frame(&power, powerbuf))
+ eprintf("%s is no frames\n", power_file);
+ }
if (stream.encoding == DOUBLE)
process = process_functions_lf[method];
@@ -169,5 +182,6 @@ main(int argc, char *argv[])
ewriteall(STDOUT_FILENO, img, stream.frame_size, "<stdout>");
free(buf);
free(img);
+ free(powerbuf);
return 0;
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.