tizen 2.0 init
[framework/multimedia/gst-plugins-good0.10.git] / gst / deinterlace / tvtime / tomsmocomp / TomsMoCompAll.inc
1 /*
2  * GStreamer
3  * Copyright (c) 2002 Tom Barry  All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20
21 /*
22  * Relicensed for GStreamer from GPL to LGPL with permit from Tom Barry.
23  * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578
24  */
25
26
27 #ifndef TopFirst
28 #define TopFirst IsOdd
29 #endif
30
31 #ifdef SEFUNC
32 #undef SEFUNC
33 #endif
34
35 #if defined(IS_MMXEXT)
36 #define SEFUNC(x) Search_Effort_MMXEXT_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight)
37 #elif defined(IS_3DNOW)
38 #define SEFUNC(x) Search_Effort_3DNOW_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight)
39 #elif defined(IS_MMX)
40 #define SEFUNC(x) Search_Effort_MMX_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight)
41 #else
42 #define SEFUNC(x) Search_Effort_C_##x(int src_pitch, int dst_pitch, int rowsize, const unsigned char *pWeaveSrc, const unsigned char *pWeaveSrcP, unsigned char *pWeaveDest, int IsOdd, const unsigned char *pCopySrc, const unsigned char *pCopySrcP, int FldHeight)
43 #endif
44
45 #include "TomsMoCompAll2.inc"
46
47 #define USE_STRANGE_BOB
48
49 #include "TomsMoCompAll2.inc"
50
51 #undef USE_STRANGE_BOB
52
53 #undef SEFUNC
54 #if defined(IS_MMXEXT)
55 #define SEFUNC(x) Search_Effort_MMXEXT_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight)
56 #elif defined(IS_3DNOW)
57 #define SEFUNC(x) Search_Effort_3DNOW_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight)
58 #elif defined(IS_MMX)
59 #define SEFUNC(x) Search_Effort_MMX_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight)
60 #else
61 #define SEFUNC(x) Search_Effort_C_##x(src_pitch, dst_pitch, rowsize, pWeaveSrc, pWeaveSrcP, pWeaveDest, IsOdd, pCopySrc, pCopySrcP, FldHeight)
62 #endif
63
64 static void FUNCT_NAME(GstDeinterlaceMethod *d_method,
65         const GstDeinterlaceField* history, guint history_count,
66         GstBuffer *outbuf, int cur_field_idx)
67 {
68   GstDeinterlaceMethodTomsMoComp *self = GST_DEINTERLACE_METHOD_TOMSMOCOMP (d_method);
69   glong SearchEffort = self->search_effort;
70   gint UseStrangeBob = self->strange_bob;
71   gint IsOdd;
72   const guint8 *pWeaveSrc;
73   const guint8 *pWeaveSrcP;
74   guint8 *pWeaveDest;
75   const guint8 *pCopySrc;
76   const guint8 *pCopySrcP;
77   guint8 *pCopyDest;
78   gint src_pitch;
79   gint dst_pitch;
80   gint rowsize;
81   gint FldHeight;
82
83   if (cur_field_idx + 2 > history_count || cur_field_idx < 1) {
84     GstDeinterlaceMethod *backup_method;
85     
86     backup_method = g_object_new (gst_deinterlace_method_linear_get_type(),
87         NULL);
88
89     gst_deinterlace_method_setup (backup_method, d_method->format,
90         d_method->frame_width, d_method->frame_height);
91     gst_deinterlace_method_deinterlace_frame (backup_method,
92         history, history_count, outbuf, cur_field_idx);
93
94     g_object_unref (backup_method);
95     return;
96   }
97
98   /* double stride do address just every odd/even scanline */
99   src_pitch = self->parent.row_stride[0]*2;
100   dst_pitch = self->parent.row_stride[0];
101   rowsize   = self->parent.row_stride[0];
102   FldHeight = self->parent.frame_height / 2;
103
104   pCopySrc   = GST_BUFFER_DATA(history[history_count-1].buf);
105   if (history[history_count - 1].flags & PICTURE_INTERLACED_BOTTOM)
106     pCopySrc += rowsize;
107   pCopySrcP  = GST_BUFFER_DATA(history[history_count-3].buf);
108   if (history[history_count - 3].flags & PICTURE_INTERLACED_BOTTOM)
109     pCopySrcP += rowsize;
110   pWeaveSrc  = GST_BUFFER_DATA(history[history_count-2].buf);  
111   if (history[history_count - 2].flags & PICTURE_INTERLACED_BOTTOM)
112     pWeaveSrc += rowsize;
113   pWeaveSrcP = GST_BUFFER_DATA(history[history_count-4].buf);
114   if (history[history_count - 4].flags & PICTURE_INTERLACED_BOTTOM)
115     pWeaveSrcP += rowsize;
116
117   /* use bottom field and interlace top field */
118   if (history[history_count-2].flags == PICTURE_INTERLACED_BOTTOM) {
119     IsOdd      = 1;
120
121     // if we have an odd field we copy an even field and weave an odd field
122     pCopyDest = GST_BUFFER_DATA(outbuf);
123     pWeaveDest = pCopyDest + dst_pitch;
124   }
125   /* do it vice verca */
126   else {
127
128     IsOdd      = 0;
129     // if we have an even field we copy an odd field and weave an even field
130     pCopyDest = GST_BUFFER_DATA(outbuf) + dst_pitch;
131     pWeaveDest = GST_BUFFER_DATA(outbuf);
132   }
133
134   
135   // copy 1st and last weave lines 
136   Fieldcopy(pWeaveDest, pCopySrc, rowsize,              
137             1, dst_pitch*2, src_pitch);
138   Fieldcopy(pWeaveDest+(FldHeight-1)*dst_pitch*2,
139             pCopySrc+(FldHeight-1)*src_pitch, rowsize, 
140             1, dst_pitch*2, src_pitch);
141   
142 #ifdef USE_VERTICAL_FILTER
143   // Vertical Filter currently not implemented for DScaler !!
144   // copy 1st and last lines the copy field
145   Fieldcopy(pCopyDest, pCopySrc, rowsize, 
146             1, dst_pitch*2, src_pitch);
147   Fieldcopy(pCopyDest+(FldHeight-1)*dst_pitch*2,
148             pCopySrc+(FldHeight-1)*src_pitch, rowsize, 
149             1, dst_pitch*2, src_pitch);
150 #else
151   
152   // copy all of the copy field
153   Fieldcopy(pCopyDest, pCopySrc, rowsize, 
154             FldHeight, dst_pitch*2, src_pitch);
155 #endif  
156   // then go fill in the hard part, being variously lazy depending upon
157   // SearchEffort
158
159   if(!UseStrangeBob) {
160     if (SearchEffort == 0)
161       {
162         SEFUNC(0);
163       }
164     else if (SearchEffort <= 1)
165       {
166         SEFUNC(1);
167       }
168     /*  else if (SearchEffort <= 2)
169         {
170         SEFUNC(2);
171         }
172     */
173     else if (SearchEffort <= 3)
174       {
175         SEFUNC(3);
176       }
177     else if (SearchEffort <= 5)
178       {
179         SEFUNC(5);
180       }
181     else if (SearchEffort <= 9)
182       {
183         SEFUNC(9);
184       }
185     else if (SearchEffort <= 11)
186       {
187         SEFUNC(11);
188       }
189     else if (SearchEffort <= 13)
190       {
191         SEFUNC(13);
192       }
193     else if (SearchEffort <= 15)
194       {
195         SEFUNC(15);
196       }
197     else if (SearchEffort <= 19)
198       {
199         SEFUNC(19);
200       }
201     else if (SearchEffort <= 21)
202       {
203         SEFUNC(21);
204       }
205     else 
206       {
207         SEFUNC(Max);
208       }
209   }
210   else
211     {
212       if (SearchEffort == 0)
213         {
214           SEFUNC(0SB);
215         }
216       else if (SearchEffort <= 1)
217         {
218           SEFUNC(1SB);
219         }
220       /*        else if (SearchEffort <= 2)
221                 {
222                 SEFUNC(2SB);
223                 }
224       */
225       else if (SearchEffort <= 3)
226         {
227           SEFUNC(3SB);
228         }
229       else if (SearchEffort <= 5)
230         {
231           SEFUNC(5SB);
232         }
233       else if (SearchEffort <= 9)
234         {
235           SEFUNC(9SB);
236         }
237       else if (SearchEffort <= 11)
238         {
239           SEFUNC(11SB);
240         }
241       else if (SearchEffort <= 13)
242         {
243           SEFUNC(13SB);
244         }
245       else if (SearchEffort <= 15)
246         {
247           SEFUNC(15SB);
248         }
249       else if (SearchEffort <= 19)
250         {
251           SEFUNC(19SB);
252         }
253       else if (SearchEffort <= 21)
254         {
255           SEFUNC(21SB);
256         }
257       else 
258         {
259           SEFUNC(MaxSB);
260         }
261     }
262
263 #if defined(BUILD_X86_ASM) && !defined(IS_C)
264   __asm__ __volatile__("emms");
265 #endif
266 }