annotate l2norm.cpp @ 770:c54bc2ffbf92 tip

update tags
author convert-repo
date Fri, 16 Dec 2011 11:34:01 +0000
parents 70acfcb5010a
children
rev   line source
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 }