From a5fac7effd54613fb8edb38db63663e0716a20a3 Mon Sep 17 00:00:00 2001 From: tth Date: Sat, 9 Apr 2022 23:18:14 +0200 Subject: [PATCH] one more step on the metadata road --- .gitignore | 1 + floatimg.h | 9 ++++- lib/README.md | 4 +++ lib/fimg-core.c | 1 + lib/fimg-file.c | 79 ++++++++++++++++++++++++++++++++++++++++++-- lib/metadata.c | 64 +++++++++++++++++++++++++---------- lib/t.c | 11 ++++-- tools/Makefile | 4 +++ tools/README.md | 15 ++++++++- tools/fimgmetadata.c | 69 ++++++++++++++++++++++++++++++++++++++ tools/mkfimg.c | 30 ++++++++++++----- 11 files changed, 254 insertions(+), 33 deletions(-) create mode 100644 tools/fimgmetadata.c diff --git a/.gitignore b/.gitignore index 60f208e5..63836255 100644 --- a/.gitignore +++ b/.gitignore @@ -68,6 +68,7 @@ tools/addpnm2fimg tools/cumulfimgs tools/fimgops tools/fimgfx +tools/fimgmetadata tools/*.png tools/*.tiff diff --git a/floatimg.h b/floatimg.h index 9967f1e1..e8227204 100644 --- a/floatimg.h +++ b/floatimg.h @@ -4,7 +4,7 @@ * http://la.buvette.org/photos/cumul */ -#define FIMG_VERSION 177 +#define FIMG_VERSION 179 /* * in memory descriptor @@ -34,10 +34,13 @@ typedef struct { typedef struct { char magic[8]; struct timeval timestamp; + uint64_t pid; // WTF ? int32_t count; float fval; char idcam[32]; int32_t origin; // enum ? + uint32_t reserved[8]; + } FimgMetaData; /* * we MUST look at packing and endianess problems NOW */ @@ -221,11 +224,15 @@ int fimg_vdeg_a(FloatImg *img, double dcoef); /* FIMG native file module */ int fimg_fileinfos(char *fname, int *datas); int fimg_dump_to_file(FloatImg *head, char *fname, int notused); +int fimg_dumpmd_to_file(FloatImg *fi, char *nm, FimgMetaData *pmd, int nu); + int fimg_load_from_dump(char *fname, FloatImg *where); int fimg_create_from_dump(char *fname, FloatImg *head); + /* FIMG metadata module */ int fimg_show_metadata(FimgMetaData *pmd, char *title, int notused); int fimg_default_metadata(FimgMetaData *pmd); +int fimg_get_metadata_from_file(char *fname, FimgMetaData *pmd); int fimg_save_R_as_fits(FloatImg *src, char *outname, int flags); int fimg_save_G_as_fits(FloatImg *src, char *outname, int flags); diff --git a/lib/README.md b/lib/README.md index e69de29b..ee05c620 100644 --- a/lib/README.md +++ b/lib/README.md @@ -0,0 +1,4 @@ +# Fimg tools + +Need more explanations... + diff --git a/lib/fimg-core.c b/lib/fimg-core.c index f865d046..c8fcea43 100644 --- a/lib/fimg-core.c +++ b/lib/fimg-core.c @@ -55,6 +55,7 @@ void fimg_print_sizeof(void) { fprintf(stderr, " sz FloatImg = %lu\n", sizeof(FloatImg)); fprintf(stderr, " sz filehead = %lu\n", sizeof(FimgFileHead)); +fprintf(stderr, " sz metadata = %lu\n", sizeof(FimgMetaData)); fprintf(stderr, " sz filter = %lu\n", sizeof(FimgFilter3x3)); } /* --------------------------------------------------------------------- */ diff --git a/lib/fimg-file.c b/lib/fimg-file.c index b6ab5866..caad379a 100644 --- a/lib/fimg-file.c +++ b/lib/fimg-file.c @@ -59,7 +59,82 @@ return 0; } /* ---------------------------------------------------------------- */ /* - * /!\ thi func work ONLY on RGB image + * new avril 2022 : trying to save metadatas... + */ +int fimg_dumpmd_to_file(FloatImg *fimg, char *fname, \ + FimgMetaData *pmd, int notused) +{ +FILE *fp; +int foo, nbre; +FimgFileHead filehead; + +#if 1 // DEBUG_LEVEL +fprintf(stderr, ">>> %s ( %p '%s' %p %d )\n", __func__, fimg, + fname, pmd, notused); +#endif + +if (FIMG_TYPE_RGB != fimg->type) { + fprintf(stderr, "%s : bad type %d\n", __func__, fimg->type); + return -8; + } + +fp = fopen(fname, "w"); +if (NULL==fp) { + perror(fname); + return -1; + } + +memset(&filehead, 0, sizeof(filehead)); +memcpy(filehead.magic, "FIMG", 4); +filehead.w = fimg->width; filehead.h = fimg->height; +filehead.t = fimg->type; + +/* XXX metadata */ +if (NULL != pmd) { + + filehead.magic[4] = 'a'; + } + +foo = fwrite(&filehead, sizeof(FimgFileHead), 1, fp); +if (1 != foo) { + perror(fname); + fclose(fp); + /* may be here, we can remove the broken file ? */ + return -2; + } + +/* XXX metadata */ +if (NULL != pmd) { + foo = fwrite(pmd, sizeof(FimgMetaData), 1, fp); + if (1 != foo) { + perror(fname); + fclose(fp); + /* may be here, we can remove the broken file ? */ + return -2; + } + } + +nbre = fimg->width * fimg->height; /* pixels per frame */ +foo = fwrite(fimg->R, sizeof(float), nbre, fp); +if (nbre != foo) { + perror(fname); fclose(fp); return -3; + } +foo = fwrite(fimg->G, sizeof(float), nbre, fp); +if (nbre != foo) { + perror(fname); fclose(fp); return -3; + } +foo = fwrite(fimg->B, sizeof(float), nbre, fp); +if (nbre != foo) { + perror(fname); fclose(fp); return -3; + } + +fclose(fp); + +return 0; +} +/* ---------------------------------------------------------------- */ +/* + * /!\ this func work ONLY on RGB image */ int fimg_dump_to_file(FloatImg *fimg, char *fname, int notused) { @@ -72,7 +147,7 @@ fprintf(stderr, ">>> %-25s ( %p '%s' %d )\n", __func__, fimg, fname, notused); #endif -if (3 != fimg->type) { +if (FIMG_TYPE_RGB != fimg->type) { fprintf(stderr, "%s : bad type %d\n", __func__, fimg->type); return -8; } diff --git a/lib/metadata.c b/lib/metadata.c index af0f8769..03b47ad7 100644 --- a/lib/metadata.c +++ b/lib/metadata.c @@ -12,34 +12,62 @@ extern int verbosity; /* must be declared around main() */ +/* ---------------------------------------------------------------- */ +static void puts_magic_8(char *ptr, FILE *fp) +{ +int foo; + +fputs("magic = ", fp); +fputc('[', fp); +for (foo=0; foo<8; foo++) { + fputc(ptr[foo], fp); + } +fputc(']', fp); fputc('\n', fp); +fflush(fp); +} /* ---------------------------------------------------------------- */ int fimg_show_metadata(FimgMetaData *pmd, char *title, int notused) { +int foo; fprintf(stderr, ">>> %s ( %p '%s' 0x%08x )\n", __func__, pmd, title, notused); -fprintf(stderr, "sizeof metadata = %ld\n", sizeof(FimgMetaData)); -fprintf(stderr, "magic = '%8s'\n", pmd->magic); -/* TIMESTAMP HERE */ -fprintf(stderr, "counter = %d\n", pmd->count); -fprintf(stderr, "float value = %.3f\n", pmd->fval); -fprintf(stderr, "id camera = '%s'\n", pmd->idcam); -fprintf(stderr, "origin = %d\n", pmd->origin); +if (verbosity) { + fprintf(stderr, "sizeof(metadata) = %ld\n", \ + sizeof(FimgMetaData)); + puts_magic_8(pmd->magic, stderr); + } -return -1; +/* SHOW TIMESTAMP HERE */ +fprintf(stderr, "creator pid = %ld\n", pmd->pid); +fprintf(stderr, "counter = %d\n", pmd->count); +fprintf(stderr, "float value = %.3f\n", pmd->fval); +fprintf(stderr, "id camera = '%s'\n", pmd->idcam); +fprintf(stderr, "origin = 0x%x\n", pmd->origin); + +fputs("reserved words are:\n ", stderr); +for (foo=0; foo<8; foo++) { + fprintf(stderr, " 0x%08x", pmd->reserved[foo]); + if (3 == foo) fputs("\n ", stderr); + } +fputc('\n', stderr); +return 0; } /* ---------------------------------------------------------------- */ int fimg_default_metadata(FimgMetaData *pmd) { +memset(pmd, 0, sizeof(FimgMetaData)); memcpy(pmd->magic, "metadata", 8); +/* set timestamp here ? */ +pmd->pid = getpid(); pmd->count = 0; pmd->fval = 255.0; strcpy(pmd->idcam, ""); -pmd->origin = 999; +pmd->origin = 0x55555555; -return -1; +return 0; } /* ---------------------------------------------------------------- */ int fimg_get_metadata_from_file(char *fname, FimgMetaData *pmd) @@ -49,17 +77,18 @@ FimgFileHead filehead; FimgMetaData metadata; int foo; -#if DEBUG_LEVEL -fprintf(stderr, ">>> %s ( %s %p )\n", __func__, fname, pmd); -#endif +// #if DEBUG_LEVEL +fprintf(stderr, ">>> %s ( '%s' %p )\n", __func__, fname, pmd); +// #endif if (NULL==(fp=fopen(fname, "r"))) { + perror(fname); return -1; } foo = fread(&filehead, sizeof(FimgFileHead), 1, fp); -if (sizeof(FimgFileHead) != foo) { - fprintf(stderr, "short read on %s (head)\n", fname); +if (1 != foo) { + fprintf(stderr, "short read (%d) on %s (head)\n", foo, fname); fclose(fp); return -2; } @@ -71,13 +100,13 @@ if (memcmp(filehead.magic, "FIMG", 4)) { } if ('a' != filehead.magic[4]) { - fprintf(stderr, "'%s' have no metadata.\n", fname); + fprintf(stderr, "file '%s' have no metadata.\n", fname); fclose(fp); return -4; } foo = fread(&metadata, sizeof(FimgMetaData), 1, fp); -if (sizeof(FimgMetaData) != foo) { +if (1 != foo) { fprintf(stderr, "short read on %s (metadata)\n", fname); fclose(fp); return -5; @@ -87,7 +116,6 @@ fclose(fp); /* got all needed datas */ if (memcmp(metadata.magic, "metadata", 8)) { fprintf(stderr, "'%s' invalid metadata.\n", fname); - fclose(fp); return -6; } diff --git a/lib/t.c b/lib/t.c index 70db7177..ed321e2d 100644 --- a/lib/t.c +++ b/lib/t.c @@ -24,7 +24,12 @@ fprintf(stderr, "-------- %s ( %s ) --------\n", __func__, fname); foo = fimg_default_metadata(&Md); -foo = fimg_show_metadata(&Md, "from t.c", 0); +// foo = fimg_show_metadata(&Md, "default from t.c", 0); + +foo = fimg_get_metadata_from_file(fname, &Md); +fprintf(stderr, "%s : get metadata -> %d\n", fname, foo); + +foo = fimg_show_metadata(&Md, fname, 0); return -1; } @@ -85,7 +90,7 @@ int essai_interpolate(int k) FloatImg A, B, C; int foo, idx; char ligne[200]; -float fval, minmax[6]; +float fval; foo = fimg_create(&A, WI, HI, FIMG_TYPE_RGB); if (foo) { @@ -314,7 +319,7 @@ if (verbosity) { fimg_print_sizeof(); } -foo = essai_metadata("foo.fimg"); +foo = essai_metadata("quux.fimg"); fprintf(stderr, "retour essai -> %d\n", foo); // foo = essai_save_plane(0); diff --git a/tools/Makefile b/tools/Makefile index b16889fb..126b8759 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -13,8 +13,12 @@ DEPS = ../floatimg.h ../libfloatimg.a Makefile all: fimg2pnm mkfimg png2fimg fimgstats fimg2png \ fimg2tiff fimg2text fimg2fits \ addpnm2fimg cumulfimgs fimgops fimgfx \ + fimgmetadata \ fimghalfsize +fimgmetadata: fimgmetadata.c $(DEPS) + gcc $(COPT) $< ../libfloatimg.a -lm -o $@ + fimgstats: fimgstats.c $(DEPS) gcc $(COPT) $< ../libfloatimg.a -lm -o $@ diff --git a/tools/README.md b/tools/README.md index 8743b182..a32cca7b 100644 --- a/tools/README.md +++ b/tools/README.md @@ -10,7 +10,17 @@ Génération d'une image flottante avec des choses dedans. Un [../scripts/demo-mkfimg.sh](script) permet de créer toutes les images disponibles. +L'option `-m` rajoute des méta-données, cette option +**ne** doit **pas** encore être utilisée dans la vrai vie. + ## fimgops +``` +usage: + fimgops [options] A.fimg B.fimg operator D.fimg +options: + -k N.N set float value (def=0.500) + -v increase verbosity +``` ## fimgfx @@ -22,7 +32,7 @@ effects: Compute some useless numbers... -## fimg2pnm - fimg2png - fimg2tiff +## fimg2pnm - fimg2png - fimg2tiff - fimg2fips Exportation d'image flottante vers divers formats. Certains d'entre eux ne sont gérés que de façon très rudimentaire. @@ -32,3 +42,6 @@ ne sont gérés que de façon très rudimentaire. Nouveau de l'année 2020+1 : exfiltrer toutes des données d'une image flottante afin de les rendre machinables. +## fimgmetadata + +Nouveau avril 2022. Need more doc... diff --git a/tools/fimgmetadata.c b/tools/fimgmetadata.c new file mode 100644 index 00000000..859d7cc1 --- /dev/null +++ b/tools/fimgmetadata.c @@ -0,0 +1,69 @@ +/* + * FIMG METADATA TOOL + */ + +#include +#include +#include +#include +#include +#include + +#include "../floatimg.h" + +int verbosity; + +/* --------------------------------------------------------------------- */ +int get_print_metadata(char *fname, char *command) +{ +int foo; +FimgMetaData metadata; + +// #if DEBUG_LEVEL +fprintf(stderr, ">>> %s ( '%s' %s )\n", __func__, fname, command); +// #endif + +foo = fimg_get_metadata_from_file(fname, &metadata); +if (foo) return foo; + +/* switch on command here, please */ + +fimg_show_metadata(&metadata, fname, 0); + +return 0; +} +/* --------------------------------------------------------------------- */ +void help(void) +{ +fprintf(stderr, "*** fimgmetadata (%s, %s)\n", __DATE__, __TIME__); +fimg_print_version(1); +exit(0); +} +/* --------------------------------------------------------------------- */ + +int main(int argc, char *argv[]) +{ +int foo, opt, nbargs; +char *fname; + +while ((opt = getopt(argc, argv, "hv")) != -1) { + switch(opt) { + case 'h': help(); break; + case 'v': verbosity++; break; + } + } + +nbargs = argc - optind; +// fprintf(stderr, "nbargs = %d\n", nbargs); +if (2 != nbargs) { + fprintf(stderr, "%s need two args: command & filename\n", argv[0]); + exit(1); + } + +foo = get_print_metadata(argv[optind], argv[optind+1]); +if (foo) fprintf(stderr, "got a %d from job\n", foo); + +return 0; +} +/* --------------------------------------------------------------------- */ + diff --git a/tools/mkfimg.c b/tools/mkfimg.c index 5bf855bb..b3f11aba 100644 --- a/tools/mkfimg.c +++ b/tools/mkfimg.c @@ -68,7 +68,7 @@ for (type = types; type->code; type++) { exit(0); } /* --------------------------------------------------------------------- */ -static void help(int lj) +static void help(void) { int foo, cc; @@ -76,11 +76,11 @@ puts("Usage:\tmkfimg [options] quux.fimg width height"); puts("\t-k N.N\tgive a float parameter"); puts("\t-L\tlist howto make a pic"); -fputs("\t-t bla\thowto make the pic :\n\t\t| ", stdout); +fputs("\t-t bla\thowto make the pic :\n\t\t | ", stdout); for (foo=cc=0; types[foo].code; foo++) { cc += printf("%s ", types[foo].name); - if (cc>42) { cc=0; printf("\n\t\t| "); } + if (cc>35) { cc=0; printf("\n\t\t | "); } } puts("\n\t-v\tincrease verbosity"); @@ -100,14 +100,17 @@ int width, height; char *fname; float fvalue = 1.0; int type = T_BLACK; +int wrmdata = 0; char *tname = "wtf?"; FloatImg fimg; +FimgMetaData metadata; -while ((opt = getopt(argc, argv, "hk:Lt:v")) != -1) { +while ((opt = getopt(argc, argv, "hk:Lmt:v")) != -1) { switch(opt) { - case 'h': help(0); break; + case 'h': help(); break; case 'k': fvalue = atof(optarg); break; + case 'm': wrmdata = 1; break; case 't': type = get_type_by_name(tname=optarg); break; case 'L': list_types(); break; @@ -147,8 +150,8 @@ switch (nbargs) { fname = argv[optind]; -if (verbosity>1) fprintf(stderr, "*** mkfimg *** %s %s\n", - __DATE__, __TIME__); +if (verbosity>1) fprintf(stderr, "*** mkfimg *** %s %s *** pid %ld\n", + __DATE__, __TIME__, (long)getpid()); if (verbosity) fprintf(stderr, "making '%s' %dx%d, type %d\n", fname, width, height, type); @@ -174,7 +177,18 @@ switch(type) { case -1: exit(1); } -foo = fimg_dump_to_file(&fimg, fname, 0); +if (wrmdata) { + fprintf(stderr, "%s: warning, metadata is bogus\n", argv[0]); + (void)fimg_default_metadata(&metadata); + sprintf(metadata.idcam, "mkfimg (libv %d)", FIMG_VERSION); + foo = fimg_dumpmd_to_file(&fimg, fname, &metadata, 0); +#if DEBUG_LEVEL + fprintf(stderr, "save w. metadata -> %d\n", foo); +#endif + } +else { + foo = fimg_dump_to_file(&fimg, fname, 0); + } if (foo) { fprintf(stderr, "dump fimg to %s -> %d\n", fname, foo); exit(1);