FloatImg/lib/fimg-file.c

304 lines
6.5 KiB
C
Raw Normal View History

2019-03-04 02:22:55 +11:00
/*
* fimg-file.c
*
*
*/
#include <stdio.h>
#include <stdlib.h>
2021-05-20 18:31:28 +11:00
#include <stdint.h>
2019-03-04 02:22:55 +11:00
#include <unistd.h>
2019-07-08 15:28:04 +11:00
#include <string.h>
2019-12-19 00:39:47 +11:00
#include <errno.h>
2019-03-04 02:22:55 +11:00
#include "../floatimg.h"
extern int verbosity; /* must be declared around main() */
/* ---------------------------------------------------------------- */
int fimg_fileinfos(char *fname, int *datas)
{
2019-07-08 15:28:04 +11:00
FILE *fp;
FimgFileHead filehead;
2019-03-04 02:22:55 +11:00
#if DEBUG_LEVEL
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, fname, datas);
#endif
fp = fopen(fname, "r");
if (NULL==fp) {
perror(fname);
return -1;
}
2019-07-08 15:28:04 +11:00
if (1 != fread(&filehead, sizeof(FimgFileHead), 1, fp)) {
fprintf(stderr, "%s: %s bad read\n", __func__, fname);
2019-03-04 02:22:55 +11:00
fclose(fp);
return -2;
}
fclose(fp);
2019-07-08 15:28:04 +11:00
#if DEBUG_LEVEL
fprintf(stderr, " magic [%s]\n", filehead.magic);
#endif
2021-03-18 04:32:51 +11:00
if (memcmp(filehead.magic, "FIMG", 4)) {
2019-07-08 15:28:04 +11:00
fprintf(stderr, "'%s' is not a fimg file.\n", fname);
return -3;
}
/* XXX preparer la gestion des metadata */
if ('a' == filehead.magic[4]) {
fprintf(stderr,"****** %s have metadata\n", fname);
}
2019-07-08 15:28:04 +11:00
datas[0] = filehead.w;
datas[1] = filehead.h;
datas[2] = filehead.t;
2019-03-04 02:22:55 +11:00
return 0;
}
/* ---------------------------------------------------------------- */
/*
2022-04-10 08:18:14 +11:00
* 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
*/
2019-07-08 15:28:04 +11:00
int fimg_dump_to_file(FloatImg *fimg, char *fname, int notused)
2019-03-04 02:22:55 +11:00
{
2019-07-08 15:28:04 +11:00
FILE *fp;
int foo, nbre;
FimgFileHead filehead;
2019-03-04 02:22:55 +11:00
#if DEBUG_LEVEL
2019-07-08 15:28:04 +11:00
fprintf(stderr, ">>> %-25s ( %p '%s' %d )\n", __func__, fimg,
2019-03-04 02:22:55 +11:00
fname, notused);
#endif
2022-04-10 08:18:14 +11:00
if (FIMG_TYPE_RGB != fimg->type) {
2019-08-09 02:16:20 +11:00
fprintf(stderr, "%s : bad type %d\n", __func__, fimg->type);
2019-03-04 02:22:55 +11:00
return -8;
}
fp = fopen(fname, "w");
if (NULL==fp) {
perror(fname);
return -1;
}
2019-08-02 10:50:12 +11:00
memset(&filehead, 0, sizeof(filehead));
memcpy(filehead.magic, "FIMG", 4);
2019-07-08 15:28:04 +11:00
filehead.w = fimg->width; filehead.h = fimg->height;
filehead.t = fimg->type;
2019-03-04 02:22:55 +11:00
2019-07-08 15:28:04 +11:00
foo = fwrite(&filehead, sizeof(FimgFileHead), 1, fp);
if (1 != foo) {
2019-03-04 02:22:55 +11:00
perror(fname);
fclose(fp);
return -2;
}
nbre = fimg->width * fimg->height; /* pixels per frame */
2019-03-04 02:22:55 +11:00
2019-07-08 15:28:04 +11:00
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;
2019-03-04 02:22:55 +11:00
}
fclose(fp);
2019-12-19 00:39:47 +11:00
return 0;
}
/* ---------------------------------------------------------------- */
2019-12-22 00:42:55 +11:00
/*
* load a dump in a pre-allocated FloatImg
*/
2019-12-19 00:39:47 +11:00
int fimg_load_from_dump(char *fname, FloatImg *where)
{
FILE *fp;
int foo, nbre;
FimgFileHead filehead;
#if DEBUG_LEVEL
2020-02-17 09:50:44 +11:00
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, fname, where);
2019-12-19 00:39:47 +11:00
#endif
if (NULL==(fp = fopen(fname, "r"))) {
2019-12-22 00:42:55 +11:00
perror(fname);
return -15;
2019-12-19 00:39:47 +11:00
}
foo = fread(&filehead, sizeof(FimgFileHead), 1, fp);
if (1 != foo) {
2019-12-21 22:35:52 +11:00
fprintf(stderr, "%s: short read on '%s'\n", __func__, fname);
2019-12-19 00:39:47 +11:00
fclose(fp);
2019-12-22 00:42:55 +11:00
return -16;
2019-12-19 00:39:47 +11:00
}
/* check compatibility */
if ( (filehead.w != where->width) ||
(filehead.h != where->height) ||
(filehead.t != where->type) ) {
fprintf(stderr, "%s: file '%s' incompatible\n",
__func__, fname);
fclose(fp);
return -17;
}
2019-12-19 00:39:47 +11:00
/* XXX preparer la gestion des metadata */
if ('a' == filehead.magic[4]) {
fprintf(stderr,"****** %s have metadata\n", fname);
}
nbre = filehead.w * filehead.h; /* number of pixels per frame */
2019-12-19 00:39:47 +11:00
foo = fread(where->R, sizeof(float), nbre, fp);
if (nbre != foo) {
2019-12-22 00:42:55 +11:00
fprintf(stderr, "%s: err read '%s' : %d\n", __func__, fname, foo);
fclose(fp); return -18;
}
foo = fread(where->G, sizeof(float), nbre, fp);
if (nbre != foo) {
fprintf(stderr, "%s: err read '%s' : %d\n", __func__, fname, foo);
fclose(fp); return -18;
}
foo = fread(where->B, sizeof(float), nbre, fp);
if (nbre != foo) {
fprintf(stderr, "%s: err read '%s' : %d\n", __func__, fname, foo);
fclose(fp); return -18;
2019-12-19 00:39:47 +11:00
}
fclose(fp);
2019-03-04 02:22:55 +11:00
return 0;
}
/* ---------------------------------------------------------------- */
2019-07-08 15:28:04 +11:00
2019-03-04 02:22:55 +11:00
int fimg_create_from_dump(char *fname, FloatImg *head)
{
2019-07-08 15:28:04 +11:00
FILE *fp;
int foo, size;
2021-03-18 04:32:51 +11:00
long nbread;
2019-07-08 15:28:04 +11:00
FimgFileHead filehead;
2019-03-04 02:22:55 +11:00
#if DEBUG_LEVEL
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, fname, head);
#endif
2020-02-20 12:31:06 +11:00
/*
* may be we can crash coredump here if the head
* descriptor is not blank ?
*/
2019-03-04 02:22:55 +11:00
fp = fopen(fname, "r");
if (NULL==fp) {
perror(fname);
2020-01-10 22:01:12 +11:00
return -15;
2019-03-04 02:22:55 +11:00
}
2019-07-08 15:28:04 +11:00
foo = fread(&filehead, sizeof(FimgFileHead), 1, fp);
if (1 != foo) {
fprintf(stderr, "%s: short read on '%s'\n", __func__, fname);
2019-03-04 02:22:55 +11:00
fclose(fp);
2020-01-10 22:01:12 +11:00
return -16;
2019-03-04 02:22:55 +11:00
}
#if DEBUG_LEVEL
fprintf(stderr, "%s : got [ %dx%d %s ] from '%s'\n", __func__,
filehead.w, filehead.h, fimg_str_type(filehead.t),
fname);
2019-03-04 02:22:55 +11:00
#endif
2019-07-08 15:28:04 +11:00
foo = fimg_create(head, filehead.w, filehead.h, filehead.t);
2019-03-04 02:22:55 +11:00
if (foo) {
fprintf(stderr, "%s : create -> %d\n", __func__, foo);
return foo;
}
size = filehead.w * filehead.h;
2021-03-18 04:32:51 +11:00
nbread = 0;
nbread += fread(head->R, sizeof(float), size, fp);
nbread += fread(head->G, sizeof(float), size, fp);
nbread += fread(head->B, sizeof(float), size, fp);
2021-02-04 05:33:38 +11:00
2019-03-04 02:22:55 +11:00
fclose(fp);
2019-08-02 10:50:12 +11:00
2019-03-04 02:22:55 +11:00
return 0;
}