summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorReinhard Tartler <siretart@tauware.de>2010-05-21 18:32:58 +0000
committerReinhard Tartler <siretart@tauware.de>2010-05-21 18:32:58 +0000
commitdd92ff49c9b2d3b515238a525a3f94de7e891327 (patch)
tree5ee379f5f9fdd9d9c3a1fac2a3e2fd421655d90f /libavcodec
parentb12045c8c7676ba5cced050be2f7df60f1efc88a (diff)
Make lsf_sf_expand() 4 times faster.
backport r23096 by michael Originally committed as revision 23219 to svn://svn.ffmpeg.org/ffmpeg/branches/0.6
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/mpegaudiodec.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c
index 40383a8143..25fad80284 100644
--- a/libavcodec/mpegaudiodec.c
+++ b/libavcodec/mpegaudiodec.c
@@ -1315,23 +1315,32 @@ static int mp_decode_layer2(MPADecodeContext *s)
return 3 * 12;
}
-static inline void lsf_sf_expand(int *slen,
+#define SPLIT(dst,sf,n)\
+ if(n==3){\
+ int m= (sf*171)>>9;\
+ dst= sf - 3*m;\
+ sf=m;\
+ }else if(n==4){\
+ dst= sf&3;\
+ sf>>=2;\
+ }else if(n==5){\
+ int m= (sf*205)>>10;\
+ dst= sf - 5*m;\
+ sf=m;\
+ }else if(n==6){\
+ int m= (sf*171)>>10;\
+ dst= sf - 6*m;\
+ sf=m;\
+ }else{\
+ dst=0;\
+ }
+
+static av_always_inline void lsf_sf_expand(int *slen,
int sf, int n1, int n2, int n3)
{
- if (n3) {
- slen[3] = sf % n3;
- sf /= n3;
- } else {
- slen[3] = 0;
- }
- if (n2) {
- slen[2] = sf % n2;
- sf /= n2;
- } else {
- slen[2] = 0;
- }
- slen[1] = sf % n1;
- sf /= n1;
+ SPLIT(slen[3], sf, n3)
+ SPLIT(slen[2], sf, n2)
+ SPLIT(slen[1], sf, n1)
slen[0] = sf;
}