[prev in list] [next in list] [prev in thread] [next in thread]
List: xine-devel
Subject: Re: [xine-devel] [PATCH] new xine deinterlacer plugin (tvtime)
From: Miguel Freitas <miguel () cetuc ! puc-rio ! br>
Date: 2003-06-18 1:36:38
[Download RAW message or body]
On Tue, 2003-06-17 at 18:47, James Slorach wrote:
> It makes a significant improvement, but still looks worse than the
> progressively upsampled version, especially on diagonal edges between red
> and green.
ok, i just changed it a bit to filter more agressively. i don't know the
response of this filter but it looks a little better. what do you think?
patch attached (and commited)
regards,
Miguel
["vfilter_332.patch" (vfilter_332.patch)]
Index: speedy.c
===================================================================
RCS file: /cvsroot/xine/xine-lib/src/post/deinterlace/speedy.c,v
retrieving revision 1.4
diff -u -r1.4 speedy.c
--- speedy.c 17 Jun 2003 17:14:13 -0000 1.4
+++ speedy.c 18 Jun 2003 01:26:47 -0000
@@ -70,7 +70,9 @@
unsigned int (*diff_factor_packed422_scanline)( uint8_t *cur, uint8_t *old, int \
width ); unsigned int (*comb_factor_packed422_scanline)( uint8_t *top, uint8_t *mid,
uint8_t *bot, int width );
-void (*linearblend_chroma_packed422_scanline)( uint8_t *output, int width,
+void (*vfilter_chroma_121_packed422_scanline)( uint8_t *output, int width,
+ uint8_t *m, uint8_t *t, uint8_t *b);
+void (*vfilter_chroma_332_packed422_scanline)( uint8_t *output, int width,
uint8_t *m, uint8_t *t, uint8_t *b);
void (*kill_chroma_packed422_inplace_scanline)( uint8_t *data, int width );
void (*mirror_packed422_inplace_scanline)( uint8_t *data, int width );
@@ -523,7 +525,7 @@
}
}
-static void linearblend_chroma_packed422_scanline_mmx( uint8_t *output, int width,
+static void vfilter_chroma_121_packed422_scanline_mmx( uint8_t *output, int width,
uint8_t *m, uint8_t *t, \
uint8_t *b) {
#ifdef ARCH_X86
@@ -569,21 +571,99 @@
b += 8;
m += 8;
}
+ output++; t++; b++; m++;
+ while( width-- ) {
+ *output = (*t + *b + (*m << 1)) >> 2;
+ output+=2; t+=2; b+=2; m+=2;
+ }
+
+ emms();
+#endif
+}
+
+
+static void vfilter_chroma_121_packed422_scanline_c( uint8_t *output, int width,
+ uint8_t *m, uint8_t *t, uint8_t \
*b) +{
+ output++; t++; b++; m++;
+ while( width-- ) {
+ *output = (*t + *b + (*m << 1)) >> 2;
+ output+=2; t+=2; b+=2; m+=2;
+ }
+}
+
+
+static void vfilter_chroma_332_packed422_scanline_mmx( uint8_t *output, int width,
+ uint8_t *m, uint8_t *t, \
uint8_t *b) +{
+#ifdef ARCH_X86
+ int i;
+ const mmx_t ymask = { 0x00ff00ff00ff00ffULL };
+ const mmx_t cmask = { 0xff00ff00ff00ff00ULL };
+
+ // Get width in bytes.
+ width *= 2;
+ i = width / 8;
+ width -= i * 8;
+
+ movq_m2r( ymask, mm7 );
+ movq_m2r( cmask, mm6 );
+
+ while( i-- ) {
+ movq_m2r( *t, mm0 );
+ movq_m2r( *b, mm1 );
+ movq_m2r( *m, mm2 );
+
+ movq_r2r ( mm2, mm3 );
+ pand_r2r ( mm7, mm3 );
+
+ pand_r2r ( mm6, mm0 );
+ pand_r2r ( mm6, mm1 );
+ pand_r2r ( mm6, mm2 );
+
+ psrlq_i2r( 8, mm0 );
+ psrlq_i2r( 7, mm1 );
+ psrlq_i2r( 8, mm2 );
+
+ movq_r2r ( mm0, mm4 );
+ psllw_i2r( 1, mm4 );
+ paddw_r2r( mm4, mm0 );
+
+ movq_r2r ( mm2, mm4 );
+ psllw_i2r( 1, mm4 );
+ paddw_r2r( mm4, mm2 );
+
+ paddw_r2r( mm0, mm2 );
+ paddw_r2r( mm1, mm2 );
+
+ psllw_i2r( 5, mm2 );
+ pand_r2r( mm6, mm2 );
+
+ por_r2r ( mm3, mm2 );
+
+ movq_r2m( mm2, *output );
+ output += 8;
+ t += 8;
+ b += 8;
+ m += 8;
+ }
+ output++; t++; b++; m++;
while( width-- ) {
- output++; t++; b++; m++;
- *output++ = (*t++ + *b++ + (*m++ << 1)) >> 2;
+ *output = (3 * *t + 3 * *m + 2 * *b) >> 3;
+ output+=2; t+=2; b+=2; m+=2;
}
emms();
#endif
}
-static void linearblend_chroma_packed422_scanline_c( uint8_t *output, int width,
+static void vfilter_chroma_332_packed422_scanline_c( uint8_t *output, int width,
uint8_t *m, uint8_t *t, uint8_t \
*b) {
+ output++; t++; b++; m++;
while( width-- ) {
- output++; t++; b++; m++;
- *output++ = (*t++ + *b++ + (*m++ << 1)) >> 2;
+ *output = (3 * *t + 3 * *m + 2 * *b) >> 3;
+ output+=2; t+=2; b+=2; m+=2;
}
}
@@ -2082,7 +2162,8 @@
filter_luma_14641_packed422_inplace_scanline = \
filter_luma_14641_packed422_inplace_scanline_c; comb_factor_packed422_scanline = 0;
diff_factor_packed422_scanline = diff_factor_packed422_scanline_c;
- linearblend_chroma_packed422_scanline = linearblend_chroma_packed422_scanline_c;
+ vfilter_chroma_121_packed422_scanline = vfilter_chroma_121_packed422_scanline_c;
+ vfilter_chroma_332_packed422_scanline = vfilter_chroma_332_packed422_scanline_c;
kill_chroma_packed422_inplace_scanline = \
kill_chroma_packed422_inplace_scanline_c;
mirror_packed422_inplace_scanline = mirror_packed422_inplace_scanline_c;
halfmirror_packed422_inplace_scanline = halfmirror_packed422_inplace_scanline_c;
@@ -2105,7 +2186,8 @@
composite_packed4444_alpha_to_packed422_scanline = \
composite_packed4444_alpha_to_packed422_scanline_mmxext;
composite_alphamask_to_packed4444_scanline = \
composite_alphamask_to_packed4444_scanline_mmxext;
premultiply_packed4444_scanline = premultiply_packed4444_scanline_mmxext;
- linearblend_chroma_packed422_scanline = \
linearblend_chroma_packed422_scanline_mmx; + \
vfilter_chroma_121_packed422_scanline = vfilter_chroma_121_packed422_scanline_mmx; + \
vfilter_chroma_332_packed422_scanline = \
vfilter_chroma_332_packed422_scanline_mmx;
kill_chroma_packed422_inplace_scanline = \
kill_chroma_packed422_inplace_scanline_mmx; blend_packed422_scanline = \
blend_packed422_scanline_mmxext;
diff_factor_packed422_scanline = diff_factor_packed422_scanline_mmx;
@@ -2123,7 +2205,8 @@
blit_packed422_scanline = blit_packed422_scanline_mmx;
diff_factor_packed422_scanline = diff_factor_packed422_scanline_mmx;
comb_factor_packed422_scanline = comb_factor_packed422_scanline_mmx;
- linearblend_chroma_packed422_scanline = \
linearblend_chroma_packed422_scanline_mmx; + \
vfilter_chroma_121_packed422_scanline = vfilter_chroma_121_packed422_scanline_mmx; + \
vfilter_chroma_332_packed422_scanline = \
vfilter_chroma_332_packed422_scanline_mmx;
kill_chroma_packed422_inplace_scanline = \
kill_chroma_packed422_inplace_scanline_mmx; diff_packed422_block8x8 = \
diff_packed422_block8x8_mmx; speedy_memcpy = speedy_memcpy_mmx;
Index: speedy.h
===================================================================
RCS file: /cvsroot/xine/xine-lib/src/post/deinterlace/speedy.h,v
retrieving revision 1.4
diff -u -r1.4 speedy.h
--- speedy.h 17 Jun 2003 17:14:13 -0000 1.4
+++ speedy.h 18 Jun 2003 01:26:47 -0000
@@ -110,7 +110,9 @@
extern unsigned int (*diff_factor_packed422_scanline)( uint8_t *cur, uint8_t *old, \
int width ); extern unsigned int (*comb_factor_packed422_scanline)( uint8_t *top, \
uint8_t *mid,
uint8_t *bot, int width );
-extern void (*linearblend_chroma_packed422_scanline)( uint8_t *output, int width,
+extern void (*vfilter_chroma_121_packed422_scanline)( uint8_t *output, int width,
+ uint8_t *m, uint8_t *t, \
uint8_t *b); +extern void (*vfilter_chroma_332_packed422_scanline)( uint8_t *output, \
int width,
uint8_t *m, uint8_t *t, \
uint8_t *b); extern void (*kill_chroma_packed422_inplace_scanline)( uint8_t *data, \
int width ); extern void (*mirror_packed422_inplace_scanline)( uint8_t *data, int \
width );
Index: xine_plugin.c
===================================================================
RCS file: /cvsroot/xine/xine-lib/src/post/deinterlace/xine_plugin.c,v
retrieving revision 1.5
diff -u -r1.5 xine_plugin.c
--- xine_plugin.c 17 Jun 2003 17:14:13 -0000 1.5
+++ xine_plugin.c 18 Jun 2003 01:26:47 -0000
@@ -515,7 +515,7 @@
* at all, we just want a kind of filter here.
*/
for( i = 0; i < height; i++, data += stride ) {
- linearblend_chroma_packed422_scanline( data, width,
+ vfilter_chroma_332_packed422_scanline( data, width,
data,
(i) ? (data - stride) : data,
(i < height-1) ? (data + stride) : data \
);
-------------------------------------------------------
This SF.Net email is sponsored by: INetU
Attention Web Developers & Consultants: Become An INetU Hosting Partner.
Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission!
INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php
_______________________________________________
xine-devel mailing list
xine-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xine-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic