diff options
Diffstat (limited to 'src/post/deinterlace/plugins/linearblend.c')
-rw-r--r-- | src/post/deinterlace/plugins/linearblend.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/post/deinterlace/plugins/linearblend.c b/src/post/deinterlace/plugins/linearblend.c index fa32d1408..06e6d105a 100644 --- a/src/post/deinterlace/plugins/linearblend.c +++ b/src/post/deinterlace/plugins/linearblend.c @@ -42,10 +42,10 @@ static void deinterlace_scanline_linear_blend( uint8_t *output, deinterlace_scanline_data_t *data, int width ) { -#ifdef ARCH_X86 uint8_t *t0 = data->t0; uint8_t *b0 = data->b0; uint8_t *m1 = data->m1; +#ifdef ARCH_X86 int i; // Get width in bytes. @@ -90,10 +90,15 @@ static void deinterlace_scanline_linear_blend( uint8_t *output, m1 += 8; } while( width-- ) { - *output++ = (*t0++ + *b0++ + (2 * *m1++))>>2; + *output++ = (*t0++ + *b0++ + (*m1++ << 1)) >> 2; } sfence(); emms(); +#else + width *= 2; + while( width-- ) { + *output++ = (*t0++ + *b0++ + (*m1++ << 1)) >> 2; + } #endif } @@ -101,10 +106,11 @@ static void deinterlace_scanline_linear_blend2( uint8_t *output, deinterlace_scanline_data_t *data, int width ) { -#ifdef ARCH_X86 uint8_t *m0 = data->m0; uint8_t *t1 = data->t1; uint8_t *b1 = data->b1; + +#ifdef ARCH_X86 int i; // Get width in bytes. @@ -149,10 +155,15 @@ static void deinterlace_scanline_linear_blend2( uint8_t *output, m0 += 8; } while( width-- ) { - *output++ = (*t1++ + *b1++ + (2 * *m0++))>>2; + *output++ = (*t1++ + *b1++ + (*m0++ << 1)) >> 2; } sfence(); emms(); +#else + width *= 2; + while( width-- ) { + *output++ = (*t1++ + *b1++ + (*m0++ << 1)) >> 2; + } #endif } @@ -163,7 +174,11 @@ static deinterlace_method_t linearblendmethod = "mplayer: Linear Blend", "LinearBlend", 2, +#ifdef ARCH_X86 MM_ACCEL_X86_MMX, +#else + 0, +#endif 0, 0, 0, @@ -181,4 +196,3 @@ void linearblend_plugin_init( void ) { register_deinterlace_method( &linearblendmethod ); } - |