aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDongwon Kang <dwkang@google.com>2017-07-19 00:23:20 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-07-19 00:23:20 +0000
commited926580d2198e613b04725ddfae8d51043c6a69 (patch)
tree9cffb267fc3523c6ce4117c386069fa6c2a3b598
parenta474c58badf887e7f07f14bf90c2a1be545a2e63 (diff)
parent0d377ce79426f9b59853d26b0e73dc873f026c21 (diff)
downloadtremolo-ed926580d2198e613b04725ddfae8d51043c6a69.tar.gz
Use heap instead of alloca in res012.c am: 70f5300e5a am: 69a7633dda am: 8096fc27d4 am: c9114c49d3 am: 4d3d5ea32f am: 10c7f1515d am: 09a0b53fa6 am: e7f70f541e am: d1f24da575 am: 9e47e9812d am: b64617182d
am: 0d377ce794 Change-Id: Ib4b42aee800084e28d72e0585fc0b693de2cf2ee
-rw-r--r--Tremolo/res012.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/Tremolo/res012.c b/Tremolo/res012.c
index 513d9ad..d6495fb 100644
--- a/Tremolo/res012.c
+++ b/Tremolo/res012.c
@@ -126,10 +126,13 @@ int res_inverse(vorbis_dsp_state *vd,vorbis_info_residue *info,
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]));
+ char **partword=(char **)_ogg_calloc(ch,sizeof(*partword));
+ if(partword==NULL)goto cleanup1;
+ for(j=0;j<ch;j++){
+ partword[j]=(char *)_ogg_malloc(partwords*partitions_per_word*
+ sizeof(*partword[j]));
+ if(partword[j]==NULL)goto cleanup1;
+ }
for(s=0;s<info->stages;s++){
@@ -147,7 +150,7 @@ int res_inverse(vorbis_dsp_state *vd,vorbis_info_residue *info,
for(j=0;j<ch;j++){
int temp=vorbis_book_decode(phrasebook,&vd->opb);
- if(temp==-1)goto eopbreak;
+ if(temp==-1)goto cleanup1;
/* this can be done quickly in assembly due to the quotient
always being at most six bits */
@@ -171,16 +174,23 @@ int res_inverse(vorbis_dsp_state *vd,vorbis_info_residue *info,
if(info->type){
if(vorbis_book_decodev_add(stagebook,in[j]+offset,&vd->opb,
samples_per_partition,-8)==-1)
- goto eopbreak;
+ goto cleanup1;
}else{
if(vorbis_book_decodevs_add(stagebook,in[j]+offset,&vd->opb,
samples_per_partition,-8)==-1)
- goto eopbreak;
+ goto cleanup1;
}
}
}
}
}
+ cleanup1:
+ if(partword){
+ for(j=0;j<ch;j++){
+ if(partword[j])_ogg_free(partword[j]);
+ }
+ _ogg_free(partword);
+ }
}
}
}else{
@@ -193,11 +203,12 @@ 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 *)_ogg_malloc(partwords*partitions_per_word*sizeof(*partword));
+ if(partword==NULL)goto cleanup2;
int beginoff=info->begin/ch;
for(i=0;i<ch;i++)if(nonzero[i])break;
- if(i==ch)return(0); /* no nonzero vectors */
+ if(i==ch)goto cleanup2; /* no nonzero vectors */
samples_per_partition/=ch;
@@ -212,7 +223,7 @@ int res_inverse(vorbis_dsp_state *vd,vorbis_info_residue *info,
/* fetch the partition word */
temp=vorbis_book_decode(phrasebook,&vd->opb);
- if(temp==-1)goto eopbreak;
+ if(temp==-1)goto cleanup2;
/* this can be done quickly in assembly due to the quotient
always being at most six bits */
@@ -233,14 +244,15 @@ int res_inverse(vorbis_dsp_state *vd,vorbis_info_residue *info,
i*samples_per_partition+beginoff,ch,
&vd->opb,
samples_per_partition,-8)==-1)
- goto eopbreak;
+ goto cleanup2;
}
}
}
}
+ cleanup2:
+ if(partword)_ogg_free(partword);
}
}
- eopbreak:
return 0;
}