mas01cr@498
|
1 extern "C" {
|
mas01cr@498
|
2 #include "audioDB_API.h"
|
mas01cr@509
|
3 }
|
mas01cr@498
|
4 #include "audioDB-internals.h"
|
mas01cr@498
|
5
|
mas01cr@498
|
6 static int audiodb_l2norm_existing(adb_t *adb) {
|
mas01cr@593
|
7 double *data_buffer = 0, *l2norm_buffer = 0;
|
mas01cr@593
|
8 size_t data_buffer_size = align_page_up(adb->header->length);
|
mas01cr@593
|
9 size_t nvectors = adb->header->length / (sizeof(double) * adb->header->dim);
|
mas01cr@593
|
10 /* FIXME: this allocation of the vector data buffer will lose if we
|
mas01cr@593
|
11 * ever turn the l2norm flag on when we have already inserted a
|
mas01cr@593
|
12 * large number of vectors, as the malloc() will fail. "Don't do
|
mas01cr@593
|
13 * that, then" is one possible answer. */
|
mas01cr@593
|
14 data_buffer = (double *) malloc(data_buffer_size);
|
mas01cr@593
|
15 if (!data_buffer) {
|
mas01cr@593
|
16 goto error;
|
mas01cr@593
|
17 }
|
mas01cr@593
|
18 lseek_set_or_goto_error(adb->fd, adb->header->dataOffset);
|
mas01cr@593
|
19 read_or_goto_error(adb->fd, data_buffer, data_buffer_size);
|
mas01cr@593
|
20
|
mas01cr@498
|
21 l2norm_buffer = (double *) malloc(nvectors * sizeof(double));
|
mas01cr@498
|
22 if(!l2norm_buffer) {
|
mas01cr@498
|
23 goto error;
|
mas01cr@498
|
24 }
|
mas01cr@593
|
25 audiodb_l2norm_buffer(data_buffer, adb->header->dim, nvectors, l2norm_buffer);
|
mas01cr@593
|
26 lseek_set_or_goto_error(adb->fd, adb->header->l2normTableOffset);
|
mas01cr@498
|
27 write_or_goto_error(adb->fd, l2norm_buffer, nvectors * sizeof(double));
|
mas01cr@498
|
28
|
mas01cr@498
|
29 free(l2norm_buffer);
|
mas01cr@593
|
30 free(data_buffer);
|
mas01cr@498
|
31
|
mas01cr@498
|
32 return 0;
|
mas01cr@498
|
33
|
mas01cr@498
|
34 error:
|
mas01cr@593
|
35 if(data_buffer) {
|
mas01cr@593
|
36 free(data_buffer);
|
mas01cr@593
|
37 }
|
mas01cr@498
|
38 if(l2norm_buffer) {
|
mas01cr@498
|
39 free(l2norm_buffer);
|
mas01cr@498
|
40 }
|
mas01cr@498
|
41 return 1;
|
mas01cr@498
|
42 }
|
mas01cr@498
|
43
|
mas01cr@498
|
44 int audiodb_l2norm(adb_t *adb) {
|
mas01cr@498
|
45 if(!(adb->flags & O_RDWR)) {
|
mas01cr@498
|
46 return 1;
|
mas01cr@498
|
47 }
|
mas01cr@593
|
48 if(adb->header->flags & ADB_HEADER_FLAG_L2NORM) {
|
mas01cr@498
|
49 /* non-error code for forthcoming backwards-compatibility
|
mas01cr@498
|
50 * reasons */
|
mas01cr@498
|
51 return 0;
|
mas01cr@498
|
52 }
|
mas01cr@593
|
53 if((!(adb->header->flags & ADB_HEADER_FLAG_REFERENCES)) &&
|
mas01cr@593
|
54 (adb->header->length > 0)) {
|
mas01cr@498
|
55 if(audiodb_l2norm_existing(adb)) {
|
mas01cr@498
|
56 goto error;
|
mas01cr@498
|
57 }
|
mas01cr@498
|
58 }
|
mas01cr@509
|
59 adb->header->flags |= ADB_HEADER_FLAG_L2NORM;
|
mas01cr@498
|
60 return audiodb_sync_header(adb);
|
mas01cr@498
|
61
|
mas01cr@498
|
62 error:
|
mas01cr@498
|
63 return 1;
|
mas01cr@498
|
64 }
|