changeset 181:edc5f6cf1855 libavcodec

customizeable deblocking (2 thresholds) chrominance & luminance filtering is the default now if -npp ...:y isnt specified (lumi only was only used for the deinterlacers and that was wrong anyway)
author michael
date Fri, 28 Dec 2001 00:09:55 +0000
parents fc656a23b35a
children 3ccd74a91074
files libpostproc/postprocess.c libpostproc/postprocess_template.c
diffstat 2 files changed, 59 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/libpostproc/postprocess.c	Wed Dec 26 23:31:30 2001 +0000
+++ b/libpostproc/postprocess.c	Fri Dec 28 00:09:55 2001 +0000
@@ -125,8 +125,8 @@
 static uint64_t __attribute__((aligned(8))) bFF= 		0xFFFFFFFFFFFFFFFFLL;
 static uint64_t __attribute__((aligned(8))) b20= 		0x2020202020202020LL;
 static uint64_t __attribute__((aligned(8))) b80= 		0x8080808080808080LL;
-static uint64_t __attribute__((aligned(8))) b7E= 		0x7E7E7E7E7E7E7E7ELL;
-static uint64_t __attribute__((aligned(8))) b7C= 		0x7C7C7C7C7C7C7C7CLL;
+static uint64_t __attribute__((aligned(8))) mmxDCOffset= 	0x7E7E7E7E7E7E7E7ELL;
+static uint64_t __attribute__((aligned(8))) mmxDCThreshold=	0x7C7C7C7C7C7C7C7CLL;
 static uint64_t __attribute__((aligned(8))) b3F= 		0x3F3F3F3F3F3F3F3FLL;
 static uint64_t __attribute__((aligned(8))) temp0=0;
 static uint64_t __attribute__((aligned(8))) temp1=0;
@@ -153,6 +153,9 @@
 int vFlatnessThreshold= 56 - 16;
 int deringThreshold= 20;
 
+static int dcOffset= 1;
+static int dcThreshold= 3;
+
 //amount of "black" u r willing to loose to get a brightness corrected picture
 double maxClippedThreshold= 0.01;
 
@@ -169,10 +172,10 @@
 	{"v1", "x1vdeblock", 		1, 2, 4, V_X1_FILTER},
 	{"dr", "dering", 		1, 5, 6, DERING},
 	{"al", "autolevels", 		0, 1, 2, LEVEL_FIX},
-	{"lb", "linblenddeint", 	0, 1, 6, LINEAR_BLEND_DEINT_FILTER},
-	{"li", "linipoldeint", 		0, 1, 6, LINEAR_IPOL_DEINT_FILTER},
-	{"ci", "cubicipoldeint",	0, 1, 6, CUBIC_IPOL_DEINT_FILTER},
-	{"md", "mediandeint", 		0, 1, 6, MEDIAN_DEINT_FILTER},
+	{"lb", "linblenddeint", 	1, 1, 4, LINEAR_BLEND_DEINT_FILTER},
+	{"li", "linipoldeint", 		1, 1, 4, LINEAR_IPOL_DEINT_FILTER},
+	{"ci", "cubicipoldeint",	1, 1, 4, CUBIC_IPOL_DEINT_FILTER},
+	{"md", "mediandeint", 		1, 1, 4, MEDIAN_DEINT_FILTER},
 	{"tn", "tmpnoise", 		1, 7, 8, TEMP_NOISE_FILTER},
 	{NULL, NULL,0,0,0,0} //End Marker
 };
@@ -193,7 +196,7 @@
  packedYOffset + packedYScale + w05 + w20 + w1400 + bm00000001 + bm00010000
  + bm00001000 + bm10000000 + bm10000001 + bm11000011 + bm00000011 + bm11111110
  + bm11000000 + bm00011000 + bm00110011 + bm11001100 + b00 + b01 + b02 + b0F
- + bFF + b20 + b04+ b08 + pQPb2 + b80 + b7E + b7C + b3F + temp0 + temp1 + temp2 + temp3 + temp4
+ + bFF + b20 + b04+ b08 + pQPb2 + b80 + mmxDCOffset + mmxDCThreshold + b3F + temp0 + temp1 + temp2 + temp3 + temp4
  + temp5 + pQPb== 0) b00=0;
 }
 #endif
