Mercurial > libavcodec.hg
comparison resample2.c @ 2109:84637c6ca74e libavcodec
various resampling fixes
author | michael |
---|---|
date | Wed, 30 Jun 2004 14:15:31 +0000 |
parents | 76cdbe832239 |
children | 7f88c429ad65 |
comparison
equal
deleted
inserted
replaced
2108:ce669c39e3d5 | 2109:84637c6ca74e |
---|---|
121 memset(c, 0, sizeof(AVResampleContext)); | 121 memset(c, 0, sizeof(AVResampleContext)); |
122 | 122 |
123 c->filter_length= ceil(16.0/factor); | 123 c->filter_length= ceil(16.0/factor); |
124 c->filter_bank= av_mallocz(c->filter_length*(PHASE_COUNT+1)*sizeof(short)); | 124 c->filter_bank= av_mallocz(c->filter_length*(PHASE_COUNT+1)*sizeof(short)); |
125 av_build_filter(c->filter_bank, factor, c->filter_length, PHASE_COUNT, 1<<FILTER_SHIFT, 1); | 125 av_build_filter(c->filter_bank, factor, c->filter_length, PHASE_COUNT, 1<<FILTER_SHIFT, 1); |
126 c->filter_bank[c->filter_length*PHASE_COUNT + (c->filter_length-1) + 1]= (1<<FILTER_SHIFT)-1; | 126 c->filter_bank[c->filter_length*PHASE_COUNT + (c->filter_length-1)/2 + 1]= (1<<FILTER_SHIFT)-1; |
127 c->filter_bank[c->filter_length*PHASE_COUNT + (c->filter_length-1) + 2]= 1; | 127 c->filter_bank[c->filter_length*PHASE_COUNT + (c->filter_length-1)/2 + 2]= 1; |
128 | 128 |
129 c->src_incr= out_rate; | 129 c->src_incr= out_rate; |
130 c->ideal_dst_incr= c->dst_incr= in_rate * PHASE_COUNT; | 130 c->ideal_dst_incr= c->dst_incr= in_rate * PHASE_COUNT; |
131 c->index= -PHASE_COUNT*((c->filter_length-1)/2); | 131 c->index= -PHASE_COUNT*((c->filter_length-1)/2); |
132 | 132 |
168 int sample_index= index >> PHASE_SHIFT; | 168 int sample_index= index >> PHASE_SHIFT; |
169 int val=0; | 169 int val=0; |
170 | 170 |
171 if(sample_index < 0){ | 171 if(sample_index < 0){ |
172 for(i=0; i<c->filter_length; i++) | 172 for(i=0; i<c->filter_length; i++) |
173 val += src[ABS(sample_index + i)] * filter[i]; | 173 val += src[ABS(sample_index + i) % src_size] * filter[i]; |
174 }else if(sample_index + c->filter_length > src_size){ | 174 }else if(sample_index + c->filter_length > src_size){ |
175 break; | 175 break; |
176 }else{ | 176 }else{ |
177 #if 0 | 177 #if 0 |
178 int64_t v=0; | 178 int64_t v=0; |
197 if(frac >= c->src_incr){ | 197 if(frac >= c->src_incr){ |
198 frac -= c->src_incr; | 198 frac -= c->src_incr; |
199 index++; | 199 index++; |
200 } | 200 } |
201 } | 201 } |
202 *consumed= FFMAX(index, 0) >> PHASE_SHIFT; | |
203 index= FFMIN(index, 0); | |
204 | |
202 if(update_ctx){ | 205 if(update_ctx){ |
203 if(c->compensation_distance){ | 206 if(c->compensation_distance){ |
204 c->compensation_distance -= dst_index; | 207 c->compensation_distance -= dst_index; |
205 if(!c->compensation_distance) | 208 if(!c->compensation_distance) |
206 c->dst_incr= c->ideal_dst_incr; | 209 c->dst_incr= c->ideal_dst_incr; |
207 } | 210 } |
208 c->frac= frac; | 211 c->frac= frac; |
209 c->index=0; | 212 c->index= index; |
210 } | 213 } |
211 *consumed= index >> PHASE_SHIFT; | |
212 #if 0 | 214 #if 0 |
213 if(update_ctx && !c->compensation_distance){ | 215 if(update_ctx && !c->compensation_distance){ |
214 #undef rand | 216 #undef rand |
215 av_resample_compensate(c, rand() % (8000*2) - 8000, 8000*2); | 217 av_resample_compensate(c, rand() % (8000*2) - 8000, 8000*2); |
216 av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", c->dst_incr, c->ideal_dst_incr, c->compensation_distance); | 218 av_log(NULL, AV_LOG_DEBUG, "%d %d %d\n", c->dst_incr, c->ideal_dst_incr, c->compensation_distance); |