summaryrefslogtreecommitdiff
path: root/libavcodec/dsputil.c
diff options
context:
space:
mode:
authorLoren Merritt <lorenm@u.washington.edu>2008-07-13 14:56:01 +0000
committerLoren Merritt <lorenm@u.washington.edu>2008-07-13 14:56:01 +0000
commitf27e1d645e609c01fbacfc2425818b56126df567 (patch)
tree37eb74cee17dfd256db399efd6047de8ca05670a /libavcodec/dsputil.c
parent6647ab80e36aa2484a145029141984843958b246 (diff)
simplify vorbis windowing
Originally committed as revision 14205 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/dsputil.c')
-rw-r--r--libavcodec/dsputil.c41
1 files changed, 33 insertions, 8 deletions
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c
index 9ec077e569..55929d0e76 100644
--- a/libavcodec/dsputil.c
+++ b/libavcodec/dsputil.c
@@ -3930,17 +3930,40 @@ void ff_vector_fmul_add_add_c(float *dst, const float *src0, const float *src1,
dst[i*step] = src0[i] * src1[i] + src2[i] + src3;
}
+void ff_vector_fmul_window_c(float *dst, const float *src0, const float *src1, const float *win, float add_bias, int len){
+ int i;
+ for(i=0; i<len; i++)
+ dst[i] = src0[i]*win[len-i-1] + src1[i]*win[i] + add_bias;
+}
+
+static av_always_inline int float_to_int16_one(const float *src){
+ int_fast32_t tmp = *(const int32_t*)src;
+ if(tmp & 0xf0000){
+ tmp = (0x43c0ffff - tmp)>>31;
+ // is this faster on some gcc/cpu combinations?
+// if(tmp > 0x43c0ffff) tmp = 0xFFFF;
+// else tmp = 0;
+ }
+ return tmp - 0x8000;
+}
+
void ff_float_to_int16_c(int16_t *dst, const float *src, long len){
int i;
- for(i=0; i<len; i++) {
- int_fast32_t tmp = ((const int32_t*)src)[i];
- if(tmp & 0xf0000){
- tmp = (0x43c0ffff - tmp)>>31;
- // is this faster on some gcc/cpu combinations?
-// if(tmp > 0x43c0ffff) tmp = 0xFFFF;
-// else tmp = 0;
+ for(i=0; i<len; i++)
+ dst[i] = float_to_int16_one(src+i);
+}
+
+void ff_float_to_int16_interleave_c(int16_t *dst, const float *src, long len, int channels){
+ int i,j,c;
+ if(channels==2){
+ for(i=0; i<len; i++){
+ dst[2*i] = float_to_int16_one(src+i);
+ dst[2*i+1] = float_to_int16_one(src+i+len);
}
- dst[i] = tmp - 0x8000;
+ }else{
+ for(c=0; c<channels; c++, src+=len)
+ for(i=0, j=c; i<len; i++, j+=channels)
+ dst[j] = float_to_int16_one(src+i);
}
}
@@ -4450,7 +4473,9 @@ void dsputil_init(DSPContext* c, AVCodecContext *avctx)
c->vector_fmul = vector_fmul_c;
c->vector_fmul_reverse = vector_fmul_reverse_c;
c->vector_fmul_add_add = ff_vector_fmul_add_add_c;
+ c->vector_fmul_window = ff_vector_fmul_window_c;
c->float_to_int16 = ff_float_to_int16_c;
+ c->float_to_int16_interleave = ff_float_to_int16_interleave_c;
c->add_int16 = add_int16_c;
c->sub_int16 = sub_int16_c;
c->scalarproduct_int16 = scalarproduct_int16_c;