summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2003-06-18 01:27:50 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2003-06-18 01:27:50 +0000
commitc2a296aad31073526b3e19de17c82b69f20e885c (patch)
treee91a65b860920762359b4cec1929e15a42c7831a /src
parent801248805cd0f77cefdf8322e789e643339d7068 (diff)
downloadxine-lib-c2a296aad31073526b3e19de17c82b69f20e885c.tar.gz
xine-lib-c2a296aad31073526b3e19de17c82b69f20e885c.tar.bz2
try filtering more to remove chroma problems
CVS patchset: 5060 CVS date: 2003/06/18 01:27:50
Diffstat (limited to 'src')
-rw-r--r--src/post/deinterlace/speedy.c103
-rw-r--r--src/post/deinterlace/speedy.h4
-rw-r--r--src/post/deinterlace/xine_plugin.c4
3 files changed, 98 insertions, 13 deletions
diff --git a/src/post/deinterlace/speedy.c b/src/post/deinterlace/speedy.c
index c782f873f..5dab5fa0d 100644
--- a/src/post/deinterlace/speedy.c
+++ b/src/post/deinterlace/speedy.c
@@ -70,7 +70,9 @@ void (*filter_luma_14641_packed422_inplace_scanline)( uint8_t *data, int width )
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 @@ void packed422_to_packed444_rec601_scanline( uint8_t *dest, uint8_t *src, int wi
}
}
-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 @@ static void linearblend_chroma_packed422_scanline_mmx( uint8_t *output, int widt
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 @@ void setup_speedy_calls( uint32_t accel, int verbose )
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 @@ void setup_speedy_calls( uint32_t accel, int verbose )
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 @@ void setup_speedy_calls( uint32_t accel, int verbose )
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;
diff --git a/src/post/deinterlace/speedy.h b/src/post/deinterlace/speedy.h
index b84615584..78fa42468 100644
--- a/src/post/deinterlace/speedy.h
+++ b/src/post/deinterlace/speedy.h
@@ -110,7 +110,9 @@ extern void (*filter_luma_14641_packed422_inplace_scanline)( uint8_t *data, int
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 );
diff --git a/src/post/deinterlace/xine_plugin.c b/src/post/deinterlace/xine_plugin.c
index c27473978..deef56239 100644
--- a/src/post/deinterlace/xine_plugin.c
+++ b/src/post/deinterlace/xine_plugin.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine_plugin.c,v 1.5 2003/06/17 17:14:13 miguelfreitas Exp $
+ * $Id: xine_plugin.c,v 1.6 2003/06/18 01:27:50 miguelfreitas Exp $
*
* advanced video deinterlacer plugin
* Jun/2003 by Miguel Freitas
@@ -515,7 +515,7 @@ static void apply_chroma_filter( uint8_t *data, int stride, int width, int heigh
* 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 );