diff options
author | Dongwon Kang <dwkang@google.com> | 2017-07-19 00:59:20 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2017-07-19 00:59:20 +0000 |
commit | aa13dd8969c30e581ae193d4ffe27fa9d7c2f36c (patch) | |
tree | 80fc9bf979b74c09262764e2a672c80866c4360a | |
parent | 419538641a94b9c0b3ea3d1c91a67e7b0f450701 (diff) | |
parent | 668df55de401ea21e3bcb24f871f76a4c408f022 (diff) | |
download | tremolo-aa13dd8969c30e581ae193d4ffe27fa9d7c2f36c.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 am: ed926580d2 am: 90152a22eb am: f91e39c62c
am: 668df55de4
Change-Id: I2d558da7564e4e9fb60bc93f35c3994c570908c5
-rw-r--r-- | Tremolo/res012.c | 36 |
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; } |