OSDN Git Service

top row bugfix
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 29 Jan 2002 04:21:27 +0000 (04:21 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 29 Jan 2002 04:21:27 +0000 (04:21 +0000)
Originally committed as revision 4404 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc

postproc/postprocess_template.c

index 9191b0b..d589e02 100644 (file)
@@ -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
- * numLines must be a multiple of 4
  * levelFix == 0 -> dont touch the brighness & contrast
  */
 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))
        }
 }
 
+/**
+ * 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)
@@ -2740,11 +2764,8 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
        /* copy & deinterlace first row of blocks */
        y=-BLOCK_SIZE;
        {
-               //1% speedup if these are here instead of the inner loop
                uint8_t *srcBlock= &(src[y*srcStride]);
-               uint8_t *dstBlock= &(dst[y*dstStride]);
-
-               dstBlock= tempDst + dstStride;
+               uint8_t *dstBlock= tempDst + dstStride;
 
                // From this point on it is guranteed that we can read and write 16 lines downward
                // finish 1 block before the next otherwise we´ll might have a problem
@@ -2788,8 +2809,10 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
 */
 #endif
 
-                       RENAME(blockCopy)(dstBlock + dstStride*copyAhead, dstStride,
-                               srcBlock + srcStride*copyAhead, srcStride, mode & LEVEL_FIX);
+                       RENAME(blockCopy)(dstBlock + dstStride*8, dstStride,
+                               srcBlock + srcStride*8, srcStride, mode & LEVEL_FIX);
+
+                       RENAME(duplicate)(dstBlock + dstStride*8, dstStride);
 
                        if(mode & LINEAR_IPOL_DEINT_FILTER)
                                RENAME(deInterlaceInterpolateLinear)(dstBlock, dstStride);
@@ -2805,7 +2828,7 @@ static void RENAME(postProcess)(uint8_t src[], int srcStride, uint8_t dst[], int
                        dstBlock+=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)