diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2003-02-03 18:45:25 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2003-02-03 18:45:25 +0000 |
commit | b2609d4cbd1f0b90262b5c8fbf2e8d37d8a7cfd2 (patch) | |
tree | adbe90c1816d22709e5e240dbceb196e848897eb /postproc/rgb2rgb_template.c | |
parent | 36df88058135607162d25b73cab93e19b0a8cb76 (diff) | |
download | ffmpeg-b2609d4cbd1f0b90262b5c8fbf2e8d37d8a7cfd2.tar.gz |
yuv9 -> yv12 bugfixes
Originally committed as revision 9257 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
Diffstat (limited to 'postproc/rgb2rgb_template.c')
-rw-r--r-- | postproc/rgb2rgb_template.c | 91 |
1 files changed, 52 insertions, 39 deletions
diff --git a/postproc/rgb2rgb_template.c b/postproc/rgb2rgb_template.c index 887856d9c7..da2396bed5 100644 --- a/postproc/rgb2rgb_template.c +++ b/postproc/rgb2rgb_template.c @@ -1619,16 +1619,20 @@ static inline void RENAME(planar2x)(const uint8_t *src, uint8_t *dst, int srcWid { int x,y; + dst[0]= src[0]; + // first line - for(x=0; x<srcWidth; x++){ - dst[2*x+0]= - dst[2*x+1]= src[x]; + for(x=0; x<srcWidth-1; x++){ + dst[2*x+1]= (3*src[x] + src[x+1])>>2; + dst[2*x+2]= ( src[x] + 3*src[x+1])>>2; } - dst+= dstStride; + dst[2*srcWidth-1]= src[srcWidth-1]; + + dst+= dstStride; for(y=1; y<srcHeight; y++){ #if defined (HAVE_MMX2) || defined (HAVE_3DNOW) - const int mmxSize= srcWidth; + const int mmxSize= srcWidth&~15; asm volatile( "movl %4, %%eax \n\t" "1: \n\t" @@ -1636,67 +1640,76 @@ static inline void RENAME(planar2x)(const uint8_t *src, uint8_t *dst, int srcWid "movq (%1, %%eax), %%mm1 \n\t" "movq 1(%0, %%eax), %%mm2 \n\t" "movq 1(%1, %%eax), %%mm3 \n\t" - "movq %%mm0, %%mm4 \n\t" - "movq %%mm1, %%mm5 \n\t" - PAVGB" %%mm3, %%mm0 \n\t" - PAVGB" %%mm3, %%mm0 \n\t" - PAVGB" %%mm4, %%mm3 \n\t" - PAVGB" %%mm4, %%mm3 \n\t" - PAVGB" %%mm2, %%mm1 \n\t" - PAVGB" %%mm2, %%mm1 \n\t" - PAVGB" %%mm5, %%mm2 \n\t" - PAVGB" %%mm5, %%mm2 \n\t" - "movq %%mm3, %%mm4 \n\t" - "movq %%mm2, %%mm5 \n\t" - "punpcklbw %%mm1, %%mm3 \n\t" - "punpckhbw %%mm1, %%mm4 \n\t" - "punpcklbw %%mm0, %%mm2 \n\t" - "punpckhbw %%mm0, %%mm5 \n\t" + "movq -1(%0, %%eax), %%mm4 \n\t" + "movq -1(%1, %%eax), %%mm5 \n\t" + PAVGB" %%mm0, %%mm5 \n\t" + PAVGB" %%mm0, %%mm3 \n\t" + PAVGB" %%mm0, %%mm5 \n\t" + PAVGB" %%mm0, %%mm3 \n\t" + PAVGB" %%mm1, %%mm4 \n\t" + PAVGB" %%mm1, %%mm2 \n\t" + PAVGB" %%mm1, %%mm4 \n\t" + PAVGB" %%mm1, %%mm2 \n\t" + "movq %%mm5, %%mm7 \n\t" + "movq %%mm4, %%mm6 \n\t" + "punpcklbw %%mm3, %%mm5 \n\t" + "punpckhbw %%mm3, %%mm7 \n\t" + "punpcklbw %%mm2, %%mm4 \n\t" + "punpckhbw %%mm2, %%mm6 \n\t" #if 1 - MOVNTQ" %%mm3, (%2, %%eax, 2) \n\t" - MOVNTQ" %%mm4, 8(%2, %%eax, 2) \n\t" - MOVNTQ" %%mm2, (%3, %%eax, 2) \n\t" - MOVNTQ" %%mm5, 8(%3, %%eax, 2) \n\t" + MOVNTQ" %%mm5, (%2, %%eax, 2) \n\t" + MOVNTQ" %%mm7, 8(%2, %%eax, 2) \n\t" + MOVNTQ" %%mm4, (%3, %%eax, 2) \n\t" + MOVNTQ" %%mm6, 8(%3, %%eax, 2) \n\t" #else - "movq %%mm3, (%2, %%eax, 2) \n\t" - "movq %%mm4, 8(%2, %%eax, 2) \n\t" - "movq %%mm2, (%3, %%eax, 2) \n\t" - "movq %%mm5, 8(%3, %%eax, 2) \n\t" + "movq %%mm5, (%2, %%eax, 2) \n\t" + "movq %%mm7, 8(%2, %%eax, 2) \n\t" + "movq %%mm4, (%3, %%eax, 2) \n\t" + "movq %%mm6, 8(%3, %%eax, 2) \n\t" #endif "addl $8, %%eax \n\t" " js 1b \n\t" - :: "r" (src + mmxSize-1), "r" (src + srcStride + mmxSize-1), + :: "r" (src + mmxSize ), "r" (src + srcStride + mmxSize ), "r" (dst + mmxSize*2), "r" (dst + dstStride + mmxSize*2), "g" (-mmxSize) : "%eax" ); - dst[0]= - dst[dstStride]= src[0]; #else - dst[0]= - dst[dstStride]= src[0]; + const int mmxSize=1; +#endif + dst[0 ]= (3*src[0] + src[srcStride])>>2; + dst[dstStride]= ( src[0] + 3*src[srcStride])>>2; - for(x=0; x<srcWidth-1; x++){ + for(x=mmxSize-1; x<srcWidth-1; x++){ dst[2*x +1]= (3*src[x+0] + src[x+srcStride+1])>>2; dst[2*x+dstStride+2]= ( src[x+0] + 3*src[x+srcStride+1])>>2; dst[2*x+dstStride+1]= ( src[x+1] + 3*src[x+srcStride ])>>2; dst[2*x +2]= (3*src[x+1] + src[x+srcStride ])>>2; } -#endif - dst[srcWidth*2 -1]= - dst[srcWidth*2 -1 + dstStride]= src[srcWidth-1]; + dst[srcWidth*2 -1 ]= (3*src[srcWidth-1] + src[srcWidth-1 + srcStride])>>2; + dst[srcWidth*2 -1 + dstStride]= ( src[srcWidth-1] + 3*src[srcWidth-1 + srcStride])>>2; dst+=dstStride*2; src+=srcStride; } - src-=srcStride; // last line +#if 1 + dst[0]= src[0]; + + for(x=0; x<srcWidth-1; x++){ + dst[2*x+1]= (3*src[x] + src[x+1])>>2; + dst[2*x+2]= ( src[x] + 3*src[x+1])>>2; + } + dst[2*srcWidth-1]= src[srcWidth-1]; +#else for(x=0; x<srcWidth; x++){ dst[2*x+0]= dst[2*x+1]= src[x]; } +#endif + #ifdef HAVE_MMX asm volatile( EMMS" \n\t" SFENCE" \n\t" |