Mercurial > libavcodec.hg
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); |