From 44e9a6585e23f98ec743dfd7fc504b96f7e1c781 Mon Sep 17 00:00:00 2001 From: rfelker Date: Thu, 23 Jan 2003 04:19:24 +0000 Subject: [PATCH] C implementation of the median deinterlacer (seems to be the only one that generates tolerable output for anime) so it will work on non-MMX architectures. Someone should optimize it better eventually. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@9071 b3059339-0415-0410-9bf9-f77b7e298cf2 --- postproc/postprocess.c | 2 +- postproc/postprocess_template.c | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/postproc/postprocess.c b/postproc/postprocess.c index 222c39db00..b25c24baf2 100644 --- a/postproc/postprocess.c +++ b/postproc/postprocess.c @@ -34,7 +34,7 @@ Horizontal X1# a E E LinIpolDeinterlace e E E* CubicIpolDeinterlace a e e* LinBlendDeinterlace e E E* -MedianDeinterlace# Ec Ec +MedianDeinterlace# E Ec Ec TempDeNoiser# E e e * i dont have a 3dnow CPU -> its untested, but noone said it doesnt work so it seems to work diff --git a/postproc/postprocess_template.c b/postproc/postprocess_template.c index df54e6f09c..af48cdcba8 100644 --- a/postproc/postprocess_template.c +++ b/postproc/postprocess_template.c @@ -1889,19 +1889,24 @@ MEDIAN((%%edx, %1), (%%edx, %1, 2), (%0, %1, 8)) ); #endif // MMX #else - //FIXME - int x; + int x, y; src+= 4*stride; + // FIXME - there should be a way to do a few columns in parallel like w/mmx for(x=0; x<8; x++) { - src[0 ] = (src[0 ] + 2*src[stride ] + src[stride*2])>>2; - src[stride ] = (src[stride ] + 2*src[stride*2] + src[stride*3])>>2; - src[stride*2] = (src[stride*2] + 2*src[stride*3] + src[stride*4])>>2; - src[stride*3] = (src[stride*3] + 2*src[stride*4] + src[stride*5])>>2; - src[stride*4] = (src[stride*4] + 2*src[stride*5] + src[stride*6])>>2; - src[stride*5] = (src[stride*5] + 2*src[stride*6] + src[stride*7])>>2; - src[stride*6] = (src[stride*6] + 2*src[stride*7] + src[stride*8])>>2; - src[stride*7] = (src[stride*7] + 2*src[stride*8] + src[stride*9])>>2; + uint8_t *colsrc = src; + for (y=0; y<4; y++) + { + int a, b, c, d, e, f; + a = colsrc[0 ]; + b = colsrc[stride ]; + c = colsrc[stride*2]; + d = (a-b)>>31; + e = (b-c)>>31; + f = (c-a)>>31; + colsrc[stride ] = (a|(d^f)) & (b|(d^e)) & (c|(e^f)); + colsrc += stride*2; + } src++; } #endif