diff postproc/postprocess_template.c @ 7960:0a4ab841ae29

better deblocking filter
author michael
date Tue, 29 Oct 2002 18:35:15 +0000
parents be43106d6329
children 0a5d69e6f2a2
line wrap: on
line diff
--- a/postproc/postprocess_template.c	Tue Oct 29 16:50:34 2002 +0000
+++ b/postproc/postprocess_template.c	Tue Oct 29 18:35:15 2002 +0000
@@ -56,8 +56,9 @@
 		"leal (%1, %2), %%eax				\n\t"
 //	0	1	2	3	4	5	6	7	8	9
 //	%1	eax	eax+%2	eax+2%2	%1+4%2	ecx	ecx+%2	ecx+2%2	%1+8%2	ecx+4%2
-		"movq %3, %%mm7					\n\t" // mm7 = 0x7F
-		"movq %4, %%mm6					\n\t" // mm6 = 0x7D
+		"movq %3, %%mm7					\n\t" 
+		"movq %4, %%mm6					\n\t" 
+
 		"movq (%1), %%mm0				\n\t"
 		"movq (%%eax), %%mm1				\n\t"
 		"psubb %%mm1, %%mm0				\n\t" // mm0 = differnece
@@ -119,7 +120,7 @@
 #endif
 		"movd %%mm0, %0					\n\t"
 		: "=r" (numEq)
-		: "r" (src), "r" (stride), "m" (c->mmxDcOffset), "m" (c->mmxDcThreshold)
+		: "r" (src), "r" (stride), "m" (c->mmxDcOffset[c->nonBQP]),  "m" (c->mmxDcThreshold[c->nonBQP])
 		: "%eax"
 		);
 	numEq= (-numEq) &0xFF;
@@ -150,6 +151,7 @@
 		);
 	return isOk==0;
 #else
+#if 1
 	int x;
 	const int QP= c->QP;
 	src+= stride*3;
@@ -159,6 +161,24 @@
 	}
 
 	return 1;
+#else
+	int x;
+	const int QP= c->QP;
+	src+= stride*4;
+	for(x=0; x<BLOCK_SIZE; x++)
+	{
+		int min=255;
+		int max=0;
+		int y;
+		for(y=0; y<8; y++){
+			int v= src[x + y*stride];
+			if(v>max) max=v;
+			if(v<min) min=v;
+		}
+		if(max-min > 2*QP) return 0;
+	}
+	return 1;
+#endif
 #endif
 }
 
@@ -2639,22 +2659,23 @@
 	int black=0, white=255; // blackest black and whitest white in the picture
 	int QPCorrecture= 256*256;
 
-	int copyAhead;
+	int copyAhead, i;
 
 	//FIXME remove
 	uint64_t * const yHistogram= c.yHistogram;
 	uint8_t * const tempSrc= c.tempSrc;
 	uint8_t * const tempDst= c.tempDst;
-
-	c.dcOffset= c.ppMode.maxDcDiff;
-	c.dcThreshold= c.ppMode.maxDcDiff*2 + 1;
+	const int mbWidth= isColor ? (width+7)>>3 : (width+15)>>4;
 
 #ifdef HAVE_MMX
-	c.mmxDcOffset= 0x7F - c.dcOffset;
-	c.mmxDcThreshold= 0x7F - c.dcThreshold;
-
-	c.mmxDcOffset*= 0x0101010101010101LL;
-	c.mmxDcThreshold*= 0x0101010101010101LL;
+	for(i=0; i<32; i++){
+		int offset= ((i*c.ppMode.baseDcDiff)>>8) + 1;
+		int threshold= offset*2 + 1;
+		c.mmxDcOffset[i]= 0x7F - offset;
+		c.mmxDcThreshold[i]= 0x7F - threshold;
+		c.mmxDcOffset[i]*= 0x0101010101010101LL;
+		c.mmxDcThreshold[i]*= 0x0101010101010101LL;
+	}
 #endif
 
 	if(mode & CUBIC_IPOL_DEINT_FILTER) copyAhead=16;
@@ -2814,11 +2835,8 @@
 		uint8_t *tempBlock1= c.tempBlocks;
 		uint8_t *tempBlock2= c.tempBlocks + 8;
 #endif
-#ifdef ARCH_X86
 		int *QPptr= isColor ? &QPs[(y>>3)*QPStride] :&QPs[(y>>4)*QPStride];
-		int QPDelta= isColor ? (-1) : 1<<31;
-		int QPFrac= 1<<30;
-#endif
+		int *nonBQPptr= isColor ? &c.nonBQPTable[(y>>3)*mbWidth] :&c.nonBQPTable[(y>>4)*mbWidth];
 		int QP=0;
 		/* can we mess with a 8x16 block from srcBlock/dstBlock downwards and 1 line upwards
 		   if not than use a temporary buffer */
@@ -2855,28 +2873,19 @@
 #ifdef HAVE_MMX
 			uint8_t *tmpXchg;
 #endif
-#ifdef ARCH_X86
-			QP= *QPptr;
-			asm volatile(
-				"addl %2, %1		\n\t"
-				"sbbl %%eax, %%eax	\n\t"
-				"shll $2, %%eax		\n\t"
-				"subl %%eax, %0		\n\t"
-				: "+r" (QPptr), "+m" (QPFrac)
-				: "r" (QPDelta)
-				: "%eax"
-			);
-#else
-			QP= isColor ?
-                                QPs[(y>>3)*QPStride + (x>>3)]:
-                                QPs[(y>>4)*QPStride + (x>>4)];
-#endif
-			if(!isColor)
+			if(isColor)
 			{
+				QP= QPptr[x>>3];
+				c.nonBQP= nonBQPptr[x>>3];
+			}
+			else
+			{
+				QP= QPptr[x>>4];
 				QP= (QP* QPCorrecture + 256*128)>>16;
+				c.nonBQP= nonBQPptr[x>>4];
+				c.nonBQP= (c.nonBQP* QPCorrecture + 256*128)>>16;
 				yHistogram[ srcBlock[srcStride*12 + 4] ]++;
 			}
-//printf("%d ", QP);
 			c.QP= QP;
 #ifdef HAVE_MMX
 			asm volatile(