C implementation of the median deinterlacer (seems to be the only one
authorD Richard Felker III <dalias@aerifal.cx>
Thu, 23 Jan 2003 04:19:24 +0000 (04:19 +0000)
committerD Richard Felker III <dalias@aerifal.cx>
Thu, 23 Jan 2003 04:19:24 +0000 (04:19 +0000)
that generates tolerable output for anime) so it will work on non-MMX
architectures. Someone should optimize it better eventually.

Originally committed as revision 9071 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc

postproc/postprocess.c
postproc/postprocess_template.c

index 222c39db000e4dc9327cef1b5d7c2588dfb06caf..b25c24baf2b650953368563e0a7cf830b2b47094 100644 (file)
@@ -34,7 +34,7 @@ Horizontal X1#                a               E       E
 LinIpolDeinterlace     e               E       E*
 CubicIpolDeinterlace   a               e       e*
 LinBlendDeinterlace    e               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
 TempDeNoiser#          E               e       e
 
 * i dont have a 3dnow CPU -> its untested, but noone said it doesnt work so it seems to work
index df54e6f09c055e838a948cf94915f9c7eae64349..af48cdcba8f29c5cdbd8b60ef1312ad30e57371e 100644 (file)
@@ -1889,19 +1889,24 @@ MEDIAN((%%edx, %1), (%%edx, %1, 2), (%0, %1, 8))
        );
 #endif // MMX
 #else
        );
 #endif // MMX
 #else
-       //FIXME
-       int x;
+       int x, y;
        src+= 4*stride;
        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++)
        {
        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
                src++;
        }
 #endif