summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2005-05-30 15:03:06 +0000
committerMichael Niedermayer <michaelni@gmx.at>2005-05-30 15:03:06 +0000
commitde312e51d0797f679ede9d1aa6cfd0fa063e0337 (patch)
tree2e1d78582dd015f93c8546791afd22dc4b53168f
parentf56f96d80f59a06e8214aa98e5024d3e10ccef4f (diff)
optimizations
Originally committed as revision 4320 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/vorbis.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/libavcodec/vorbis.c b/libavcodec/vorbis.c
index d1a09d5335..d0f3c9c92c 100644
--- a/libavcodec/vorbis.c
+++ b/libavcodec/vorbis.c
@@ -1188,7 +1188,7 @@ static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, uint_fa
}
// Decode the audio packet using the functions above
-#define BIAS 384
+#define BIAS 385
static int vorbis_parse_audio_packet(vorbis_context *vc) {
GetBitContext *gb=&vc->gb;
@@ -1342,27 +1342,34 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) {
}
retlen=vc->blocksize_1/2;
} else {
+ buf += (vc->blocksize_1-vc->blocksize_0)/4;
for(k=j, i=0;i<vc->blocksize_0/2;++i, k+=step) {
- ret[k]=saved[i]+buf[(vc->blocksize_1-vc->blocksize_0)/4+i]*swin[i]+BIAS;
+ ret[k]=saved[i]+buf[i]*swin[i]+BIAS;
}
+ buf += vc->blocksize_0/2;
for(i=0;i<(vc->blocksize_1-vc->blocksize_0)/4;++i, k+=step) {
- ret[k]=buf[vc->blocksize_0/2+(vc->blocksize_1-vc->blocksize_0)/4+i]+BIAS;
+ ret[k]=buf[i]+BIAS;
}
+ buf=vc->buf;
retlen=vc->blocksize_0/2+(vc->blocksize_1-vc->blocksize_0)/4;
}
// -- save
if (next_window) {
+ buf += vc->blocksize_1/2;
+ lwin += vc->blocksize_1/2-1;
for(i=0;i<vc->blocksize_1/2;++i) {
- saved[i]=buf[vc->blocksize_1/2+i]*lwin[vc->blocksize_1/2-1-i];
+ saved[i]=buf[i]*lwin[-i];
}
saved_start=0;
} else {
saved_start=(vc->blocksize_1-vc->blocksize_0)/4;
+ buf += vc->blocksize_1/2;
for(i=0;i<saved_start;++i) {
- saved[i]=buf[vc->blocksize_1/2+i];
+ saved[i]=buf[i];
}
+ swin += vc->blocksize_0/2-1;
for(i=0;i<vc->blocksize_0/2;++i) {
- saved[saved_start+i]=buf[vc->blocksize_1/2+saved_start+i]*swin[vc->blocksize_0/2-1-i];
+ saved[saved_start+i]=buf[saved_start+i]*swin[-i];
}
}
} else {
@@ -1375,8 +1382,10 @@ static int vorbis_parse_audio_packet(vorbis_context *vc) {
}
retlen=saved_start+vc->blocksize_0/2;
// -- save
+ buf += vc->blocksize_0/2;
+ swin += vc->blocksize_0/2-1;
for(i=0;i<vc->blocksize_0/2;++i) {
- saved[i]=buf[vc->blocksize_0/2+i]*swin[vc->blocksize_0/2-1-i];
+ saved[i]=buf[i]*swin[-i];
}
saved_start=0;
}
@@ -1422,11 +1431,12 @@ static int vorbis_decode_frame(AVCodecContext *avccontext,
for(i=0;i<len;++i) {
int_fast32_t tmp= ((int32_t*)vc->ret)[i];
- if(tmp > 0x43c07fff)
- tmp= 32767;
- else if(tmp < 0x43bf8000)
- tmp= -32768;
- ((int16_t*)data)[i]=tmp;
+ if(tmp & 0xf0000){
+// tmp= (0x43c0ffff - tmp)>>31; //ask gcc devs why this is slower
+ if(tmp > 0x43c0ffff) tmp= 0xFFFF;
+ else tmp= 0;
+ }
+ ((int16_t*)data)[i]=tmp - 0x8000;
}
*data_size=len*2;