diff options
Diffstat (limited to 'codebook.c')
-rw-r--r-- | codebook.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -241,6 +241,7 @@ long vorbis_book_decode(codebook *book, oggpack_buffer *b){ } /* returns 0 on OK or -1 on eof *************************************/ +/* decode vector / dim granularity gaurding is done in the upper layer */ long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a, oggpack_buffer *b,int n,int point){ if(book->used_entries>0){ @@ -273,6 +274,7 @@ long vorbis_book_decodevs_add(codebook *book,ogg_int32_t *a, return(0); } +/* decode vector / dim granularity gaurding is done in the upper layer */ long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a, oggpack_buffer *b,int n,int point){ if(book->used_entries>0){ @@ -301,6 +303,9 @@ long vorbis_book_decodev_add(codebook *book,ogg_int32_t *a, return(0); } +/* unlike the others, we guard against n not being an integer number + of <dim> internally rather than in the upper layer (called only by + floor0) */ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, oggpack_buffer *b,int n,int point){ if(book->used_entries>0){ @@ -314,7 +319,7 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, entry = decode_packed_entry_number(book,b); if(entry==-1)return(-1); t = book->valuelist+entry*book->dim; - for (j=0;j<book->dim;){ + for (j=0;i<n && j<book->dim;){ a[i++]=t[j++]>>shift; } } @@ -324,7 +329,7 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, entry = decode_packed_entry_number(book,b); if(entry==-1)return(-1); t = book->valuelist+entry*book->dim; - for (j=0;j<book->dim;){ + for (j=0;i<n && j<book->dim;){ a[i++]=t[j++]<<-shift; } } @@ -333,14 +338,13 @@ long vorbis_book_decodev_set(codebook *book,ogg_int32_t *a, int i,j; for(i=0;i<n;){ - for (j=0;j<book->dim;){ - a[i++]=0; - } + a[i++]=0; } } return(0); } +/* decode vector / dim granularity gaurding is done in the upper layer */ long vorbis_book_decodevv_add(codebook *book,ogg_int32_t **a,\ long offset,int ch, oggpack_buffer *b,int n,int point){ |