diff options
author | Xin Li <delphij@google.com> | 2021-12-13 21:41:38 -0800 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2021-12-14 08:39:05 -0800 |
commit | 50bbfffbad9772eaae56b889a7975a39e37dd811 (patch) | |
tree | 2e640a0707569afa88695653f8496636ac00e249 | |
parent | 746b3fe8adba81db4462fab468b157181ad7cc53 (diff) | |
parent | 38e932a8c16bc5733be380fe327db4c0efd5ad25 (diff) | |
download | tremolo-50bbfffbad9772eaae56b889a7975a39e37dd811.tar.gz |
Merge Android 12 QPR1
Bug: 210511427
Merged-In: I17688436501ef743e1c322453dfeedddf796bba7
Change-Id: Ic1abc0667de54aae268984cc95600ef8a8c415ac
-rw-r--r-- | Tremolo/codebook.c | 5 | ||||
-rw-r--r-- | Tremolo/floor0.c | 37 |
2 files changed, 28 insertions, 14 deletions
diff --git a/Tremolo/codebook.c b/Tremolo/codebook.c index f7d8d79..692f65f 100644 --- a/Tremolo/codebook.c +++ b/Tremolo/codebook.c @@ -848,6 +848,7 @@ static int decode_map(codebook *s, oggpack_buffer *b, ogg_int32_t *v, int point) #endif /* 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){ @@ -868,6 +869,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){ @@ -887,6 +889,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){ diff --git a/Tremolo/floor0.c b/Tremolo/floor0.c index 7e74d1e..11452c5 100644 --- a/Tremolo/floor0.c +++ b/Tremolo/floor0.c @@ -103,28 +103,34 @@ static inline ogg_int32_t vorbis_coslook2_i(long a){ (COS_LOOKUP_I_SHIFT-LSP_FRACBITS+14); } -static const ogg_uint16_t barklook[54]={ +/* Values in barklook are defined such that toBARK(x) is an approximation to + POW(2, 15) * ((13.1*ATAN(0.00074*(x)))+(2.24*ATAN((x)*(x)*0.0000000185))+(0.0001*(x))) */ +static const ogg_uint16_t barklook[]={ 0,51,102,154, 206,258,311,365, 420,477,535,594, 656,719,785,854, 926,1002,1082,1166, 1256,1352,1454,1564, 1683,1812,1953,2107, 2276,2463,2670,2900, 3155,3440,3756,4106, 4493,4919,5387,5901, 6466,7094,7798,8599, 9528,10623,11935,13524, - 15453,17775,20517,23667, 27183,31004 + 15453,17775,20517,23667, 27183,31004,35069 }; /* used in init only; interpolate the long way */ -static inline ogg_int32_t toBARK(int n){ +static inline ogg_int32_t toBARK(ogg_uint16_t n){ int i; - for(i=0;i<54;i++) - if(n>=barklook[i] && n<barklook[i+1])break; - - if(i==54){ - return 54<<14; - }else{ - return (i<<14)+(((n-barklook[i])* - ((1UL<<31)/(barklook[i+1]-barklook[i])))>>17); + int barklook_size = (sizeof(barklook) / sizeof(barklook[0])); + for(i=1;i<barklook_size;i++){ + if(n<barklook[i]){ + i--; + return (i<<14)+(((n-barklook[i])* + ((1UL<<31)/(barklook[i+1]-barklook[i])))>>17); + } } + /* for a valid input n, which is half of info->rate (i.e. max 32767 + as info->rate is 16 bit unsigned value), loop above will return + an output. So the following return will be used only when toBARK() + is called with invalid value */ + return (barklook_size-1)<<14; } static const unsigned char MLOOP_1[64]={ @@ -174,6 +180,8 @@ void vorbis_lsp_to_curve(ogg_int32_t *curve,int n,int ln, #else ogg_uint32_t nextbark=MULT31(imap>>1,tBnyq1); #endif + /* nextbark is guaranteed to be less than 54 << 14 here and that ensures index + to barklook can at max be 53 and 54 here */ int nextf=barklook[nextbark>>14]+(((nextbark&0x3fff)* (barklook[(nextbark>>14)+1]-barklook[nextbark>>14]))>>14); @@ -340,6 +348,8 @@ void vorbis_lsp_to_curve(ogg_int32_t *curve,int n,int ln, #else nextbark=MULT31((map+1)*(imap>>1),tBnyq1); #endif + /* nextbark is guaranteed to be less than 54 << 14 here and that ensures index + to barklook can at max be 53 and 54 here */ nextf=barklook[nextbark>>14]+ (((nextbark&0x3fff)* (barklook[(nextbark>>14)+1]-barklook[nextbark>>14]))>>14); @@ -426,10 +436,9 @@ ogg_int32_t *floor0_inverse1(vorbis_dsp_state *vd,vorbis_info_floor *i, } ogg_int32_t last=0; - for(j=0;j<info->order;j+=b->dim) - if(vorbis_book_decodev_set(b,lsp+j,&vd->opb,b->dim,-24)==-1)goto eop; + if(vorbis_book_decodev_set(b,lsp,&vd->opb,info->order,-24)==-1)goto eop; for(j=0;j<info->order;){ - for(k=0;k<b->dim;k++,j++)lsp[j]+=last; + for(k=0;k<b->dim && j<info->order;k++,j++)lsp[j]+=last; last=lsp[j-1]; } |