From c2a296aad31073526b3e19de17c82b69f20e885c Mon Sep 17 00:00:00 2001 From: Miguel Freitas Date: Wed, 18 Jun 2003 01:27:50 +0000 Subject: try filtering more to remove chroma problems CVS patchset: 5060 CVS date: 2003/06/18 01:27:50 --- src/post/deinterlace/speedy.c | 103 +++++++++++++++++++++++++++++++++---- src/post/deinterlace/speedy.h | 4 +- src/post/deinterlace/xine_plugin.c | 4 +- 3 files changed, 98 insertions(+), 13 deletions(-) (limited to 'src') 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 ); -- cgit v1.2.3