@@ -251,13 +254,13 @@
 	int y;
 	for(y=0; y<BLOCK_SIZE; y++)
 	{
-		if(((src[0] - src[1] + 1) & 0xFFFF) < 3) numEq++;
-		if(((src[1] - src[2] + 1) & 0xFFFF) < 3) numEq++;
-		if(((src[2] - src[3] + 1) & 0xFFFF) < 3) numEq++;
-		if(((src[3] - src[4] + 1) & 0xFFFF) < 3) numEq++;
-		if(((src[4] - src[5] + 1) & 0xFFFF) < 3) numEq++;
-		if(((src[5] - src[6] + 1) & 0xFFFF) < 3) numEq++;
-		if(((src[6] - src[7] + 1) & 0xFFFF) < 3) numEq++;
+		if(((src[0] - src[1] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
+		if(((src[1] - src[2] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
+		if(((src[2] - src[3] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
+		if(((src[3] - src[4] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
+		if(((src[4] - src[5] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
+		if(((src[5] - src[6] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
+		if(((src[6] - src[7] + dcOffset) & 0xFFFF) < dcThreshold) numEq++;
 		src+= stride;
 	}
 	return numEq > hFlatnessThreshold;
@@ -539,8 +542,12 @@
 *	*		a	autoq		cpu power dependant enabler
 			c	chrom		chrominance filtring enabled
 			y	nochrom		chrominance filtring disabled
-hb	hdeblock				horizontal deblocking filter
-vb	vdeblock				vertical deblocking filter
+hb	hdeblock	(2 Threshold)		horizontal deblocking filter
+                         1. Threshold: default is 1, higher means stronger deblocking
+                         2. Threshold: default is 40, lower means stronger deblocking
+			the horizontal & vertical deblocking filters share these 
+			so u cant set different thresholds for h / v
+vb	vdeblock	(2 Threshold)		vertical deblocking filter
 hr	rkhdeblock
 vr	rkvdeblock
 h1	x1hdeblock				Experimental horizontal deblock filter 1
@@ -555,6 +562,7 @@
 de	default					hdeblock:a,vdeblock:a,dering:a,autolevels
 fa	fast					x1hdeblock:a,x1vdeblock:a,dering:a,autolevels
 tn	tmpnoise	(3 Thresholds)		Temporal Noise Reducer
+			1. <= 2. <= 3. Threshold, larger means stronger filtering
 */
 
 /**
@@ -693,6 +701,31 @@
 						}
 					}
 				}
+				else if(filters[i].mask == V_DEBLOCK || filters[i].mask == H_DEBLOCK)
+				{
+					int o;
+
+					for(o=0; options[o]!=NULL && o<2; o++)
+					{
+						char *tail;
+						int val= strtol(options[o], &tail, 0);
+						if(tail==options[o]) break;
+
+						numOfUnknownOptions--;
+						if(o==0)
+						{
+							dcOffset= val;
+							dcThreshold= 2*val+1;
+							mmxDCOffset= 0x7F - val;
+							mmxDCThreshold= 0x7F - 2*val - 1;
+							
+							mmxDCOffset*= 0x0101010101010101LL;
+							mmxDCThreshold*= 0x0101010101010101LL;
+						}  
+						else hFlatnessThreshold=
+						     vFlatnessThreshold= val;
+					}
+				}
 			}
 		}
 		if(!filterNameOk) ppMode.error++;
--- a/libpostproc/postprocess_template.c	Wed Dec 26 23:31:30 2001 +0000
+++ b/libpostproc/postprocess_template.c	Fri Dec 28 00:09:55 2001 +0000
@@ -60,8 +60,8 @@
 		"leal (%%eax, %2, 4), %%ebx			\n\t"
 //	0	1	2	3	4	5	6	7	8	9
 //	%1	eax	eax+%2	eax+2%2	%1+4%2	ebx	ebx+%2	ebx+2%2	%1+8%2	ebx+4%2
-		"movq b7E, %%mm7					\n\t" // mm7 = 0x7F
-		"movq b7C, %%mm6					\n\t" // mm6 = 0x7D
+		"movq mmxDCOffset, %%mm7			\n\t" // mm7 = 0x7F
+		"movq mmxDCThreshold, %%mm6			\n\t" // mm6 = 0x7D
 		"movq (%1), %%mm0				\n\t"
 		"movq (%%eax), %%mm1				\n\t"
 		"psubb %%mm1, %%mm0				\n\t" // mm0 = differnece
@@ -129,14 +129,14 @@
 #else
 	for(y=0; y<BLOCK_SIZE-1; y++)
 	{
-		if(((src[0] - src[0+stride] + 1)&0xFFFF) < 3) numEq++;
-		if(((src[1] - src[1+stride] + 1)&0xFFFF) < 3) numEq++;
-		if(((src[2] - src[2+stride] + 1)&0xFFFF) < 3) numEq++;
-		if(((src[3] - src[3+stride] + 1)&0xFFFF) < 3) numEq++;
-		if(((src[4] - src[4+stride] + 1)&0xFFFF) < 3) numEq++;
-		if(((src[5] - src[5+stride] + 1)&0xFFFF) < 3) numEq++;
-		if(((src[6] - src[6+stride] + 1)&0xFFFF) < 3) numEq++;
-		if(((src[7] - src[7+stride] + 1)&0xFFFF) < 3) numEq++;
+		if(((src[0] - src[0+stride] + dcOffset)&0xFFFF) < dcThreshold) numEq++;
+		if(((src[1] - src[1+stride] + dcOffset)&0xFFFF) < dcThreshold) numEq++;
+		if(((src[2] - src[2+stride] + dcOffset)&0xFFFF) < dcThreshold) numEq++;
+		if(((src[3] - src[3+stride] + dcOffset)&0xFFFF) < dcThreshold) numEq++;
+		if(((src[4] - src[4+stride] + dcOffset)&0xFFFF) < dcThreshold) numEq++;
+		if(((src[5] - src[5+stride] + dcOffset)&0xFFFF) < dcThreshold) numEq++;
+		if(((src[6] - src[6+stride] + dcOffset)&0xFFFF) < dcThreshold) numEq++;
+		if(((src[7] - src[7+stride] + dcOffset)&0xFFFF) < dcThreshold) numEq++;
 		src+= stride;
 	}
 #endif