[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