Compare commits
23 Commits
4e7debaae6
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8202df9a63 | ||
|
|
67ba638690 | ||
|
|
e8a7bf28e3 | ||
|
|
b19107d71b | ||
|
|
fabe94792b | ||
|
|
d1e67f7397 | ||
|
|
28453e862a | ||
|
|
2147d4b164 | ||
|
|
b0983ab18b | ||
|
|
08fcf513cc | ||
|
|
e6b72e5faa | ||
|
|
756766ca42 | ||
|
|
9ede78fa5d | ||
|
|
506bf39393 | ||
|
|
26e82619fb | ||
|
|
91440e7ea5 | ||
|
|
5fbff721d8 | ||
|
|
d510e56d44 | ||
|
|
2a8348f0f9 | ||
|
|
f473a58f75 | ||
|
|
556e1ad825 | ||
|
|
23842595fd | ||
|
|
6069c45b5a |
@@ -7,12 +7,12 @@ COPT = -g -fpic -no-pie -Wall -DDEBUG_LEVEL=0 -Werror=parentheses
|
||||
LIBS = ../libfloatimg.a -ltiff -lpnglite -lm -lz -lcfitsio
|
||||
|
||||
OBJS = fifo.o sfx.o crapulator.o glitches.o metriques.o \
|
||||
filterstack.o single.o
|
||||
filterstack.o single.o utilfuncs.o
|
||||
|
||||
DEPS = ../floatimg.h \
|
||||
../libfloatimg.a \
|
||||
fifo.h crapulator.h metriques.h glitches.h sfx.h \
|
||||
filterstack.h crapdef.h crapstr.h single.h
|
||||
filterstack.h crapdef.h crapstr.h single.h utilfuncs.h
|
||||
|
||||
all: fonderie interpolator singlepass t
|
||||
|
||||
@@ -71,4 +71,7 @@ metriques.o: metriques.c metriques.h Makefile
|
||||
glitches.o: glitches.c glitches.h Makefile
|
||||
gcc ${COPT} -c $<
|
||||
|
||||
utilfuncs.o: utilfuncs.c utilfuncs.h Makefile
|
||||
gcc ${COPT} -c $<
|
||||
|
||||
# ---------------------------------------------------------
|
||||
|
||||
@@ -7,8 +7,10 @@ de **films flous** dans le domaine spatio-temporel.
|
||||
|
||||
À l'heure actuelle, il y a plusieurs programmes distincts. Le premier
|
||||
(fonderie) fait une moyenne mobile sur N images consécutives,
|
||||
et le second (interpolator) fait un fondu-enchainé de N pas
|
||||
entre deux images consécutives.
|
||||
le second (interpolator) fait un fondu-enchainé de N pas
|
||||
entre deux images consécutives,
|
||||
et le troisième (singlepass) fait d'autres trucs, comme
|
||||
répéter N fois un image pour avoir une vidéo sacadée.
|
||||
|
||||
Mais avant et après un de ces deux traitements, il y a des chaines
|
||||
de filtres...
|
||||
@@ -72,6 +74,8 @@ GLOB=${GRABDIR}'/?????.fimg'
|
||||
${FONDEUR} -I "$GLOB" -E cos01:trinitron -F classtrial -T 30
|
||||
```
|
||||
|
||||
Par défaut le répertoire où sont exportées les images est nommé
|
||||
`p8/` et il doit être là, c'est donc à vous de le créer.
|
||||
Votre machine va maintenant mouliner avec entrain et persévérance,
|
||||
puis
|
||||
ensuite il vous suffira d'encoder toutes les images générées dans
|
||||
@@ -94,7 +98,7 @@ assez rudimentaire, avec un paramétrage simpliste, et un manque
|
||||
criant de documentation...
|
||||
|
||||
Dans la même équipe, vous pouvez aussi aller contempler `glitches.c`
|
||||
pour voir le genre de traitement que l'on fait subir à nox pixels
|
||||
pour voir le genre de traitement que l'on fait subir à nos pixels
|
||||
flottants.
|
||||
|
||||
## Interpolator
|
||||
@@ -111,8 +115,8 @@ usage:
|
||||
interpolator [options] <inglob> <outdir> <nbsteep>
|
||||
options:
|
||||
-S nn mysterious sort
|
||||
-E i:bla:k input filter chain
|
||||
-F name:j output filter chain
|
||||
-E foo:bla:kr input filter chain
|
||||
-F name:just output filter chain
|
||||
-L list available filters
|
||||
-v increase verbosity
|
||||
```
|
||||
@@ -129,6 +133,7 @@ usage:
|
||||
-F define:the:filter:chain
|
||||
-g input glob pattern
|
||||
-L list available filters
|
||||
-r N repetiiing factor
|
||||
-O /output/directory
|
||||
-v spit more messages
|
||||
```
|
||||
|
||||
@@ -514,6 +514,11 @@ switch (idFx) {
|
||||
retval = fimg_to_gray(image);
|
||||
break;
|
||||
|
||||
case CR_shift0:
|
||||
/* added Sun Sep 29 16:55:54 UTC 2024 */
|
||||
retval = fimg_auto_shift_to_zero(image, image);
|
||||
// fprintf(stderr, "******** Shift Zero -> %d\n", retval);
|
||||
break;
|
||||
|
||||
default :
|
||||
fprintf(stderr, "%s : effect #%d invalid\n",
|
||||
|
||||
@@ -47,5 +47,6 @@
|
||||
80 thermocol 1 0
|
||||
81 triptyq 1 0
|
||||
90 togray 1 0
|
||||
91 shift0 1 0
|
||||
-1 end 1 1.0
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <glob.h>
|
||||
#include "../floatimg.h"
|
||||
|
||||
#include "utilfuncs.h"
|
||||
#include "fifo.h"
|
||||
#include "glitches.h"
|
||||
#include "crapulator.h"
|
||||
@@ -186,10 +187,12 @@ 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-O\toutput directory (default p8/)");
|
||||
puts("\t-T\tfifo size");
|
||||
puts("\t-v\tincrease verbosity");
|
||||
|
||||
if (verbosity) { puts(""); fimg_print_version(2); puts(""); }
|
||||
|
||||
exit(0);
|
||||
}
|
||||
/* -------------------------------------------------------------- */
|
||||
@@ -206,7 +209,6 @@ char *OutFchain = "none";
|
||||
|
||||
fprintf(stderr, "*** %s\n\tcompiled %s, %s, pid %d\n",
|
||||
argv[0], __DATE__, __TIME__, getpid());
|
||||
if (verbosity) fimg_print_version(2);
|
||||
|
||||
while ((opt = getopt(argc, argv, "B:E:F:ghI:LO:T:vw:x:")) != -1) {
|
||||
switch(opt) {
|
||||
@@ -240,6 +242,15 @@ if (verbosity) {
|
||||
fprintf(stderr, "\tout filter '%s'\n", OutFchain);
|
||||
fprintf(stderr, "\tfifo size %d\n", fifosize);
|
||||
}
|
||||
/*
|
||||
* check for the export directory
|
||||
*/
|
||||
foo = check_if_export_dir_is_valid(out_dir, 0);
|
||||
if ( !foo ) {
|
||||
fprintf(stderr, "** export dir (%s) not valid\n", out_dir);
|
||||
fprintf(stderr, "** may be you have to create it ?\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
foo = parse_filter_chain(0, InFchain);
|
||||
if (foo) {
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
#include "../floatimg.h"
|
||||
|
||||
#include "utilfuncs.h"
|
||||
#include "fifo.h"
|
||||
#include "glitches.h"
|
||||
#include "crapulator.h"
|
||||
@@ -55,7 +56,7 @@ IdxValue *idxvalues;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s ( %p %p %d %p)\n", __func__, ptr_glob,
|
||||
ptr_idxval, method, average);
|
||||
ptr_idxval, method, p_average);
|
||||
#endif
|
||||
|
||||
if (0==method && verbosity) {
|
||||
@@ -140,8 +141,8 @@ foo = glob(pattern, 0, NULL, &globbuf);
|
||||
fprintf(stderr, " globbing '%s' -> %d, %d files found\n",
|
||||
pattern, foo, (int)globbuf.gl_pathc);
|
||||
if (0 == globbuf.gl_pathc) {
|
||||
fprintf(stderr, "%s : no file found, aborting\n", __func__);
|
||||
return -1;
|
||||
fprintf(stderr, "%s : no file found, ABEND\n", __func__);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
idx_values = NULL;
|
||||
@@ -240,9 +241,7 @@ puts("\t-S nn\t\tmysterious sort");
|
||||
puts("\t-L\t\tlist available filters");
|
||||
puts("\t-v\t\tincrease verbosity");
|
||||
|
||||
if (verbosity) {
|
||||
list_crapulors("available filters");
|
||||
}
|
||||
if (verbosity) { puts(""); fimg_print_version(2); puts(""); }
|
||||
|
||||
exit(0);
|
||||
}
|
||||
@@ -257,6 +256,7 @@ int opt;
|
||||
int sort = 0;
|
||||
char *InFchain = "0";
|
||||
char *OutFchain = "0";
|
||||
char *out_dir = "p8/";
|
||||
|
||||
fprintf(stderr, "*** %s\n\tcompiled on %s %s\n", argv[0],
|
||||
__DATE__, __TIME__);
|
||||
@@ -292,6 +292,18 @@ if (3 != (argc-optind)) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
out_dir = argv[optind+1];
|
||||
|
||||
/*
|
||||
* check for the export directory
|
||||
*/
|
||||
foo = check_if_export_dir_is_valid(out_dir, 0);
|
||||
if ( !foo ) {
|
||||
fprintf(stderr, "** export dir (%s) not valid\n", out_dir);
|
||||
fprintf(stderr, "** may be you have to create it ?\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
foo = parse_filter_chain(0, InFchain);
|
||||
if (foo) {
|
||||
fprintf(stderr, "err %d parsing '%s'\n", foo, InFchain);
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
#include "../floatimg.h"
|
||||
|
||||
#include "utilfuncs.h"
|
||||
#include "crapulator.h"
|
||||
#include "filterstack.h"
|
||||
#include "single.h"
|
||||
@@ -198,6 +199,13 @@ if (repeat < 1) {
|
||||
exit(2);
|
||||
}
|
||||
|
||||
foo = check_if_export_dir_is_valid(outdir, 0);
|
||||
if ( !foo ) {
|
||||
fprintf(stderr, "** export dir (%s) not valid\n", outdir);
|
||||
fprintf(stderr, "** may be you have to create it ?\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
foo = parse_filter_chain(FILTERS, filterchain);
|
||||
if (foo) {
|
||||
fprintf(stderr, "err %d in parse_filter_chain\n", foo);
|
||||
|
||||
41
Fonderie/t.c
41
Fonderie/t.c
@@ -16,6 +16,8 @@
|
||||
#include "crapulator.h"
|
||||
#include "single.h"
|
||||
|
||||
#include "utilfuncs.h"
|
||||
|
||||
/* ----------------------------------------------------------- */
|
||||
|
||||
int verbosity;
|
||||
@@ -28,6 +30,30 @@ int verbosity;
|
||||
|
||||
#define STK 6
|
||||
|
||||
/* ----------------------------------------------------------- */
|
||||
/* new Sat Nov 9 22:17:46 UTC 2024 */
|
||||
int essai_test_export_dir(char *footxt)
|
||||
{
|
||||
int foo;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s ( '%s' )\n", __func__, footxt);
|
||||
#endif
|
||||
|
||||
foo = check_if_export_dir_is_valid("/tmp/quux", 0);
|
||||
fprintf(stderr, " got %d\n\n", foo);
|
||||
|
||||
foo = check_if_export_dir_is_valid("/home", 0);
|
||||
fprintf(stderr, " got %d\n\n", foo);
|
||||
|
||||
foo = check_if_export_dir_is_valid("./", 0);
|
||||
fprintf(stderr, " got %d\n\n", foo);
|
||||
|
||||
foo = check_if_export_dir_is_valid("Makefile", 0);
|
||||
fprintf(stderr, " got %d\n\n", foo);
|
||||
|
||||
return -1;
|
||||
}
|
||||
/* ----------------------------------------------------------- */
|
||||
|
||||
int essai_filterstack(char *fIname, char *fOname)
|
||||
@@ -36,6 +62,11 @@ int foo;
|
||||
FloatImg image;
|
||||
double debut, fin;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s ( '%s' '%s' )\n", __func__, fIname, fOname);
|
||||
#endif
|
||||
|
||||
|
||||
// filterstack_list(STK, __func__);
|
||||
|
||||
foo = fimg_create_from_dump(fIname, &image);
|
||||
@@ -218,15 +249,23 @@ while ((opt = getopt(argc, argv, "hF:g:i:Lo:O:svx")) != -1) {
|
||||
}
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "%s : argc = %d, optind = %d\n", argv[0], argc, optind);
|
||||
fprintf(stderr, ">>> %s : argc=%d, optind=%d\n", argv[0], argc, optind);
|
||||
#endif
|
||||
|
||||
foo = essai_test_export_dir("bla bla");
|
||||
if (foo) {
|
||||
fprintf(stderr, "err %d in essai_test_export_dir\n", foo);
|
||||
exit(1);
|
||||
}
|
||||
exit(0);
|
||||
|
||||
foo = parse_filter_chain(STK, filterchain);
|
||||
if (foo) {
|
||||
fprintf(stderr, "err %d in parse_filter_chain\n", foo);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
if (do_xper) {
|
||||
experiment(infile);
|
||||
return 0;
|
||||
|
||||
53
Fonderie/utilfuncs.c
Normal file
53
Fonderie/utilfuncs.c
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* utilfuncs.c
|
||||
*
|
||||
* new Sat Nov 9 22:15:15 UTC 2024
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "utilfuncs.h"
|
||||
|
||||
extern int verbosity;
|
||||
|
||||
/* -------------------------------------------------------------- */
|
||||
int check_if_export_dir_is_valid(char *path, int action)
|
||||
{
|
||||
int foo;
|
||||
struct stat statbuf;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s ( '%s', %d )\n", __func__, path, action);
|
||||
#endif
|
||||
|
||||
foo = stat(path, &statbuf);
|
||||
if (foo) {
|
||||
if (verbosity) perror(path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, " mode 0x%x\n", statbuf.st_mode);
|
||||
#endif
|
||||
if ((statbuf.st_mode & S_IFMT) != S_IFDIR) {
|
||||
if (verbosity) fprintf(stderr, "%s: Not a directory\n", path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* OK, c'est un repertoire, mais peut-on écrire dedans ? */
|
||||
foo = access(path, W_OK);
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, " access '%s' = %d\n", path, foo);
|
||||
#endif
|
||||
if (0 != foo) {
|
||||
if (verbosity) fprintf(stderr, "%s: can't write\n", path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1; /* export dir is OK */
|
||||
}
|
||||
/* -------------------------------------------------------------- */
|
||||
|
||||
11
Fonderie/utilfuncs.h
Normal file
11
Fonderie/utilfuncs.h
Normal file
@@ -0,0 +1,11 @@
|
||||
/*
|
||||
* utilfuncs.c
|
||||
*
|
||||
* new Sat Nov 9 22:15:49 UTC 2024
|
||||
*/
|
||||
|
||||
/* -------------------------------------------------------------- */
|
||||
|
||||
int check_if_export_dir_is_valid(char *path, int action);
|
||||
|
||||
/* -------------------------------------------------------------- */
|
||||
33
README.md
33
README.md
@@ -7,7 +7,6 @@ voire même des [films flous](Fonderie/).
|
||||
|
||||

|
||||
|
||||
|
||||
Il y a une [description](http://la.buvette.org/photos/cumul/) bien plus
|
||||
pas trop longue pour les curieux, et un début de
|
||||
[documentation](http://la.buvette.org/photos/cumul/the_floatimg_hack.pdf)
|
||||
@@ -22,7 +21,20 @@ Par ailleurs, d'autres expérimentations sont
|
||||
sur le traitement et l'assemblage de ces images floues dans le but de faire
|
||||
des films flous.
|
||||
|
||||
*En avant vers l'infini, et au-delà...*
|
||||
## *Show us the code !*
|
||||
|
||||
Il y a plusieurs répertoires contenant le code source, en voici
|
||||
la liste :
|
||||
|
||||
* [lib](lib/README.md) : le noyau du système, fonctions de base.
|
||||
* [funcs](funcs/README.md) : fonctions de support : export, traitement
|
||||
filtrage, effets...
|
||||
* [tools](tools/README.md) : utilitaires divers, outils de debug et gadgets.
|
||||
* [v4l2](v4l2/README.md): gestion des webcams sous Linux.
|
||||
* [experiment](experiment/README.md) : fonctions en chantier, qui migreront
|
||||
un jour dans d'autres catégories.
|
||||
* [contrib](contrib/README.md) : des choses peu ou pas maintenues.
|
||||
|
||||
|
||||
## Dépendances
|
||||
|
||||
@@ -37,16 +49,15 @@ apt install liblo-dev
|
||||
apt install libv4l2-dev
|
||||
apt install libcfitsio-dev
|
||||
apt install libnetpbm-dev
|
||||
apt install libncurses-dev
|
||||
```
|
||||
|
||||
Bon, OK, je suis en train de changer de machine, et ça serait vraiment
|
||||
cool d'avoir juste une ligne à c'n'p, donc voila :
|
||||
|
||||
```
|
||||
apt install libtiff-dev libpnglite-dev liblo-dev libv4l2-dev \
|
||||
libcfitsio-dev libnetpbm-dev
|
||||
libcfitsio-dev libnetpbm-dev libncurses-dev
|
||||
```
|
||||
|
||||
Il est probable que j'en oublie.
|
||||
Et ya Debian qui change des trucs, alors, ça marche plus, du
|
||||
genre que c'est la deuxième fois que ça m'arrive.
|
||||
@@ -63,9 +74,9 @@ coté de pkg-config.
|
||||
|
||||
Certains outils externes sont aussi utiles :
|
||||
|
||||
- gnuplot
|
||||
- ImageMagick
|
||||
- LaTeX
|
||||
- gnuplot, pour analyser des données,
|
||||
- ImageMagick, parce que Brunus aime ça,
|
||||
- LaTeX, pour la (trop maigre) documentation.
|
||||
|
||||
## Documentation
|
||||
|
||||
@@ -73,4 +84,10 @@ Encore trop légère, mais déja [présente](doc/).
|
||||
C'est à vous de compiler le
|
||||
[PDF](http://la.buvette.org/photos/cumul/the_floatimg_hack.pdf)
|
||||
|
||||
## TODO
|
||||
|
||||
https://berthub.eu/articles/posts/always-do-this-floating-point/
|
||||
|
||||
## Conclusion
|
||||
|
||||
*Your mileage may vary...*
|
||||
|
||||
2
build.sh
2
build.sh
@@ -1,5 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e ; set -u
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
function build
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
\usepackage[verbose]{layout}
|
||||
\usepackage{ulem}
|
||||
|
||||
\setlength \parskip {0.15em}
|
||||
\setcounter{tocdepth}{1} % XXX à regarder un de ces jours ?
|
||||
\setlength \parskip {0.18em}
|
||||
\setcounter{tocdepth}{2} % XXX à regarder un de ces jours ?
|
||||
|
||||
\makeatletter
|
||||
% explication de ce truc ?
|
||||
@@ -54,11 +54,9 @@
|
||||
|
||||
\section*{Une image flottante ?}
|
||||
|
||||
\textsl{Back in a far past part of history.}
|
||||
|
||||
\vspace{2em}
|
||||
\textsl{Mais de quoi parle-t-on exactement ?}
|
||||
|
||||
% XXX XXX XXX\vspace{1em}
|
||||
\vspace{2em}
|
||||
|
||||
Traditionnellement, les valeurs des pixels dans les images
|
||||
informatiques sont mémorisées sur 8 bits, un octet\index{octet},
|
||||
@@ -112,7 +110,8 @@ numériques quand certains ont songé à passer du flou mental à la grille
|
||||
physique.
|
||||
|
||||
Les détails techniques sur cette représentation sont en page
|
||||
\pageref{FloatImg desc}, avec des pointeurs dedans.
|
||||
\pageref{FloatImg desc}, avec des pointeurs et des
|
||||
tableaux dedans.
|
||||
Ah, les pointeurs, la pire chose du monde, mais pourquoi s'en passer\dots
|
||||
|
||||
\subsubsection*{quelques rappels de comment on acquiert et numérise une image}
|
||||
@@ -159,7 +158,8 @@ la glisser dans le capitalisme de surveillance.
|
||||
|
||||
Pour le moment, seule la quête de l'empirisme absolu a été
|
||||
visée. Les justifications mathématiques attendront le retour
|
||||
du schmod777. Ceci dit, rien ne nous empêche d'aller consulter
|
||||
de monsieur Schmod777.
|
||||
Ceci dit, rien ne nous empêche d'aller consulter
|
||||
Wikipedia, afin de mieux connaitre ces nombres flottants
|
||||
que nous allons utiliser~:
|
||||
|
||||
@@ -193,7 +193,8 @@ effectuée afin d'éviter les potentiels inconvénients.
|
||||
|
||||
Ceci dit, le standard \textsl{ieee754}\index{ieee754} nous indique qu'il
|
||||
y a 23 bits pour la mantisse, ce qui nous propose déja
|
||||
plus de huit millions de valeurs. Considérons un cas typique~:
|
||||
plus de huit millions de valeurs possibles.
|
||||
Considérons un cas typique~:
|
||||
le cumul de $N$ images ayant un niveau maximum $Vm$.
|
||||
|
||||
\subsection{Pixel négatif ?}
|
||||
@@ -217,7 +218,7 @@ mais nous sommes tous là pour améliorer les choses, dans
|
||||
la mesure de nos moyens.
|
||||
Nous allons donc directement rentrer au cœur du problème,
|
||||
en écrivant quelques lignes de code montrant le fonctionnement
|
||||
général de la chose.
|
||||
général de la chose vu du coté de la machine.
|
||||
|
||||
\subsection{L'idée}
|
||||
|
||||
@@ -242,8 +243,8 @@ en mémoire centrale, l'initialisation des valeurs de chaque pixel à 0.0
|
||||
(une valeur que certains associent au noir complet, et d'autres à une
|
||||
impossibilité quantique),
|
||||
et pour conclure, l'enregistrement de cette image dans un
|
||||
fichier\footnote{Au format
|
||||
ésotérique, mais très véloce.} binaire.
|
||||
fichier\footnote{Au format ésotérique, mais très véloce.}
|
||||
binaire.
|
||||
|
||||
\begin{lstlisting}
|
||||
memset(fimg, 0, sizeof(FloatImg));
|
||||
@@ -260,7 +261,6 @@ if (foo) {
|
||||
}
|
||||
\end{lstlisting}
|
||||
|
||||
|
||||
Une fois ce code enrobé dans un \texttt{main()}, compilé puis exécuté,
|
||||
nous pouvons entrevoir, grâce au logiciel
|
||||
\texttt{fimgstats} (décrit en page \pageref{fimgstats}),
|
||||
@@ -299,7 +299,8 @@ une distribution Debian\index{Debian} récente (amd64 et x86),
|
||||
mais ça marche quasiment pareil avec Fedora\index{Fedora} 64,
|
||||
et
|
||||
probablement Raspbian\index{Raspbian}, modulo les éventuels
|
||||
soucis de boutisme.
|
||||
soucis de boutisme que j'ai absolument négligés de prendre
|
||||
en compte.
|
||||
\textit{Attention, ça va devenir un peu gore\dots}
|
||||
|
||||
\subsection{Prérequis}
|
||||
@@ -475,17 +476,18 @@ toucher. Les types d'images actuellement gérés sont les trois grands
|
||||
classiques : niveau de gris, rouge-vert-bleu et rgb avec un canal alpha,
|
||||
et expliquées quelques lignes plus haut.
|
||||
|
||||
XXX\index{XXX} raconter fimg\_clone
|
||||
|
||||
Comme vous allez le voir plus loin, il y a plein de fonctions qui
|
||||
prennent en argument deux images: la source et la destination.
|
||||
Dans la plupart des cas, ces deux images doivent être compatibles,
|
||||
c'est à dire même type et mêmes dimensions.
|
||||
c'est à dire de même type et de mêmes dimensions.
|
||||
|
||||
\begin{lstlisting}
|
||||
/* return 0 if pictures are compatible */
|
||||
int fimg_images_not_compatible(FloatImg *a, FloatImg *b);
|
||||
\end{lstlisting}
|
||||
|
||||
|
||||
C'est bien beau d'être enfin une image résidente en mémoire centrale, mais
|
||||
pouvoir aussi exister à long terme en étant stocké dans la matrice
|
||||
est tout aussi pertinent.
|
||||
@@ -532,12 +534,13 @@ intégral\footnote{Un vrai désastre, même...}.
|
||||
|
||||
\subsection{Dessiner}
|
||||
|
||||
Bon, vous avez une image latente, et vous souhaitez dessiner dessus
|
||||
(ou dedans ?) avec vos encres flottantes ?
|
||||
Il y a des fonctions pour ça, par exemple~:
|
||||
Bon, vous avez en mémoire centrale une image latente,
|
||||
et vous souhaitez dessiner dessus (ou dedans ?) avec vos encres flottantes ?
|
||||
Il y a actuellement deux fonctions pour ça, légèrement différentes~:
|
||||
|
||||
\begin{lstlisting}
|
||||
int fimg_plot_rgb(FloatImg *head, int x, int y, float r, float g, float b);
|
||||
int fimg_put_rgb(FloatImg *head, int x, int y, float rgb[3]);
|
||||
\end{lstlisting}
|
||||
|
||||
Les paramètres sont explicites, mais leur validité doit être
|
||||
@@ -676,10 +679,11 @@ aux bonnes dimensions (échange W et H).
|
||||
|
||||
D'un design très empirique, c'est certainement à revoir pour l'avenir.
|
||||
La force du \textsl{legacy} va-t-elle dominer le monde ?
|
||||
Il faudrait normaliser l'endianess et le packing dans les structs%
|
||||
\footnote{Directives du compilateur ?}, et surtout l'ajout
|
||||
Il faudrait normaliser l'endianess et le packing dans les
|
||||
structuress\footnote{Directives du compilateur ?}, et surtout l'ajout
|
||||
de données sur la prise de vue, du genre type de capteur, date et heure,
|
||||
réglages divers\dots
|
||||
réglages divers. Nous appelerons ça les metadonnées, et
|
||||
nous en parlons dans quelques pages.\dots
|
||||
|
||||
\begin{lstlisting}
|
||||
typedef struct {
|
||||
@@ -924,7 +928,8 @@ int fimg_filter_3x3(FloatImg *src, FloatImg *dst, FimgFilter3x3 *filtr)
|
||||
Comme dans la plupart des cas, la gestion des valeurs négatives
|
||||
de pixel est laissé au hasard, qui fait souvent du portnawak.
|
||||
Quoique, il doit bien exister
|
||||
quelques solutions de contournement : clamping ou shift ?
|
||||
quelques solutions de contournement :
|
||||
valeur absolue, clamping ou shiftup ?
|
||||
|
||||
\textsl{To be continued\index{XXX}\dots}
|
||||
|
||||
@@ -937,8 +942,8 @@ le répertoire \texttt{funcs/}.
|
||||
Elle aura donc accès aux \textsl{internals}%
|
||||
\footnote{que je peux décider de changer n'importe quand}
|
||||
de \textsc{FloatImg},
|
||||
une chose qui est en principe interdit aux programmes
|
||||
\textsl{enduser}. Soyez prudents.
|
||||
une chose qui est en principe interdite aux programmes
|
||||
\textsl{enduser}. Soyez donc prudents.
|
||||
|
||||
Cette fonction va faire quelque chose
|
||||
à partir d'une image source et d'une valeur, et écrire le
|
||||
@@ -981,14 +986,17 @@ de fonctions prévues à cet effet, mais il fallait rester simple\dots
|
||||
% ===================================================================
|
||||
\section{Les outils}\label{outils}
|
||||
|
||||
\textsf{3615mavie} : sur des projets comme celui-ci, qui travaillent
|
||||
in-fine sur des objets que l'on peut considérer comme « physiques »,
|
||||
\textsf{3615mavie} : pour des projets comme celui-ci, qui travaillent
|
||||
\textit{in-fine} sur des objets que l'on peut considérer
|
||||
comme « physiques »,
|
||||
il est important de passer à une utilisation
|
||||
normale\footnote{Il y a une vie en dehors de git.} et construire
|
||||
des trucs qui mettent en action le code primitif pour partir
|
||||
sur des bases saines.
|
||||
normale\footnote{Il y a une vie en dehors de git et des compilations.}
|
||||
et construire
|
||||
des briques de base qui mettent en action le code primitif pour
|
||||
partir sur des bases stables, documentées (ahem\dots), et
|
||||
directement utilisables.
|
||||
|
||||
Ces machins ont en commun quelques options bien pratiques~:
|
||||
Ces cliwares\index{cliware} ont en commun quelques options bien pratiques~:
|
||||
\texttt{-h} pour avoir un résumé des options disponibles,
|
||||
\texttt{-v} qui augmente la puissance de bavardage, et
|
||||
\texttt{-K nn.nn} pour un paramètre flottant.
|
||||
@@ -1227,7 +1235,8 @@ après la grande pandémie\dots
|
||||
|
||||
Cet outil accumule\index{cumul} une quantité d'images flottantes
|
||||
(de même taille et de même type) afin d'obtenir
|
||||
un flou temporel de meilleure qualité. Aucune mise à l'échelle n'etant
|
||||
un flou temporel de meilleure qualité.
|
||||
Aucune mise à l'échelle n'etant
|
||||
effectuée, les pixels de sortie peuvent atteindre des valeurs
|
||||
considérables\footnote{Faut-il prévoir une gestion des \textsf{overflows} ?}
|
||||
|
||||
@@ -1615,7 +1624,8 @@ des choses essentielles comme la liste des résolutions disponibles.
|
||||
|
||||
Ajustement \textsl{Brightness Contrast Saturation Hue\dots}
|
||||
|
||||
Probablement pilotable au joystick\index{joystick}.
|
||||
Probablement pilotable au joystick\index{joystick} et surtout
|
||||
par OSC (Open Sound Control).
|
||||
|
||||
% ===================================================================
|
||||
\section{À l'extérieur}
|
||||
@@ -1625,6 +1635,8 @@ il est souvent nécessaire de pouvoir communiquer facilement
|
||||
avec eux. Nous avons déja quelques possibilité d'exportation,
|
||||
mais passer par cette étape intermédiaire est parfois délicat
|
||||
à gérer dans un \textsl{pipedeprod} autrement bien huilé.
|
||||
De même, nos capacités d'importation sont vraiment trop
|
||||
réduites, Jpeg et PNG étant les deux priorités.
|
||||
|
||||
\subsection{ImageMagick}\index{ImageMagick}
|
||||
|
||||
@@ -1700,7 +1712,8 @@ ces images. Mais ce n'est qu'une façon déguisée de faire du cumul.
|
||||
C'est à ce moment que nous changeons l'axe de vue du défi.
|
||||
|
||||
Par ailleurs, il m'a semblé pertinent d'inclure dans le projet une
|
||||
foultitude d'effets spéciaux.
|
||||
foultitude d'effets spéciaux%
|
||||
\footnote{\textsl{aka} IBM\index{IBM} (image brotching module)}.
|
||||
Qui manquent cruellement de possibilités de paramétrage.
|
||||
Mais peuvent être enchainés dans ce que j'appelle des
|
||||
\textsl{filter-chains}~: ces effets seront appliqués dans
|
||||
@@ -1800,8 +1813,9 @@ usage:
|
||||
|
||||
Il n'y a pas de moyenne mobile, pas d'interpolation, mais un facteur de
|
||||
répétition qui permet de dupliquer $N$ fois une image dans le flux de
|
||||
sortie. Si vous globez \texttt{frames/????[02468]}, vous prenez
|
||||
une image sur deux, alors un facteur de répétition à $2$ conservera
|
||||
sortie. Si vous globez \texttt{rush/????[02468]}, vous prenez
|
||||
en compte une image sur deux de la séquence capturée,
|
||||
alors un facteur de répétition à $2$ conservera
|
||||
la 'vitesse' de la séquence, mais avec une petite saccade régulière
|
||||
de bon aloi \textit{:)}
|
||||
|
||||
@@ -1829,12 +1843,18 @@ et sans but précis. Je le \textit{runne} et je le \textit{re-runne}
|
||||
un gazillion de fois dans mon cerveau processique.
|
||||
Quel va être son facteur $O$ ? Je fais donc des essais.
|
||||
|
||||
\subsection{movepixels}
|
||||
|
||||
\subsection{muxplanes}
|
||||
|
||||
% ===================================================================
|
||||
|
||||
\section{Et pour la suite ?}
|
||||
|
||||
En fait, je fait de la photo par la méthode du « cumul »\index{cumul}
|
||||
depuis plusieurs années. Une webcam\index{webcam},
|
||||
depuis plusieurs années, au début avec vgrabbj et convert,
|
||||
puis avec floatimg et ses satellites.
|
||||
Une webcam\index{webcam},
|
||||
un Linux\index{Linux}, et ça \textsl{juste marche}.
|
||||
Sauf que c'est quand même un peu galère à déplacer, il faut
|
||||
avoir un shell pour déclencher, c'est pas facile à utiliser
|
||||
@@ -1843,8 +1863,9 @@ en mode portnawak\dots
|
||||
L'idée est donc de construire un appareil autonome, basé sur un Raspi et
|
||||
une webcam \textsc{usb}\index{USB}, pilotable par \textsc{lirc}\index{LIRC},
|
||||
alimenté par une (grosse) batterie et permettant d'aller
|
||||
faire des images au bord d'un lac ou dans la campagne de l'Ariège.
|
||||
Et, comme le dit la sagesse populaire : « fimg at 11 ».
|
||||
faire des images au bord d'un lac ou dans la campagne du Gers%
|
||||
\footnote{Aux Bourtoulots, par exemple.}.
|
||||
Et comme le dit la sagesse populaire : « fimg at 11 ».
|
||||
|
||||
% -------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# EXPÉRIMENTATIONS ÀLC
|
||||
# Expérimentations ÀLC
|
||||
|
||||
Attention, tout ce qui se trouve dans ce répertoire ne sont que des
|
||||
essais. Certains aboutissent, et sont migrés vers `funcs/` ou
|
||||
essais. Certains aboutissent, et sont migrés vers `lib/`, `funcs/` ou
|
||||
`tools/`, d'autre échouent et restent trainer dans le coin en attente
|
||||
du retour de l'inspiration.
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ for (yd=0; yd<pdst->height; yd++) {
|
||||
fimg_get_rgb(pshift, xd, yd, disp);
|
||||
|
||||
xs = xd + ((disp[0]/dltr*MULT) - OFFS);
|
||||
ys = yd + ((disp[2]/dltb*MULT) - OFFS);
|
||||
ys = yd + ((disp[1]/dltb*MULT) - OFFS);
|
||||
|
||||
if ( xs<0 || xs>psrc->width ||
|
||||
ys<0 || ys>psrc->height ) {
|
||||
|
||||
@@ -14,9 +14,8 @@ int verbosity;
|
||||
/* --------------------------------------------------------------- */
|
||||
|
||||
int triplane_muxer(FloatImg *sr, FloatImg *sg, FloatImg *sb,
|
||||
FloatImg *dst, int flags)
|
||||
FloatImg *dst)
|
||||
{
|
||||
int foo;
|
||||
int sz;
|
||||
|
||||
if (FIMG_TYPE_RGB != dst->type) {
|
||||
@@ -48,6 +47,10 @@ FloatImg imr, img, imb, dest;
|
||||
|
||||
fprintf(stderr, "muxing: %s %s %s -> %s\n", fr, fg, fb, dst);
|
||||
|
||||
if (flags) {
|
||||
fprintf(stderr, "%s: flag non 0 ?\n", __FILE__);
|
||||
}
|
||||
|
||||
foo = fimg_create_from_dump(fr, &imr);
|
||||
if (foo) {
|
||||
fprintf(stderr, "%s: err %d loading %s\n", __func__, foo, fr);
|
||||
@@ -66,7 +69,7 @@ if (foo) {
|
||||
|
||||
fimg_clone(&imr, &dest, 0);
|
||||
|
||||
foo = triplane_muxer(&imr, &img, &imb, &dest, 0);
|
||||
foo = triplane_muxer(&imr, &img, &imb, &dest);
|
||||
if (foo) {
|
||||
fprintf(stderr, "%s: err %d\n", __func__, foo);
|
||||
return foo;
|
||||
|
||||
10
floatimg.h
10
floatimg.h
@@ -20,7 +20,7 @@
|
||||
* https://git.tetalab.org/tTh/FloatImg
|
||||
*/
|
||||
|
||||
#define FIMG_VERSION (237)
|
||||
#define FIMG_VERSION (245)
|
||||
#define RELEASE_NAME ("noname")
|
||||
#define PATCH_LEVEL ("aaaa")
|
||||
|
||||
@@ -72,7 +72,7 @@ typedef struct {
|
||||
* fimg file header (short version)
|
||||
*/
|
||||
typedef struct {
|
||||
char magic[8]; // this is not an asciiz !
|
||||
char magic[8]; /* this is not an asciiz ! */
|
||||
int32_t w, h, t;
|
||||
/*
|
||||
* what about the packing ?
|
||||
@@ -192,7 +192,6 @@ int fimg_split_level(FloatImg *src, FloatImg *dst, int notused);
|
||||
int fimg_make_triptyq(FloatImg *src, FloatImg *dst, int notused);
|
||||
|
||||
/* funcs/rotate.c module */
|
||||
/* #coronamaison */
|
||||
int fimg_rotate_90(FloatImg *src, FloatImg *dst, int notused);
|
||||
|
||||
int fimg_killrgb_v(FloatImg *src, FloatImg *dst, int k);
|
||||
@@ -261,7 +260,6 @@ int fimg_halfsize_1(FloatImg *src, FloatImg *dst, int notused);
|
||||
int fimg_extractor(FloatImg *in, FloatImg *out, FimgArea51 *rect);
|
||||
int fimg_mirror(FloatImg *src, FloatImg *dst, int notused);
|
||||
|
||||
|
||||
int fimg_incrustator_0(FloatImg *psrc, FloatImg *pdst,
|
||||
int xpos, int ypos, int flags);
|
||||
|
||||
@@ -285,6 +283,9 @@ int fimg_show_metadata(FimgMetaData *pmd, char *title, int notused);
|
||||
int fimg_default_metadata(FimgMetaData *pmd, int bla);
|
||||
int fimg_get_metadata_from_file(char *fname, FimgMetaData *pmd);
|
||||
|
||||
/*
|
||||
* FITS, an image fileformat for astronomy
|
||||
*/
|
||||
int fimg_save_R_as_fits(FloatImg *src, char *outname, int flags);
|
||||
int fimg_save_G_as_fits(FloatImg *src, char *outname, int flags);
|
||||
int fimg_save_B_as_fits(FloatImg *src, char *outname, int flags);
|
||||
@@ -293,7 +294,6 @@ int fimg_save_plane_as_fits(FloatImg *src, char *oname, char plane, int flags);
|
||||
int fimg_write_as_tiff(FloatImg *src, char *fname, int flags);
|
||||
int fimg_save_as_exr(FloatImg *src, char *outname, int flags);
|
||||
|
||||
|
||||
/* mathematics operations */
|
||||
float fimg_get_plane_maxvalue(FloatImg *psrc, char plane);
|
||||
float fimg_get_maxvalue(FloatImg *head);
|
||||
|
||||
@@ -19,6 +19,8 @@ OBJS = fimg-png.o fimg-tiff.o misc-plots.o filtrage.o utils.o \
|
||||
|
||||
#---------------------------------------------------------------
|
||||
|
||||
all: t
|
||||
|
||||
tests.o: tests.c tests.h $(DEPS)
|
||||
gcc $(COPT) -I/usr/include/netpbm -c $<
|
||||
|
||||
|
||||
@@ -21,9 +21,10 @@ Et en particulier, elle brotche sur ceux produits par ImageMagick !
|
||||
|
||||
### FITS
|
||||
|
||||
Ce format de fichier est utilisé en astronomie.
|
||||
Ce [format de fichier](https://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/c_user/node1.html)
|
||||
est utilisé en astronomie.
|
||||
Son support est actuellement minimaliste.
|
||||
|
||||
https://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/c_user/node1.html
|
||||
|
||||
### DICOM
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ if (fits_create_file(&fptr, outname, &status)) {
|
||||
}
|
||||
|
||||
naxes[0] = src->width; naxes[1] = src->height;
|
||||
if (verbosity) fimg_describe(src, "to be saved as FITS");
|
||||
if (verbosity > 1) fimg_describe(src, "to be saved as FITS");
|
||||
|
||||
if ( fits_create_img(fptr, bitpix, naxis, naxes, &status) ) {
|
||||
fits_report_error(stderr, status);
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#!/bin/bash -v
|
||||
|
||||
set -e ; set -u
|
||||
|
||||
cp libfloatimg.a /usr/local/lib
|
||||
cp floatimg.h /usr/local/include
|
||||
|
||||
|
||||
@@ -21,5 +21,6 @@ typedef struct {
|
||||
int reserved;
|
||||
} FloatImg;
|
||||
```
|
||||
|
||||
For the current state of this struc, look at the main
|
||||
[header file](../floatimg.h), located at the root of the project.
|
||||
|
||||
|
||||
@@ -32,21 +32,23 @@ if (foo) {
|
||||
|
||||
fimg_destroy(&fimg);
|
||||
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
static void help(int k)
|
||||
{
|
||||
puts("export to FITS format");
|
||||
puts("\t-p select colorplane : R, G, B");
|
||||
puts("\t default is blue");
|
||||
puts("\t-v increase verbosity");
|
||||
fimg_print_version(k);
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int opt;
|
||||
int plane = '?';
|
||||
int opt, foo;
|
||||
int plane = 'b';
|
||||
|
||||
while ((opt = getopt(argc, argv, "p:hv")) != -1) {
|
||||
switch(opt) {
|
||||
@@ -62,8 +64,11 @@ if (2 != argc-optind) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
export_fimg_plane_as_fits(argv[optind], argv[optind+1], plane);
|
||||
|
||||
foo = export_fimg_plane_as_fits(argv[optind], argv[optind+1], plane);
|
||||
if (foo) {
|
||||
fprintf(stderr, "export_fimg_plane_as_fits --> %d\n", foo);
|
||||
exit(1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/* ----------------------------------------------------------------- */
|
||||
|
||||
@@ -92,6 +92,7 @@ if (2 != argc-optind) {
|
||||
foo = convertir_fimg_en_PNG(argv[optind], argv[optind+1], to_gray);
|
||||
if (foo) {
|
||||
fprintf(stderr, "%s : got a %d from convertor\n", argv[0], foo);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -6,12 +6,14 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../floatimg.h"
|
||||
|
||||
int verbosity; // nasty global var.
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
/* nouveau - Mon Apr 8 11:52:18 UTC 2024 */
|
||||
int copy_metadata(FloatImg *src, FloatImg *dst)
|
||||
{
|
||||
FimgMetaData *mdsrc, *mddst;
|
||||
@@ -21,7 +23,10 @@ fprintf(stderr, ">>> %s ( %p %p )\n", __func__, src, dst);
|
||||
#endif
|
||||
|
||||
mdsrc = &(src->mdatas); mddst = &(dst->mdatas);
|
||||
fprintf(stderr, "metadata copy: %p --> %p\n", mdsrc, mddst);
|
||||
if (verbosity) fprintf(stderr, "%s: %p --> %p\n", __func__, mdsrc, mddst);
|
||||
|
||||
mdsrc->reserved[1] = 0x55555555;
|
||||
memcpy(mddst, mdsrc, sizeof(FimgMetaData));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -62,11 +67,12 @@ if (foo) {
|
||||
#endif
|
||||
return foo;
|
||||
}
|
||||
|
||||
/* XXX
|
||||
* may be we can also copy the metadate from src to dst ?
|
||||
* with an option on the command line ?
|
||||
*/
|
||||
copy_metadata(&src, &dst);
|
||||
foo = copy_metadata(&src, &dst);
|
||||
|
||||
foo = fimg_dumpmd_to_file(&dst, dstname, NULL, 0);
|
||||
if (foo) {
|
||||
@@ -105,6 +111,7 @@ char *output_file = "out.fimg";
|
||||
while ((opt = getopt(argc, argv, "ho:vx")) != -1) {
|
||||
switch(opt) {
|
||||
case 'h': help(); break;
|
||||
case 'm': break;
|
||||
case 'o': output_file = optarg; break;
|
||||
case 'v': verbosity++; break;
|
||||
case 'x': experiment++; break;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
int verbosity;
|
||||
|
||||
enum comId { C_timestamp, C_daytime, C_count, C_fval, C_cpid, C_origin,
|
||||
C_idcam, C_reserved, C_all };
|
||||
C_idcam, C_reserved, C_all, C_dayhour };
|
||||
|
||||
typedef struct {
|
||||
char *name;
|
||||
@@ -26,6 +26,7 @@ typedef struct {
|
||||
Cmd Cmd_list[] = {
|
||||
{ "timestamp", C_timestamp },
|
||||
{ "daytime", C_daytime },
|
||||
{ "dayhour", C_dayhour },
|
||||
{ "cpid", C_cpid },
|
||||
{ "count", C_count },
|
||||
{ "fval", C_fval },
|
||||
@@ -86,6 +87,7 @@ int get_print_metadata(char *fname, char *command)
|
||||
{
|
||||
int foo, action;
|
||||
FimgMetaData metadata;
|
||||
time_t tstamp;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s ( '%s' '%s' )\n", __func__, fname, command);
|
||||
@@ -98,11 +100,15 @@ if (foo) return foo;
|
||||
action = lookup_cmd(command);
|
||||
// fprintf(stderr, " command '%s' -> %d\n", command, action);
|
||||
|
||||
tstamp = metadata.timestamp.tv_sec;
|
||||
|
||||
switch(action) {
|
||||
case C_timestamp:
|
||||
printf("timestamp %ld\n", metadata.timestamp.tv_sec); break;
|
||||
printf("timestamp %ld\n", tstamp); break;
|
||||
case C_daytime:
|
||||
printf("%s\n", ctime(&metadata.timestamp.tv_sec)); break;
|
||||
printf("%s\n", ctime(&tstamp)); break;
|
||||
case C_dayhour:
|
||||
printf("%s\n", ctime(&tstamp)); break;
|
||||
case C_count:
|
||||
printf("count %d\n", metadata.count); break;
|
||||
case C_fval:
|
||||
|
||||
Reference in New Issue
Block a user