summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/post/deinterlace/plugins/greedy2frame_template.c233
1 files changed, 120 insertions, 113 deletions
diff --git a/src/post/deinterlace/plugins/greedy2frame_template.c b/src/post/deinterlace/plugins/greedy2frame_template.c
index 2380ee466..88b8c0899 100644
--- a/src/post/deinterlace/plugins/greedy2frame_template.c
+++ b/src/post/deinterlace/plugins/greedy2frame_template.c
@@ -1,72 +1,78 @@
-/////////////////////////////////////////////////////////////////////////////
-// $Id: greedy2frame_template.c,v 1.4 2004/01/05 01:47:26 tmmm Exp $
-/////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2000 John Adcock, Tom Barry, Steve Grimm All rights reserved.
-// port copyright (c) 2003 Miguel Freitas
-/////////////////////////////////////////////////////////////////////////////
-//
-// This file is subject to the terms of the GNU General Public License as
-// published by the Free Software Foundation. A copy of this license is
-// included with this software distribution in the file COPYING. If you
-// do not have a copy, you may obtain a copy by writing to the Free
-// Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-//
-// This software is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details
-/////////////////////////////////////////////////////////////////////////////
-// CVS Log
-//
-// $Log: greedy2frame_template.c,v $
-// Revision 1.4 2004/01/05 01:47:26 tmmm
-// DOS/Win CRs are forbidden, verboten, interdit
-//
-// Revision 1.3 2004/01/02 20:53:43 miguelfreitas
-// better MANGLE from ffmpeg
-//
-// Revision 1.2 2004/01/02 20:47:03 miguelfreitas
-// my small contribution to the cygwin port ;-)
-//
-// Revision 1.1 2003/06/22 17:30:03 miguelfreitas
-// use our own port of greedy2frame (tvtime port is currently broken)
-//
-// Revision 1.8 2001/11/23 17:18:54 adcockj
-// Fixed silly and/or confusion
-//
-// Revision 1.7 2001/11/22 22:27:00 adcockj
-// Bug Fixes
-//
-// Revision 1.6 2001/11/21 15:21:40 adcockj
-// Renamed DEINTERLACE_INFO to TDeinterlaceInfo in line with standards
-// Changed TDeinterlaceInfo structure to have history of pictures.
-//
-// Revision 1.5 2001/07/31 06:48:33 adcockj
-// Fixed index bug spotted by Peter Gubanov
-//
-// Revision 1.4 2001/07/13 16:13:33 adcockj
-// Added CVS tags and removed tabs
-//
-/////////////////////////////////////////////////////////////////////////////
-
-// This is the implementation of the Greedy 2-frame deinterlace algorithm described in
-// DI_Greedy2Frame.c. It's in a separate file so we can compile variants for different
-// CPU types; most of the code is the same in the different variants.
-
-
-///////////////////////////////////////////////////////////////////////////////
-// Field 1 | Field 2 | Field 3 | Field 4 |
-// T0 | | T1 | |
-// | M0 | | M1 |
-// B0 | | B1 | |
-//
-
-
-// debugging feature
-// output the value of mm4 at this point which is pink where we will weave
-// and green were we are going to bob
-// uncomment next line to see this
-//#define CHECK_BOBWEAVE
+/*****************************************************************************
+** $Id: greedy2frame_template.c,v 1.5 2004/01/05 12:15:55 siggi Exp $
+******************************************************************************
+** Copyright (c) 2000 John Adcock, Tom Barry, Steve Grimm All rights reserved.
+** port copyright (c) 2003 Miguel Freitas
+******************************************************************************
+**
+** This file is subject to the terms of the GNU General Public License as
+** published by the Free Software Foundation. A copy of this license is
+** included with this software distribution in the file COPYING. If you
+** do not have a copy, you may obtain a copy by writing to the Free
+** Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** This software is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details
+******************************************************************************
+** CVS Log
+**
+** $Log: greedy2frame_template.c,v $
+** Revision 1.5 2004/01/05 12:15:55 siggi
+** wonder why Mike isn't complaining about C++ style comments, any more...
+**
+** Revision 1.4 2004/01/05 01:47:26 tmmm
+** DOS/Win CRs are forbidden, verboten, interdit
+**
+** Revision 1.3 2004/01/02 20:53:43 miguelfreitas
+** better MANGLE from ffmpeg
+**
+** Revision 1.2 2004/01/02 20:47:03 miguelfreitas
+** my small contribution to the cygwin port ;-)
+**
+** Revision 1.1 2003/06/22 17:30:03 miguelfreitas
+** use our own port of greedy2frame (tvtime port is currently broken)
+**
+** Revision 1.8 2001/11/23 17:18:54 adcockj
+** Fixed silly and/or confusion
+**
+** Revision 1.7 2001/11/22 22:27:00 adcockj
+** Bug Fixes
+**
+** Revision 1.6 2001/11/21 15:21:40 adcockj
+** Renamed DEINTERLACE_INFO to TDeinterlaceInfo in line with standards
+** Changed TDeinterlaceInfo structure to have history of pictures.
+**
+** Revision 1.5 2001/07/31 06:48:33 adcockj
+** Fixed index bug spotted by Peter Gubanov
+**
+** Revision 1.4 2001/07/13 16:13:33 adcockj
+** Added CVS tags and removed tabs
+**
+*****************************************************************************/
+
+/*
+ * This is the implementation of the Greedy 2-frame deinterlace algorithm
+ * described in DI_Greedy2Frame.c. It's in a separate file so we can compile
+ * variants for different CPU types; most of the code is the same in the
+ * different variants.
+ */
+
+
+/****************************************************************************
+** Field 1 | Field 2 | Field 3 | Field 4 |
+** T0 | | T1 | |
+** | M0 | | M1 |
+** B0 | | B1 | |
+*/
+
+
+/* debugging feature */
+/* output the value of mm4 at this point which is pink where we will weave */
+/* and green were we are going to bob */
+/* uncomment next line to see this */
+/* #define CHECK_BOBWEAVE */
#if !defined(MASKS_DEFINED)
#define MASKS_DEFINED
@@ -144,9 +150,10 @@ static void DeinterlaceGreedy2Frame_MMX(uint8_t *output, int outstride,
for (Line = 0; Line < (height / 2) - 1; ++Line)
{
- // Always use the most recent data verbatim. By definition it's correct (it'd
- // be shown on an interlaced display) and our job is to fill in the spaces
- // between the new lines.
+ /* Always use the most recent data verbatim. By definition it's correct
+ * (it'd be shown on an interlaced display) and our job is to fill in
+ * the spaces between the new lines.
+ */
xine_fast_memcpy(Dest, T1, stride);
Dest += outstride;
Dest2 = Dest;
@@ -154,9 +161,9 @@ static void DeinterlaceGreedy2Frame_MMX(uint8_t *output, int outstride,
count = LineLength >> 3;
do {
asm volatile(
- // Figure out what to do with the scanline above the one we just copied.
- // See above for a description of the algorithm.
-
+ /* Figure out what to do with the scanline above the one we just copied.
+ * See above for a description of the algorithm.
+ */
".align 8 \n\t"
"movq "MANGLE(Mask)", %%mm6 \n\t"
@@ -170,30 +177,31 @@ static void DeinterlaceGreedy2Frame_MMX(uint8_t *output, int outstride,
asm volatile(
- // Figure out what to do with the scanline above the one we just copied.
- // See above for a description of the algorithm.
-
- // Average T1 and B1 so we can do interpolated bobbing if we bob onto T1.
- "movq %%mm3, %%mm7 \n\t" // mm7 = B1
+ /* Figure out what to do with the scanline above the one we just copied.
+ * See above for a description of the algorithm.
+ * Average T1 and B1 so we can do interpolated bobbing if we bob onto T1
+ */
+ "movq %%mm3, %%mm7 \n\t" /* mm7 = B1 */
#if defined(IS_SSE)
"pavgb %%mm1, %%mm7 \n\t"
#elif defined(IS_3DNOW)
- "pavgusb %%mm1, %%mm7 \n\t"
+ "pavgusb %%mm1, %%mm7 \n\t"
#else
- "movq %%mm1, %%mm5 \n\t" // mm5 = T1
- "psrlw $1, %%mm7 \n\t" // mm7 = B1 / 2
- "pand %%mm6, %%mm7 \n\t" // mask off lower bits
- "psrlw $1, %%mm5 \n\t" // mm5 = T1 / 2
- "pand %%mm6, %%mm5 \n\t" // mask off lower bits
- "paddw %%mm5, %%mm7 \n\t" // mm7 = (T1 + B1) / 2
+ "movq %%mm1, %%mm5 \n\t" /* mm5 = T1 */
+ "psrlw $1, %%mm7 \n\t" /* mm7 = B1 / 2 */
+ "pand %%mm6, %%mm7 \n\t" /* mask off lower bits */
+ "psrlw $1, %%mm5 \n\t" /* mm5 = T1 / 2 */
+ "pand %%mm6, %%mm5 \n\t" /* mask off lower bits */
+ "paddw %%mm5, %%mm7 \n\t" /* mm7 = (T1 + B1) / 2 */
#endif
- // calculate |M1-M0| put result in mm4 need to keep mm0 intact
- // if we have a good processor then make mm0 the average of M1 and M0
- // which should make weave look better when there is small amounts of
- // movement
+ /* calculate |M1-M0| put result in mm4 need to keep mm0 intact
+ * if we have a good processor then make mm0 the average of M1 and M0
+ * which should make weave look better when there is small amounts of
+ * movement
+ */
#if defined(IS_SSE)
"movq %%mm0, %%mm4 \n\t"
"movq %%mm2, %%mm5 \n\t"
@@ -221,15 +229,15 @@ static void DeinterlaceGreedy2Frame_MMX(uint8_t *output, int outstride,
"pand %%mm6, %%mm4 \n\t"
#endif
- // if |M1-M0| > Threshold we want dword worth of twos
+ /* if |M1-M0| > Threshold we want dword worth of twos */
"pcmpgtb "MANGLE(qwGreedyTwoFrameThreshold)", %%mm4 \n\t"
- "pand "MANGLE(Mask)", %%mm4 \n\t" // get rid of any sign bit
- "pcmpgtd "MANGLE(DwordOne)", %%mm4 \n\t" // do we want to bob
- "pandn "MANGLE(DwordTwo)", %%mm4 \n\t"
+ "pand "MANGLE(Mask)", %%mm4 \n\t" /* get rid of sign bit */
+ "pcmpgtd "MANGLE(DwordOne)", %%mm4 \n\t" /* do we want to bob */
+ "pandn "MANGLE(DwordTwo)", %%mm4 \n\t"
- "movq %1, %%mm2 \n\t" // mm2 = T0
+ "movq %1, %%mm2 \n\t" /* mm2 = T0 */
- // calculate |T1-T0| put result in mm5
+ /* calculate |T1-T0| put result in mm5 */
"movq %%mm2, %%mm5 \n\t"
"psubusb %%mm1, %%mm5 \n\t"
"psubusb %%mm2, %%mm1 \n\t"
@@ -237,17 +245,17 @@ static void DeinterlaceGreedy2Frame_MMX(uint8_t *output, int outstride,
"psrlw $1, %%mm5 \n\t"
"pand %%mm6, %%mm5 \n\t"
- // if |T1-T0| > Threshold we want dword worth of ones
- "pcmpgtb "MANGLE(qwGreedyTwoFrameThreshold)", %%mm5 \n\t"
- "pand %%mm6, %%mm5 \n\t" // get rid of any sign bit
+ /* if |T1-T0| > Threshold we want dword worth of ones */
+ "pcmpgtb "MANGLE(qwGreedyTwoFrameThreshold)", %%mm5 \n\t"
+ "pand %%mm6, %%mm5 \n\t" /* get rid of sign bit */
- "pcmpgtd "MANGLE(DwordOne)", %%mm5 \n\t"
+ "pcmpgtd "MANGLE(DwordOne)", %%mm5 \n\t"
"pandn "MANGLE(DwordOne)", %%mm5 \n\t"
"paddd %%mm5, %%mm4 \n\t"
- "movq %2, %%mm2 \n\t" // B0
+ "movq %2, %%mm2 \n\t" /* B0 */
- // calculate |B1-B0| put result in mm5
+ /* calculate |B1-B0| put result in mm5 */
"movq %%mm2, %%mm5 \n\t"
"psubusb %%mm3, %%mm5 \n\t"
"psubusb %%mm2, %%mm3 \n\t"
@@ -255,18 +263,18 @@ static void DeinterlaceGreedy2Frame_MMX(uint8_t *output, int outstride,
"psrlw $1, %%mm5 \n\t"
"pand %%mm6, %%mm5 \n\t"
- // if |B1-B0| > Threshold we want dword worth of ones
- "pcmpgtb "MANGLE(qwGreedyTwoFrameThreshold)", %%mm5 \n\t"
- "pand %%mm6, %%mm5 \n\t" // get rid of any sign bit
+ /* if |B1-B0| > Threshold we want dword worth of ones */
+ "pcmpgtb "MANGLE(qwGreedyTwoFrameThreshold)", %%mm5 \n\t"
+ "pand %%mm6, %%mm5 \n\t" /* get rid of any sign bit */
"pcmpgtd "MANGLE(DwordOne)", %%mm5 \n\t"
"pandn "MANGLE(DwordOne)", %%mm5 \n\t"
"paddd %%mm5, %%mm4 \n\t"
"pcmpgtd "MANGLE(DwordTwo)", %%mm4 \n\t"
-// debugging feature
-// output the value of mm4 at this point which is pink where we will weave
-// and green were we are going to bob
+/* debugging feature
+ * output the value of mm4 at this point which is pink where we will weave
+ * and green were we are going to bob */
#ifdef CHECK_BOBWEAVE
#ifdef IS_SSE
"movntq %%mm4, %0 \n\t"
@@ -276,7 +284,7 @@ static void DeinterlaceGreedy2Frame_MMX(uint8_t *output, int outstride,
#else
"movq %%mm4, %%mm5 \n\t"
- // mm4 now is 1 where we want to weave and 0 where we want to bob
+ /* mm4 now is 1 where we want to weave and 0 where we want to bob */
"pand %%mm0, %%mm4 \n\t"
"pandn %%mm7, %%mm5 \n\t"
"por %%mm5, %%mm4 \n\t"
@@ -290,7 +298,7 @@ static void DeinterlaceGreedy2Frame_MMX(uint8_t *output, int outstride,
: "=m" (*Dest2)
: "m" (*T0), "m" (*B0) );
- // Advance to the next set of pixels.
+ /* Advance to the next set of pixels. */
T1 += 8;
M1 += 8;
B1 += 8;
@@ -326,8 +334,7 @@ static void DeinterlaceGreedy2Frame_MMX(uint8_t *output, int outstride,
xine_fast_memcpy(Dest, T1, stride);
}
- // clear out the MMX registers ready for doing floating point
- // again
+ /* clear out the MMX registers ready for doing floating point again */
asm("emms\n\t");
#endif
}