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