forked from tTh/FloatImg
279 lines
6.6 KiB
C
279 lines
6.6 KiB
C
/*
|
|
* FONDERIE
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <glob.h>
|
|
#include "../floatimg.h"
|
|
|
|
#include "fonctions.h"
|
|
#include "glitches.h"
|
|
#include "crapulator.h"
|
|
#include "filterstack.h"
|
|
|
|
int verbosity;
|
|
|
|
/* -------------------------------------------------------------- */
|
|
int traite_une_image(FloatImg *image, int proc, int step, char *outd)
|
|
{
|
|
static int numero;
|
|
int foo;
|
|
char ligne[200];
|
|
|
|
/* here, we put the picz in the fifo machinery */
|
|
foo = insert_picture(image);
|
|
if (foo) {
|
|
fprintf(stderr, "%s: err %d on insert\n", __func__, foo);
|
|
return foo;
|
|
}
|
|
sprintf(ligne, "%s/%05d.png", outd, numero);
|
|
foo = export_fifo(ligne, proc, step);
|
|
if (foo) {
|
|
fprintf(stderr, "%s: err %d on export\n", __func__, foo);
|
|
return foo;
|
|
}
|
|
numero++; /* VERY IMPORTANT :) */
|
|
return 0;
|
|
}
|
|
/* -------------------------------------------------------------- */
|
|
int insert_blank(FloatImg *image, int nbre, int pproc,
|
|
float fval, char *outd)
|
|
{
|
|
int idx, foo;
|
|
int preloaded = 0;
|
|
FloatImg blank;
|
|
char *fname;
|
|
|
|
#if DEBUG_LEVEL
|
|
fprintf(stderr, ">>> %s ( %p %d %d %f '%s' )\n", __func__,
|
|
image, nbre, pproc, fval, outd);
|
|
#endif
|
|
|
|
if (NULL != (fname=getenv("BLANK_FIMG"))) {
|
|
fprintf(stderr,"%s: try to load %s\n", __func__, fname);
|
|
fimg_clone(image, &blank, 1);
|
|
foo = fimg_load_from_dump(fname, &blank);
|
|
if (foo) {
|
|
fprintf(stderr, "epic fail %d on %s\n", foo, fname);
|
|
exit(1);
|
|
}
|
|
if (verbosity) fimg_describe(&blank, "Blank pic");
|
|
preloaded = 1;
|
|
}
|
|
|
|
fimg_clear(image);
|
|
for (idx=0; idx<nbre; idx++) {
|
|
if (preloaded) {
|
|
fimg_copy_data(&blank, image);
|
|
}
|
|
else {
|
|
fimg_hdeg_a(image, fval);
|
|
}
|
|
|
|
if ((foo=traite_une_image(image, pproc, 1, outd))) {
|
|
fprintf(stderr, "%s : err %d from 'traite_une_image'\n",
|
|
__func__, foo);
|
|
break;
|
|
}
|
|
printf("\t%c\r", "ABCDEFGH"[idx%8]); fflush(stdout);
|
|
}
|
|
puts("");
|
|
|
|
if (preloaded) {
|
|
fimg_destroy(&blank);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
/* -------------------------------------------------------------- */
|
|
|
|
int demarre_la_machine(char *pattern, char *outdir, int szfifo,
|
|
int infx, int outfx, int step, int blk)
|
|
{
|
|
int foo, idx, width, height;
|
|
glob_t globbuf;
|
|
char *cptr;
|
|
FloatImg input;
|
|
double fin;
|
|
float maxvalue;
|
|
int datas[3];
|
|
|
|
#if DEBUG_LEVEL
|
|
fprintf(stderr, ">>> %s ( '%s' -> '%s' %d eff:%d:%d)\n", __func__,
|
|
pattern, outdir, szfifo, infx, outfx);
|
|
#endif
|
|
|
|
if (1 != step) fprintf(stderr, "\tstep is %d\n", step);
|
|
|
|
(void)fimg_timer_set(0);
|
|
|
|
memset(&globbuf, 0, sizeof(glob_t));
|
|
foo = glob(pattern, 0, NULL, &globbuf);
|
|
if (foo) {
|
|
fprintf(stderr, "glob (%s) failure %d\n", pattern, foo);
|
|
exit(1);
|
|
}
|
|
|
|
fprintf(stderr, "glob '%s' -> %d, %d files found\n", pattern, foo,
|
|
(int)globbuf.gl_pathc);
|
|
|
|
/* get the size of the inputs images */
|
|
foo = fimg_fileinfos(globbuf.gl_pathv[0], datas);
|
|
width = datas[0]; height = datas[1];
|
|
fprintf(stderr, "first image size %dx%d\n", width, height);
|
|
|
|
fimg_create(&input, width, height, 3);
|
|
|
|
/* get the maximum value of the first pic */
|
|
foo = fimg_load_from_dump(globbuf.gl_pathv[0], &input);
|
|
if (foo) {
|
|
fprintf(stderr, "%s: err %d loading %s\n",
|
|
__func__, foo, globbuf.gl_pathv[0]);
|
|
exit(1);
|
|
}
|
|
maxvalue = fimg_get_maxvalue(&input);
|
|
fprintf(stderr, "first image maxvalue %f\n", maxvalue);
|
|
|
|
foo = create_fifo(szfifo, width, height, FIMG_TYPE_RGB);
|
|
fprintf(stderr, "init fifo (%d slots) --> %d\n", szfifo, foo);
|
|
|
|
/* XXX inject a few strange pics in the fifo */
|
|
insert_blank(&input, blk, outfx, maxvalue, outdir);
|
|
|
|
for (idx=0; idx<globbuf.gl_pathc; idx++) {
|
|
cptr = globbuf.gl_pathv[idx];
|
|
/* first step : read the current grabed picz from disk,
|
|
and put it in our private buffer */
|
|
foo = fimg_load_from_dump(cptr, &input);
|
|
if (foo) {
|
|
fprintf(stderr, "load #%d from dump -> %d\n", idx, foo);
|
|
continue;
|
|
}
|
|
|
|
/* fscking input filter here */
|
|
if (infx) {
|
|
foo = crapulator(&input, infx, maxvalue);
|
|
}
|
|
else {
|
|
foo = filterstack_run(0, &input, 0);
|
|
}
|
|
if (foo) {
|
|
fprintf(stderr, "%s: input filter -> %d\n", __func__, foo);
|
|
exit(1);
|
|
}
|
|
foo = traite_une_image(&input, outfx, step, outdir);
|
|
if (foo) {
|
|
fprintf(stderr, "traitement %s -> %d WTF?\n", cptr, foo);
|
|
break;
|
|
}
|
|
fprintf(stderr, "\t%5d / %5d\r", idx, (int)globbuf.gl_pathc);
|
|
}
|
|
fputs("\n", stderr);
|
|
|
|
insert_blank(&input, blk, outfx, maxvalue, outdir);
|
|
|
|
/*
|
|
* PLEASE, FLUSH THE FIFO !
|
|
*/
|
|
|
|
fin = fimg_timer_get(0);
|
|
if (idx) {
|
|
fprintf(stderr, "\nelapsed %.2f seconds, %.2f s/pic\n", fin, fin/idx);
|
|
}
|
|
else {
|
|
fprintf(stderr, "\nelapsed %.2f seconds\n", fin);
|
|
}
|
|
|
|
return 8; /* why 9 ? */
|
|
}
|
|
/* -------------------------------------------------------------- */
|
|
void help(void)
|
|
{
|
|
puts("\tFONDERIE\noptions:");
|
|
|
|
puts("\t-E\tinput:filter:chain");
|
|
puts("\t-F\toutput:filter:chain");
|
|
// puts("\t-g\tconvert to gray");
|
|
puts("\t-I\tinput glob pattern");
|
|
puts("\t-L\tlist available filters");
|
|
puts("\t-O\toutput directory");
|
|
puts("\t-T\tfifo size");
|
|
puts("\t-v\tincrease verbosity");
|
|
|
|
exit(0);
|
|
}
|
|
/* -------------------------------------------------------------- */
|
|
int main (int argc, char *argv[])
|
|
{
|
|
int foo, opt;
|
|
int fifosize = 10;
|
|
char *in_pattern = "capture/?????.fimg";
|
|
char *out_dir = "p8";
|
|
// OBSOLETE int in_effect = 0;
|
|
// OBSOLETE int out_effect = 0;
|
|
int steps = 1;
|
|
int blanks = 20;
|
|
char *InFchain = "0";
|
|
char *OutFchain = "0";
|
|
|
|
fprintf(stderr, "%s\n\tcompiled %s, %s, pid %d\n",
|
|
argv[0], __DATE__, __TIME__, getpid());
|
|
fimg_print_version(2);
|
|
|
|
while ((opt = getopt(argc, argv, "B:E:F:ghI:LO:s:T:vw:x:")) != -1) {
|
|
switch(opt) {
|
|
case 'E': InFchain = optarg; break;
|
|
case 'F': OutFchain = optarg; break;
|
|
case 'B': blanks = atoi(optarg);
|
|
break;
|
|
case 'g': // convert_to_gray = 1;
|
|
break;
|
|
case 'h': help();
|
|
break;
|
|
case 'I': in_pattern = optarg;
|
|
break;
|
|
case 'L':
|
|
list_crapulors("available filters");
|
|
exit(0);
|
|
case 'O': out_dir = optarg;
|
|
break;
|
|
case 'T': fifosize = atoi(optarg);
|
|
break;
|
|
case 'v': verbosity++;
|
|
break;
|
|
// OBSOLETE case 'w': in_effect = atoi(optarg);
|
|
// OBSOLETE break;
|
|
// OBSOLETE case 'x': out_effect = atoi(optarg);
|
|
// OBSOLETE break;
|
|
case 's': steps = atoi(optarg);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (verbosity) {
|
|
fprintf(stderr, "input glob '%s'\n", in_pattern);
|
|
fprintf(stderr, "output dir '%s'\n", out_dir);
|
|
}
|
|
|
|
foo = parse_filter_chain(0, InFchain);
|
|
if (foo) {
|
|
fprintf(stderr, "err %d parsing '%s'\n", foo, InFchain);
|
|
exit(1);
|
|
}
|
|
foo = parse_filter_chain(1, OutFchain);
|
|
if (foo) {
|
|
fprintf(stderr, "err %d parsing '%s'\n", foo, OutFchain);
|
|
exit(1);
|
|
}
|
|
|
|
foo = demarre_la_machine(in_pattern, out_dir, fifosize, 0,
|
|
0, steps, blanks);
|
|
fprintf(stderr, "retour du big-run de la machine -> %d\n", foo);
|
|
|
|
return 0;
|
|
}
|
|
/* -------------------------------------------------------------- */
|