1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-21 10:55:51 +02:00

yuv9 -> yv12 bugfixes

Originally committed as revision 9257 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
This commit is contained in:
Michael Niedermayer 2003-02-03 18:45:25 +00:00
parent 36df880581
commit b2609d4cbd

View File

@ -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"