diff --git a/src/database.c b/src/database.c index 8997972..c8720f9 100644 --- a/src/database.c +++ b/src/database.c @@ -42,6 +42,8 @@ return -1; \ } +const char *imdb_hdr_fmt = "IMDB v%02u, CAPS: %s;"; + int db_open(db_t *db, const char *path) { int init = 0; @@ -70,7 +72,7 @@ int db_open(db_t *db, const char *path) if (init) { memset(buf, 0x0, IMDB_REC_LEN); - snprintf((char *) buf, IMDB_REC_LEN, "DB of image fingerprints (vers %d)", IMDB_VERSION); + snprintf((char *) buf, IMDB_REC_LEN, imdb_hdr_fmt, IMDB_VERSION, "M-R"); DB_SEEK(db, 0); DB_WRITE(db, buf, IMDB_REC_LEN); @@ -213,11 +215,11 @@ int db_search(db_t *db, rec_t *sample, float tresh, match_t **matches) while (db_rd_blk(db, &blk) > 0) { p = blk.data; for (i = 0; i < blk.records; i++, p += IMDB_REC_LEN) { - t = p + OFF_USED; + t = p + REC_OFF_RU; if (*t == 0x0) continue; - t = p + OFF_BITMAP; - diff = (float) bitmap_compare(t, sample->data + OFF_BITMAP); + t = p + REC_OFF_BM; + diff = (float) bitmap_compare(t, sample->data + REC_OFF_BM); diff /= BITMAP_BITS; if (diff > tresh) continue; diff --git a/src/database.h b/src/database.h index c2de016..4bc2f91 100644 --- a/src/database.h +++ b/src/database.h @@ -2,7 +2,7 @@ #define HAS_DATABASE_H 1 #define IMDB_REC_LEN 48 -#define IMDB_VERSION 1 +#define IMDB_VERSION 2 #define OPEN_FLAGS O_CREAT | O_RDWR typedef struct { @@ -18,21 +18,44 @@ typedef struct { } block_t; /** - pos len || description - - 0 1 -- record is used - - 1 1 -- must be zero - - 2 32 -- bitmap, each 2 bytes is row of monochrome image 16x16 - - 33 1 -- level of color R__ - - 34 1 -- level of color _G_ - - 35 1 -- level of color __B - - 36 11 -- must be zero - */ + Database header format - fixed length, 48 bytes + + 0-15 : "IMDB vXX, CAPS: " +16-23 : capabilities, terminated with ';' +24-48 : padding with null's +*/ + +#define CAP_OFF_BITMAP 0 +#define CAP_OFF_COLORS 1 +#define CAP_OFF_RATIO 2 +/* 3 used, 5 reserved */ + +/** + Database record format - fixed length, 48 bytes + + # | off | len | description +---+-----+-----+------------------------------------------------------- + 1 | 0 | 1 | record is used + 2 | 1 | 1 | overall level of color: R-- + 3 | 2 | 1 | overall level of color: -G- + 4 | 3 | 1 | overall level of color: --B + 5 | 4 | 2 | image width + 6 | 6 | 2 | image height + - | 8 | 8 | reserved for future use + 7 | 16 | 32 | bitmap, each 2 bytes is row of monochrome image 16x16 + +field | 12345 6 + 7 +map | XRGBWWHH________MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM +sect | [ 0-15 ][ 16-31 ][ 32-48 ] +*/ -#define OFF_USED 0 -#define OFF_BITMAP 2 -#define OFF_COLORR 33 -#define OFF_COLORG 34 -#define OFF_COLORB 35 +#define REC_OFF_RU 0 /* record is used */ +#define REC_OFF_CR 1 /* color level: red */ +#define REC_OFF_CG 2 /* color level: green */ +#define REC_OFF_CB 3 /* color level: blue */ +#define REC_OFF_IW 4 /* image width */ +#define REC_OFF_IH 6 /* image height */ +#define REC_OFF_BM 16 /* image bitmap */ typedef struct { uint64_t num; diff --git a/src/util.c b/src/util.c index 0636bfe..2924e4c 100644 --- a/src/util.c +++ b/src/util.c @@ -78,7 +78,7 @@ int db_usage_map(db_t *db, unsigned short int cols) while (db_rd_blk(db, &blk) > 0) { p = blk.data; for (i = 0; i < blk.records; i++, p += IMDB_REC_LEN) { - t = p + OFF_USED; + t = p + REC_OFF_RU; buf[j] = (*t == 0xFF) ? '1' : '0'; if (j++ < cols) continue; @@ -111,7 +111,7 @@ int rec_bitmap(db_t *db, rec_t *sample) } for (i = 0; i < 16; i++) { - row = *(((uint16_t *) (&sample->data[OFF_BITMAP])) + i); + row = *(((uint16_t *) (&sample->data[REC_OFF_BM])) + i); for (j = 0; j < 16; j++) { putchar((row & 1) == 1 ? '1' : '0'); row >>= 1; @@ -156,13 +156,13 @@ int rec_diff(db_t *db, unsigned long a, unsigned long b, unsigned short int show } if (showmap == 0) { - diff = (float) bitmap_compare(&src.data[OFF_BITMAP], &dst.data[OFF_BITMAP]); + diff = (float) bitmap_compare(&src.data[REC_OFF_BM], &dst.data[REC_OFF_BM]); diff /= BITMAP_BITS; printf("%.2f%%\n", diff * 100); return 0; } - bitmap_diffmap(&map[0], src.data + OFF_BITMAP, dst.data + OFF_BITMAP); + bitmap_diffmap(&map[0], src.data + REC_OFF_BM, dst.data + REC_OFF_BM); for (i = 0; i < 16; i++) { row = *(((uint16_t *) map) + i);