diff options
author | Marco Nelissen <marcone@google.com> | 2016-05-24 20:25:23 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-05-24 20:25:23 +0000 |
commit | eea37099a5f3b3ea8ccd344f949370986922b649 (patch) | |
tree | 1e142a03d88568106ef722f20c24ba8e421fa2be | |
parent | e97cf75293741179dbbba302db2327dd7d43756d (diff) | |
parent | c299f659a43a52070035e5c7822191622c9e9c3c (diff) | |
download | tremolo-eea37099a5f3b3ea8ccd344f949370986922b649.tar.gz |
Check partword is in range for # of partitions am: 4da931ed17 am: 2214429dcd am: 6ff98fe50d am: 615f5e52a0 am: a184912344 am: d2cc408b9b
am: c299f659a4
* commit 'c299f659a43a52070035e5c7822191622c9e9c3c':
Check partword is in range for # of partitions
Change-Id: I03544703b42b5caaca62105d1882f41ca028b206
-rw-r--r-- | Tremolo/res012.c | 129 |
1 files changed, 65 insertions, 64 deletions
diff --git a/Tremolo/res012.c b/Tremolo/res012.c index 59accce..be279d0 100644 --- a/Tremolo/res012.c +++ b/Tremolo/res012.c @@ -56,7 +56,7 @@ void res_clear_info(vorbis_info_residue *info){ /* vorbis_info is for range checking */ int res_unpack(vorbis_info_residue *info, - vorbis_info *vi,oggpack_buffer *opb){ + vorbis_info *vi,oggpack_buffer *opb){ int j,k; codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; memset(info,0,sizeof(*info)); @@ -83,12 +83,12 @@ int res_unpack(vorbis_info_residue *info, for(j=0;j<info->partitions;j++){ for(k=0;k<8;k++){ if((info->stagemasks[j]>>k)&1){ - unsigned char book=(unsigned char)oggpack_read(opb,8); - if(book>=ci->books)goto errout; - info->stagebooks[j*8+k]=book; - if(k+1>info->stages)info->stages=k+1; + unsigned char book=(unsigned char)oggpack_read(opb,8); + if(book>=ci->books)goto errout; + info->stagebooks[j*8+k]=book; + if(k+1>info->stages)info->stages=k+1; }else - info->stagebooks[j*8+k]=0xff; + info->stagebooks[j*8+k]=0xff; } } @@ -101,7 +101,7 @@ int res_unpack(vorbis_info_residue *info, } int res_inverse(vorbis_dsp_state *vd,vorbis_info_residue *info, - ogg_int32_t **in,int *nonzero,int ch){ + ogg_int32_t **in,int *nonzero,int ch){ int i,j,k,s,used=0; codec_setup_info *ci=(codec_setup_info *)vd->vi->codec_setup; @@ -120,66 +120,67 @@ int res_inverse(vorbis_dsp_state *vd,vorbis_info_residue *info, int partwords=(partvals+partitions_per_word-1)/partitions_per_word; for(i=0;i<ch;i++) - if(nonzero[i]) - in[used++]=in[i]; + if(nonzero[i]) + in[used++]=in[i]; ch=used; if(used){ - char **partword=(char **)alloca(ch*sizeof(*partword)); - for(j=0;j<ch;j++) - partword[j]=(char *)alloca(partwords*partitions_per_word* - sizeof(*partword[j])); - - for(s=0;s<info->stages;s++){ - - for(i=0;i<partvals;){ - if(s==0){ - /* fetch the partition word for each channel */ - - partword[0][i+partitions_per_word-1]=1; - for(k=partitions_per_word-2;k>=0;k--) - partword[0][i+k]=partword[0][i+k+1]*info->partitions; - - for(j=1;j<ch;j++) - for(k=partitions_per_word-1;k>=0;k--) - partword[j][i+k]=partword[j-1][i+k]; - - for(j=0;j<ch;j++){ - int temp=vorbis_book_decode(phrasebook,&vd->opb); - if(temp==-1)goto eopbreak; - - /* this can be done quickly in assembly due to the quotient - always being at most six bits */ - for(k=0;k<partitions_per_word;k++){ - ogg_uint32_t div=partword[j][i+k]; - partword[j][i+k]=temp/div; - temp-=partword[j][i+k]*div; - } - - } - } - - /* now we decode residual values for the partitions */ - for(k=0;k<partitions_per_word && i<partvals;k++,i++) - for(j=0;j<ch;j++){ - long offset=info->begin+i*samples_per_partition; - if(info->stagemasks[(int)partword[j][i]]&(1<<s)){ - codebook *stagebook=ci->book_param+ - info->stagebooks[(partword[j][i]<<3)+s]; - if(info->type){ - if(vorbis_book_decodev_add(stagebook,in[j]+offset,&vd->opb, - samples_per_partition,-8)==-1) - goto eopbreak; - }else{ - if(vorbis_book_decodevs_add(stagebook,in[j]+offset,&vd->opb, - samples_per_partition,-8)==-1) - goto eopbreak; - } - } - } - } - } + char **partword=(char **)alloca(ch*sizeof(*partword)); + for(j=0;j<ch;j++) + partword[j]=(char *)alloca(partwords*partitions_per_word* + sizeof(*partword[j])); + + for(s=0;s<info->stages;s++){ + + for(i=0;i<partvals;){ + if(s==0){ + /* fetch the partition word for each channel */ + + partword[0][i+partitions_per_word-1]=1; + for(k=partitions_per_word-2;k>=0;k--) + partword[0][i+k]=partword[0][i+k+1]*info->partitions; + + for(j=1;j<ch;j++) + for(k=partitions_per_word-1;k>=0;k--) + partword[j][i+k]=partword[j-1][i+k]; + + for(j=0;j<ch;j++){ + int temp=vorbis_book_decode(phrasebook,&vd->opb); + if(temp==-1)goto eopbreak; + + /* this can be done quickly in assembly due to the quotient + always being at most six bits */ + for(k=0;k<partitions_per_word;k++){ + ogg_uint32_t div=partword[j][i+k]; + partword[j][i+k]=temp/div; + temp-=partword[j][i+k]*div; + } + + } + } + + /* now we decode residual values for the partitions */ + for(k=0;k<partitions_per_word && i<partvals;k++,i++) + for(j=0;j<ch;j++){ + long offset=info->begin+i*samples_per_partition; + int idx = (int)partword[j][i]; + if(idx < info->partitions && info->stagemasks[idx]&(1<<s)){ + codebook *stagebook=ci->book_param+ + info->stagebooks[(partword[j][i]<<3)+s]; + if(info->type){ + if(vorbis_book_decodev_add(stagebook,in[j]+offset,&vd->opb, + samples_per_partition,-8)==-1) + goto eopbreak; + }else{ + if(vorbis_book_decodevs_add(stagebook,in[j]+offset,&vd->opb, + samples_per_partition,-8)==-1) + goto eopbreak; + } + } + } + } + } } } }else{ @@ -192,7 +193,7 @@ int res_inverse(vorbis_dsp_state *vd,vorbis_info_residue *info, int partwords=(partvals+partitions_per_word-1)/partitions_per_word; char *partword= - (char *)alloca(partwords*partitions_per_word*sizeof(*partword)); + (char *)alloca(partwords*partitions_per_word*sizeof(*partword)); int beginoff=info->begin/ch; for(i=0;i<ch;i++)if(nonzero[i])break; |