diff options
author | michael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-10-30 20:30:24 +0000 |
---|---|---|
committer | michael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-10-30 20:30:24 +0000 |
commit | 5fabe5dfe42bc607877cb14ec987f40232168c37 (patch) | |
tree | f1668754c501db5904c17f40e288590c1d6d530b /postproc | |
parent | f395431b7d01ed9c311fc53a458eb0434e037936 (diff) | |
download | mpv-5fabe5dfe42bc607877cb14ec987f40232168c37.tar.bz2 mpv-5fabe5dfe42bc607877cb14ec987f40232168c37.tar.xz |
bugfixes
small speedup for the non x86 stuff
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2567 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to '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 } |