summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Giacomelli <giac2000@hotmail.com>2009-06-30 22:37:05 +0000
committerMichael Giacomelli <giac2000@hotmail.com>2009-06-30 22:37:05 +0000
commitbd70193e98e7d572dd5f7d374d5034b3d9c220d7 (patch)
treef5fe12f94158c6db7fb47f1108702fb7f4a8ed6f
parenta538b89060bee76d5c6a078883748cac0a720ea7 (diff)
downloadrockbox-bd70193e98e7d572dd5f7d374d5034b3d9c220d7.tar.gz
rockbox-bd70193e98e7d572dd5f7d374d5034b3d9c220d7.zip
Commit rest of fix in FS#9866. Don't parse Vorbis comments again in libtremor. It wastes memory and we already have the comments in memory. Looking at the spec and code, I think this fix is proper, but if it breaks any files this may need to be revisited.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21581 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/codecs/libtremor/info.c25
1 files changed, 1 insertions, 24 deletions
diff --git a/apps/codecs/libtremor/info.c b/apps/codecs/libtremor/info.c
index e96dd88b70..cb3860bbff 100644
--- a/apps/codecs/libtremor/info.c
+++ b/apps/codecs/libtremor/info.c
@@ -138,34 +138,11 @@ static int _vorbis_unpack_info(vorbis_info *vi,oggpack_buffer *opb){
138} 138}
139 139
140static int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb){ 140static int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb){
141 int i;
142 int vendorlen=oggpack_read(opb,32); 141 int vendorlen=oggpack_read(opb,32);
143 if(vendorlen<0)goto err_out; 142 if(vendorlen<0)goto err_out;
144 vc->vendor=(char *)_ogg_calloc(vendorlen+1,1); 143 vc->vendor=(char *)_ogg_calloc(vendorlen+1,1);
145 _v_readstring(opb,vc->vendor,vendorlen); 144 _v_readstring(opb,vc->vendor,vendorlen);
146 vc->comments=oggpack_read(opb,32); 145 vc->comments=0;
147 if(vc->comments<0)goto err_out;
148 vc->user_comments=(char **)_ogg_calloc(vc->comments+1,sizeof(*vc->user_comments));
149 vc->comment_lengths=(int *)_ogg_calloc(vc->comments+1, sizeof(*vc->comment_lengths));
150
151 for(i=0;i<vc->comments;i++){
152 int len=oggpack_read(opb,32);
153 if(len<0)goto err_out;
154 vc->comment_lengths[i]=len;
155 if(len>10000){ /*truncate long comments rather then seg faulting*/
156 vc->user_comments[i]=(char *)_ogg_calloc(10001,1);
157 _v_readstring(opb,vc->user_comments[i],10000);
158 /*just to be neat, consumed and discard the rest of the comment*/
159 len-=10000;
160 while(len--)
161 oggpack_read(opb,8);
162 }else{
163 vc->user_comments[i]=(char *)_ogg_calloc(len+1,1);
164 _v_readstring(opb,vc->user_comments[i],len);
165 }
166 }
167 if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */
168
169 return(0); 146 return(0);
170 err_out: 147 err_out:
171 vorbis_comment_clear(vc); 148 vorbis_comment_clear(vc);