comparison resample2.c @ 12120:a80468e73475 libavcodec

resample: check memory allocations in av_resample_init()
author mru
date Fri, 09 Jul 2010 16:05:52 +0000
parents 7dd2a45249a9
children ee69b90df099
comparison
equal deleted inserted replaced
12119:4530b6b4d931 12120:a80468e73475
181 AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_size, int phase_shift, int linear, double cutoff){ 181 AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_size, int phase_shift, int linear, double cutoff){
182 AVResampleContext *c= av_mallocz(sizeof(AVResampleContext)); 182 AVResampleContext *c= av_mallocz(sizeof(AVResampleContext));
183 double factor= FFMIN(out_rate * cutoff / in_rate, 1.0); 183 double factor= FFMIN(out_rate * cutoff / in_rate, 1.0);
184 int phase_count= 1<<phase_shift; 184 int phase_count= 1<<phase_shift;
185 185
186 if (!c)
187 return NULL;
188
186 c->phase_shift= phase_shift; 189 c->phase_shift= phase_shift;
187 c->phase_mask= phase_count-1; 190 c->phase_mask= phase_count-1;
188 c->linear= linear; 191 c->linear= linear;
189 192
190 c->filter_length= FFMAX((int)ceil(filter_size/factor), 1); 193 c->filter_length= FFMAX((int)ceil(filter_size/factor), 1);
191 c->filter_bank= av_mallocz(c->filter_length*(phase_count+1)*sizeof(FELEM)); 194 c->filter_bank= av_mallocz(c->filter_length*(phase_count+1)*sizeof(FELEM));
195 if (!c->filter_bank)
196 goto error;
192 build_filter(c->filter_bank, factor, c->filter_length, phase_count, 1<<FILTER_SHIFT, WINDOW_TYPE); 197 build_filter(c->filter_bank, factor, c->filter_length, phase_count, 1<<FILTER_SHIFT, WINDOW_TYPE);
193 memcpy(&c->filter_bank[c->filter_length*phase_count+1], c->filter_bank, (c->filter_length-1)*sizeof(FELEM)); 198 memcpy(&c->filter_bank[c->filter_length*phase_count+1], c->filter_bank, (c->filter_length-1)*sizeof(FELEM));
194 c->filter_bank[c->filter_length*phase_count]= c->filter_bank[c->filter_length - 1]; 199 c->filter_bank[c->filter_length*phase_count]= c->filter_bank[c->filter_length - 1];
195 200
196 c->src_incr= out_rate; 201 c->src_incr= out_rate;
197 c->ideal_dst_incr= c->dst_incr= in_rate * phase_count; 202 c->ideal_dst_incr= c->dst_incr= in_rate * phase_count;
198 c->index= -phase_count*((c->filter_length-1)/2); 203 c->index= -phase_count*((c->filter_length-1)/2);
199 204
200 return c; 205 return c;
206 error:
207 av_free(c);
208 return NULL;
201 } 209 }
202 210
203 void av_resample_close(AVResampleContext *c){ 211 void av_resample_close(AVResampleContext *c){
204 av_freep(&c->filter_bank); 212 av_freep(&c->filter_bank);
205 av_freep(&c); 213 av_freep(&c);