summaryrefslogtreecommitdiffstats
path: root/postproc
diff options
context:
space:
mode:
authormichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-10-30 20:30:24 +0000
committermichael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-10-30 20:30:24 +0000
commit5fabe5dfe42bc607877cb14ec987f40232168c37 (patch)
treef1668754c501db5904c17f40e288590c1d6d530b /postproc
parentf395431b7d01ed9c311fc53a458eb0434e037936 (diff)
downloadmpv-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.c16
-rw-r--r--postproc/swscale_template.c16
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
}