diff options
| author | Magnus Holmgren <magnushol@gmail.com> | 2006-04-05 14:01:08 +0000 |
|---|---|---|
| committer | Magnus Holmgren <magnushol@gmail.com> | 2006-04-05 14:01:08 +0000 |
| commit | 9613b91164d2c1331096c9c06f509fa52f196147 (patch) | |
| tree | a34860ca67fb885c727eead33f2298d082dde4fa /apps/codecs | |
| parent | a2d8fb5d8c455f2408526748b1ecf682fce074a3 (diff) | |
| download | rockbox-9613b91164d2c1331096c9c06f509fa52f196147.zip rockbox-9613b91164d2c1331096c9c06f509fa52f196147.tar.gz rockbox-9613b91164d2c1331096c9c06f509fa52f196147.tar.bz2 rockbox-9613b91164d2c1331096c9c06f509fa52f196147.tar.xz | |
Fix bug #3003 (old Vorbis encode crashes Rockbox), and hopefully not break any other files. :)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9516 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/codecs')
| -rw-r--r-- | apps/codecs/Tremor/sharedbook.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/apps/codecs/Tremor/sharedbook.c b/apps/codecs/Tremor/sharedbook.c index e163f3d..b61b6d0 100644 --- a/apps/codecs/Tremor/sharedbook.c +++ b/apps/codecs/Tremor/sharedbook.c @@ -30,6 +30,12 @@ */ #define BOOK_INIT_MAXSIZE 3072 +/* Max value in static_codebook.dim we expect to find in _book_unquantize. + * Used to avoid some temporary allocations. Again, enough for some test + * files... + */ +#define BOOK_DIM_MAX 4 + /**** pack/unpack helpers ******************************************/ int _ilog(unsigned int v){ int ret=0; @@ -189,13 +195,19 @@ ogg_int32_t *_book_unquantize(const static_codebook *b,int n,int *sparsemap, int *maxpoint){ long j,k,count=0; if(b->maptype==1 || b->maptype==2){ + /* Static buffer to avoid temporary calloc, which Rockbox (currently) + * doesn't handle well + */ + static int rp_buffer[BOOK_INIT_MAXSIZE*BOOK_DIM_MAX]; int quantvals; int minpoint,delpoint; ogg_int32_t mindel=_float32_unpack(b->q_min,&minpoint); ogg_int32_t delta=_float32_unpack(b->q_delta,&delpoint); ogg_int32_t *r=(ogg_int32_t *)_ogg_calloc(n*b->dim,sizeof(*r)); - int *rp=(int *)_ogg_calloc(n*b->dim,sizeof(*rp)); + /* int *rp=(int *)_ogg_calloc(n*b->dim,sizeof(*rp)); */ + int* rp=rp_buffer; + memset(rp, 0, n*b->dim*sizeof(*rp)); *maxpoint=minpoint; /* maptype 1 and 2 both use a quantized value vector, but @@ -282,7 +294,7 @@ ogg_int32_t *_book_unquantize(const static_codebook *b,int n,int *sparsemap, if(rp[j]<*maxpoint) r[j]>>=*maxpoint-rp[j]; - _ogg_free(rp); + /* _ogg_free(rp); */ return(r); } return(NULL); @@ -364,7 +376,9 @@ int vorbis_book_init_decode(codebook *c,const static_codebook *s){ /* ogg_uint32_t **codep=(ogg_uint32_t **)alloca(sizeof(*codep)*n); */ ogg_uint32_t **codep=codep_buffer; - if (n > BOOK_INIT_MAXSIZE) + /* We have buffers for these sizes */ + if ((n>BOOK_INIT_MAXSIZE) + || (n*s->dim>BOOK_INIT_MAXSIZE*BOOK_DIM_MAX)) goto err_out; if(codes==NULL)goto err_out; @@ -376,7 +390,7 @@ int vorbis_book_init_decode(codebook *c,const static_codebook *s){ qsort(codep,n,sizeof(*codep),sort32a); - /*sortindex=(int *)alloca(n*sizeof(*sortindex));*/ + /* sortindex=(int *)alloca(n*sizeof(*sortindex)); */ sortindex=sortindex_buffer; c->codelist=(ogg_uint32_t *)_ogg_malloc(n*sizeof(*c->codelist)); /* the index is a reverse index */ |