diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2001-10-30 20:30:24 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2001-10-30 20:30:24 +0000 |
commit | 1faf08670914df06b8f1ad34db57af319895ca43 (patch) | |
tree | 265996dfdc2d36b825b5caa290387429cb9f74d3 | |
parent | 51da31f16b12c96111441f87ed4bc33bb6966d8a (diff) | |
download | ffmpeg-1faf08670914df06b8f1ad34db57af319895ca43.tar.gz |
bugfixes
small speedup for the non x86 stuff
Originally committed as revision 2567 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
-rw-r--r-- | postproc/swscale.c | 16 | ||||
-rw-r--r-- | postproc/swscale_template.c | 16 |
2 files changed, 18 insertions, 14 deletions
diff --git a/postproc/swscale.c b/postproc/swscale.c index 2d68bfd4f5..c98ffcef62 100644 --- a/postproc/swscale.c +++ b/postproc/swscale.c @@ -33,6 +33,7 @@ Special versions: fast Y 1:1 scaling (no interpolation in y direction) TODO more intelligent missalignment avoidance for the horizontal scaler +bicubic scaler */ #define ABS(a) ((a) > 0 ? (a) : (-(a))) @@ -912,7 +913,6 @@ static inline void hyscale(uint16_t *dst, int dstWidth, uint8_t *src, int srcWid unsigned int xpos=0; // *** horizontal scale Y line to temp buffer #ifdef ARCH_X86 - #ifdef HAVE_MMX2 if(canMMX2BeUsed) { @@ -1012,7 +1012,7 @@ FUNNY_Y_CODE for(i=0;i<dstWidth;i++){ register unsigned int xx=xpos>>16; register unsigned int xalpha=(xpos&0xFFFF)>>9; - dst[i]=(src[xx]*(xalpha^127)+src[xx+1]*xalpha); + dst[i]= (src[xx]<<7) + (src[xx+1] - src[xx])*xalpha; xpos+=xInc; } #endif @@ -1068,8 +1068,6 @@ FUNNYUVCODE FUNNYUVCODE FUNNYUVCODE FUNNYUVCODE - - "xorl %%eax, %%eax \n\t" // i "movl %6, %%esi \n\t" // src "movl %1, %%edi \n\t" // buf1 @@ -1143,6 +1141,10 @@ FUNNYUVCODE register unsigned int xalpha=(xpos&0xFFFF)>>9; dst[i]=(src1[xx]*(xalpha^127)+src1[xx+1]*xalpha); dst[i+2048]=(src2[xx]*(xalpha^127)+src2[xx+1]*xalpha); +/* slower + dst[i]= (src1[xx]<<7) + (src1[xx+1] - src1[xx])*xalpha; + dst[i+2048]=(src2[xx]<<7) + (src2[xx+1] - src2[xx])*xalpha; +*/ xpos+=xInc; } #endif @@ -1195,8 +1197,8 @@ canMMX2BeUsed= (s_xinc <= 0x10000 && (dstw&31)==0 && (srcWidth&15)==0) ? 1 : 0; if(canMMX2BeUsed) s_xinc+= 20; else s_xinc = ((srcWidth-2)<<16)/(dstw-2) - 20; -if(fullUVIpol && !dstbpp==12) s_xinc2= s_xinc>>1; -else s_xinc2= s_xinc; +if(fullUVIpol && !(dstbpp==12)) s_xinc2= s_xinc>>1; +else s_xinc2= s_xinc; // force calculation of the horizontal interpolation of the first line if(y==0){ @@ -1440,7 +1442,7 @@ else s_xinc2= s_xinc; #ifdef HAVE_MMX __asm __volatile(SFENCE:::"memory"); - __asm __volatile(EMMS); + __asm __volatile(EMMS:::"memory"); #endif } diff --git a/postproc/swscale_template.c b/postproc/swscale_template.c index 2d68bfd4f5..c98ffcef62 100644 --- a/postproc/swscale_template.c +++ b/postproc/swscale_template.c @@ -33,6 +33,7 @@ Special versions: fast Y 1:1 scaling (no interpolation in y direction) TODO more intelligent missalignment avoidance for the horizontal scaler +bicubic scaler */ #define ABS(a) ((a) > 0 ? (a) : (-(a))) @@ -912,7 +913,6 @@ static inline void hyscale(uint16_t *dst, int dstWidth, uint8_t *src, int srcWid unsigned int xpos=0; // *** horizontal scale Y line to temp buffer #ifdef ARCH_X86 - #ifdef HAVE_MMX2 if(canMMX2BeUsed) { @@ -1012,7 +1012,7 @@ FUNNY_Y_CODE for(i=0;i<dstWidth;i++){ register unsigned int xx=xpos>>16; register unsigned int xalpha=(xpos&0xFFFF)>>9; - dst[i]=(src[xx]*(xalpha^127)+src[xx+1]*xalpha); + dst[i]= (src[xx]<<7) + (src[xx+1] - src[xx])*xalpha; xpos+=xInc; } #endif @@ -1068,8 +1068,6 @@ FUNNYUVCODE FUNNYUVCODE FUNNYUVCODE FUNNYUVCODE - - "xorl %%eax, %%eax \n\t" // i "movl %6, %%esi \n\t" // src "movl %1, %%edi \n\t" // buf1 @@ -1143,6 +1141,10 @@ FUNNYUVCODE register unsigned int xalpha=(xpos&0xFFFF)>>9; dst[i]=(src1[xx]*(xalpha^127)+src1[xx+1]*xalpha); dst[i+2048]=(src2[xx]*(xalpha^127)+src2[xx+1]*xalpha); +/* slower + dst[i]= (src1[xx]<<7) + (src1[xx+1] - src1[xx])*xalpha; + dst[i+2048]=(src2[xx]<<7) + (src2[xx+1] - src2[xx])*xalpha; +*/ xpos+=xInc; } #endif @@ -1195,8 +1197,8 @@ canMMX2BeUsed= (s_xinc <= 0x10000 && (dstw&31)==0 && (srcWidth&15)==0) ? 1 : 0; if(canMMX2BeUsed) s_xinc+= 20; else s_xinc = ((srcWidth-2)<<16)/(dstw-2) - 20; -if(fullUVIpol && !dstbpp==12) s_xinc2= s_xinc>>1; -else s_xinc2= s_xinc; +if(fullUVIpol && !(dstbpp==12)) s_xinc2= s_xinc>>1; +else s_xinc2= s_xinc; // force calculation of the horizontal interpolation of the first line if(y==0){ @@ -1440,7 +1442,7 @@ else s_xinc2= s_xinc; #ifdef HAVE_MMX __asm __volatile(SFENCE:::"memory"); - __asm __volatile(EMMS); + __asm __volatile(EMMS:::"memory"); #endif } |