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);