Commit 4b6388d1 authored by Michael Niedermayer's avatar Michael Niedermayer

top row bugfix

Originally committed as revision 4404 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
parent d8863d37
...@@ -2446,7 +2446,6 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int ...@@ -2446,7 +2446,6 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
/** /**
* Copies a block from src to dst and fixes the blacklevel * Copies a block from src to dst and fixes the blacklevel
* numLines must be a multiple of 4
* levelFix == 0 -> dont touch the brighness & contrast * levelFix == 0 -> dont touch the brighness & contrast
*/ */
static inline void RENAME(blockCopy)(uint8_t dst[], int dstStride, uint8_t src[], int srcStride, static inline void RENAME(blockCopy)(uint8_t dst[], int dstStride, uint8_t src[], int srcStride,
...@@ -2570,6 +2569,31 @@ SIMPLE_CPY((%%eax, %2), (%%eax, %2, 2), (%%ebx, %3), (%%ebx, %3, 2)) ...@@ -2570,6 +2569,31 @@ SIMPLE_CPY((%%eax, %2), (%%eax, %2, 2), (%%ebx, %3), (%%ebx, %3, 2))
} }
} }
/**
* Duplicates the given 8 src pixels ? times upward
*/
static inline void RENAME(duplicate)(uint8_t src[], int stride)
{
#ifdef HAVE_MMX
asm volatile(
"movq (%0), %%mm0 \n\t"
"addl %1, %0 \n\t"
"movq %%mm0, (%0) \n\t"
"movq %%mm0, (%0, %1) \n\t"
"movq %%mm0, (%0, %1, 2) \n\t"
: "+r" (src)
: "r" (-stride)
);
#else
int i;
uint8_t *p=src;
for(i=0; i<3; i++)
{
p-= stride;
memcpy(p, src, 8);
}
#endif
}
/** /**
* Filters array of bytes (Y or U or V values) * Filters array of bytes (Y or U or V values)
...@@ -2740,11 +2764,8 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int ...@@ -2740,11 +2764,8 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
/* copy & deinterlace first row of blocks */ /* copy & deinterlace first row of blocks */
y=-BLOCK_SIZE; y=-BLOCK_SIZE;
{ {
//1% speedup if these are here instead of the inner loop
uint8_t *srcBlock= &(src[y*srcStride]); uint8_t *srcBlock= &(src[y*srcStride]);
uint8_t *dstBlock= &(dst[y*dstStride]); uint8_t *dstBlock= tempDst + dstStride;
dstBlock= tempDst + dstStride;
// From this point on it is guranteed that we can read and write 16 lines downward // From this point on it is guranteed that we can read and write 16 lines downward
// finish 1 block before the next otherwise well might have a problem // finish 1 block before the next otherwise well might have a problem
...@@ -2788,8 +2809,10 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int ...@@ -2788,8 +2809,10 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
*/ */
#endif #endif
RENAME(blockCopy)(dstBlock + dstStride*copyAhead, dstStride, RENAME(blockCopy)(dstBlock + dstStride*8, dstStride,
srcBlock + srcStride*copyAhead, srcStride, mode & LEVEL_FIX); srcBlock + srcStride*8, srcStride, mode & LEVEL_FIX);
RENAME(duplicate)(dstBlock + dstStride*8, dstStride);
if(mode & LINEAR_IPOL_DEINT_FILTER) if(mode & LINEAR_IPOL_DEINT_FILTER)
RENAME(deInterlaceInterpolateLinear)(dstBlock, dstStride); RENAME(deInterlaceInterpolateLinear)(dstBlock, dstStride);
...@@ -2805,7 +2828,7 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int ...@@ -2805,7 +2828,7 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
dstBlock+=8; dstBlock+=8;
srcBlock+=8; srcBlock+=8;
} }
memcpy(&(dst[y*dstStride]) + 8*dstStride, tempDst + 9*dstStride, copyAhead*dstStride ); memcpy(dst, tempDst + 9*dstStride, copyAhead*dstStride );
} }
for(y=0; y<height; y+=BLOCK_SIZE) for(y=0; y<height; y+=BLOCK_SIZE)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment