Mercurial > libavcodec.hg
comparison resample2.c @ 4707:441cded6920c libavcodec
optimize linear filter coeff interpolation code, this also makes the code less prone to overflows
author | michael |
---|---|
date | Thu, 22 Mar 2007 11:10:30 +0000 |
parents | 07f7ca450695 |
children | 0ebf322d148e |
comparison
equal
deleted
inserted
replaced
4706:1d8b06947276 | 4707:441cded6920c |
---|---|
266 for(i=0; i<c->filter_length; i++) | 266 for(i=0; i<c->filter_length; i++) |
267 val += src[FFABS(sample_index + i) % src_size] * filter[i]; | 267 val += src[FFABS(sample_index + i) % src_size] * filter[i]; |
268 }else if(sample_index + c->filter_length > src_size){ | 268 }else if(sample_index + c->filter_length > src_size){ |
269 break; | 269 break; |
270 }else if(c->linear){ | 270 }else if(c->linear){ |
271 int64_t v=0; | 271 FELEM2 v2=0; |
272 int sub_phase= (frac<<8) / c->src_incr; | |
273 for(i=0; i<c->filter_length; i++){ | 272 for(i=0; i<c->filter_length; i++){ |
274 FELEML coeff= filter[i]*(256 - sub_phase) + filter[i + c->filter_length]*sub_phase; | 273 val += src[sample_index + i] * (FELEM2)filter[i]; |
275 v += src[sample_index + i] * coeff; | 274 v2 += src[sample_index + i] * (FELEM2)filter[i + c->filter_length]; |
276 } | 275 } |
277 val= v>>8; | 276 val+=(v2-val)*(FELEML)frac / c->src_incr; |
278 }else{ | 277 }else{ |
279 for(i=0; i<c->filter_length; i++){ | 278 for(i=0; i<c->filter_length; i++){ |
280 val += src[sample_index + i] * (FELEM2)filter[i]; | 279 val += src[sample_index + i] * (FELEM2)filter[i]; |
281 } | 280 } |
282 } | 281 } |