Tizen 2.0 Release
[framework/multimedia/gst-plugins-good0.10.git] / gst / deinterlace / tvtime / linearblend.c
1 /*
2  * Linear blend deinterlacing plugin.  The idea for this algorithm came
3  * from the linear blend deinterlacer which originated in the mplayer
4  * sources.
5  *
6  * Copyright (C) 2002 Billy Biggs <vektor@dumbterm.net>.
7  * Copyright (C) 2008,2010 Sebastian Dröge <slomo@collabora.co.uk>
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the
21  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  */
24
25 /*
26  * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs.
27  * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578
28  */
29
30 #ifdef HAVE_CONFIG_H
31 # include "config.h"
32 #endif
33
34 #include "gstdeinterlacemethod.h"
35 #include <string.h>
36 #ifdef HAVE_ORC
37 #include <orc/orc.h>
38 #endif
39 #include "tvtime.h"
40
41 #define GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND        (gst_deinterlace_method_linear_blend_get_type ())
42 #define GST_IS_DEINTERLACE_METHOD_LINEAR_BLEND(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND))
43 #define GST_IS_DEINTERLACE_METHOD_LINEAR_BLEND_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND))
44 #define GST_DEINTERLACE_METHOD_LINEAR_BLEND_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND, GstDeinterlaceMethodLinearBlendClass))
45 #define GST_DEINTERLACE_METHOD_LINEAR_BLEND(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND, GstDeinterlaceMethodLinearBlend))
46 #define GST_DEINTERLACE_METHOD_LINEAR_BLEND_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD_LINEAR_BLEND, GstDeinterlaceMethodLinearBlendClass))
47 #define GST_DEINTERLACE_METHOD_LINEAR_BLEND_CAST(obj)   ((GstDeinterlaceMethodLinearBlend*)(obj))
48
49 GType gst_deinterlace_method_linear_blend_get_type (void);
50
51 typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodLinearBlend;
52 typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodLinearBlendClass;
53
54 static inline void
55 deinterlace_scanline_linear_blend_c (GstDeinterlaceSimpleMethod * self,
56     guint8 * out, const guint8 * t0, const guint8 * b0, const guint8 * m1,
57     gint size)
58 {
59   if (m1 == NULL) {
60     deinterlace_line_linear (out, t0, b0, size);
61   } else {
62     deinterlace_line_linear_blend (out, t0, b0, m1, size);
63   }
64 }
65
66 static void
67 deinterlace_scanline_linear_blend_packed_c (GstDeinterlaceSimpleMethod * self,
68     guint8 * out, const GstDeinterlaceScanlineData * scanlines)
69 {
70   deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
71       scanlines->m1, self->parent.row_stride[0]);
72 }
73
74 static void
75 deinterlace_scanline_linear_blend_planar_y_c (GstDeinterlaceSimpleMethod * self,
76     guint8 * out, const GstDeinterlaceScanlineData * scanlines)
77 {
78   deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
79       scanlines->m1, self->parent.row_stride[0]);
80 }
81
82 static void
83 deinterlace_scanline_linear_blend_planar_u_c (GstDeinterlaceSimpleMethod * self,
84     guint8 * out, const GstDeinterlaceScanlineData * scanlines)
85 {
86   deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
87       scanlines->m1, self->parent.row_stride[1]);
88 }
89
90 static void
91 deinterlace_scanline_linear_blend_planar_v_c (GstDeinterlaceSimpleMethod * self,
92     guint8 * out, const GstDeinterlaceScanlineData * scanlines)
93 {
94   deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
95       scanlines->m1, self->parent.row_stride[2]);
96 }
97
98 static inline void
99 deinterlace_scanline_linear_blend2_c (GstDeinterlaceSimpleMethod * self,
100     guint8 * out, const guint8 * m0, const guint8 * t1, const guint8 * b1,
101     gint size)
102 {
103   if (t1 == NULL) {
104     memcpy (out, m0, size);
105   } else {
106     deinterlace_line_linear_blend (out, t1, b1, m0, size);
107   }
108 }
109
110 static void
111 deinterlace_scanline_linear_blend2_packed_c (GstDeinterlaceSimpleMethod * self,
112     guint8 * out, const GstDeinterlaceScanlineData * scanlines)
113 {
114   deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
115       scanlines->b1, self->parent.row_stride[0]);
116 }
117
118 static void
119 deinterlace_scanline_linear_blend2_planar_y_c (GstDeinterlaceSimpleMethod *
120     self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
121 {
122   deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
123       scanlines->b1, self->parent.row_stride[0]);
124 }
125
126 static void
127 deinterlace_scanline_linear_blend2_planar_u_c (GstDeinterlaceSimpleMethod *
128     self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
129 {
130   deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
131       scanlines->b1, self->parent.row_stride[1]);
132 }
133
134 static void
135 deinterlace_scanline_linear_blend2_planar_v_c (GstDeinterlaceSimpleMethod *
136     self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
137 {
138   deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
139       scanlines->b1, self->parent.row_stride[2]);
140 }
141
142 G_DEFINE_TYPE (GstDeinterlaceMethodLinearBlend,
143     gst_deinterlace_method_linear_blend, GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
144
145 static void
146     gst_deinterlace_method_linear_blend_class_init
147     (GstDeinterlaceMethodLinearBlendClass * klass)
148 {
149   GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
150   GstDeinterlaceSimpleMethodClass *dism_class =
151       (GstDeinterlaceSimpleMethodClass *) klass;
152
153   dim_class->fields_required = 2;
154   dim_class->name = "Blur: Temporal";
155   dim_class->nick = "linearblend";
156   dim_class->latency = 1;
157
158   dism_class->interpolate_scanline_yuy2 =
159       deinterlace_scanline_linear_blend_packed_c;
160   dism_class->interpolate_scanline_yvyu =
161       deinterlace_scanline_linear_blend_packed_c;
162   dism_class->interpolate_scanline_uyvy =
163       deinterlace_scanline_linear_blend_packed_c;
164   dism_class->interpolate_scanline_ayuv =
165       deinterlace_scanline_linear_blend_packed_c;
166   dism_class->interpolate_scanline_argb =
167       deinterlace_scanline_linear_blend_packed_c;
168   dism_class->interpolate_scanline_rgba =
169       deinterlace_scanline_linear_blend_packed_c;
170   dism_class->interpolate_scanline_abgr =
171       deinterlace_scanline_linear_blend_packed_c;
172   dism_class->interpolate_scanline_bgra =
173       deinterlace_scanline_linear_blend_packed_c;
174   dism_class->interpolate_scanline_rgb =
175       deinterlace_scanline_linear_blend_packed_c;
176   dism_class->interpolate_scanline_bgr =
177       deinterlace_scanline_linear_blend_packed_c;
178   dism_class->interpolate_scanline_nv12 =
179       deinterlace_scanline_linear_blend_packed_c;
180   dism_class->interpolate_scanline_nv21 =
181       deinterlace_scanline_linear_blend_packed_c;
182
183   dism_class->interpolate_scanline_planar_y =
184       deinterlace_scanline_linear_blend_planar_y_c;
185   dism_class->interpolate_scanline_planar_u =
186       deinterlace_scanline_linear_blend_planar_u_c;
187   dism_class->interpolate_scanline_planar_v =
188       deinterlace_scanline_linear_blend_planar_v_c;
189
190   dism_class->copy_scanline_yuy2 = deinterlace_scanline_linear_blend2_packed_c;
191   dism_class->copy_scanline_yvyu = deinterlace_scanline_linear_blend2_packed_c;
192   dism_class->copy_scanline_uyvy = deinterlace_scanline_linear_blend2_packed_c;
193   dism_class->copy_scanline_ayuv = deinterlace_scanline_linear_blend2_packed_c;
194   dism_class->copy_scanline_argb = deinterlace_scanline_linear_blend2_packed_c;
195   dism_class->copy_scanline_abgr = deinterlace_scanline_linear_blend2_packed_c;
196   dism_class->copy_scanline_rgba = deinterlace_scanline_linear_blend2_packed_c;
197   dism_class->copy_scanline_bgra = deinterlace_scanline_linear_blend2_packed_c;
198   dism_class->copy_scanline_rgb = deinterlace_scanline_linear_blend2_packed_c;
199   dism_class->copy_scanline_bgr = deinterlace_scanline_linear_blend2_packed_c;
200
201   dism_class->copy_scanline_planar_y =
202       deinterlace_scanline_linear_blend2_planar_y_c;
203   dism_class->copy_scanline_planar_u =
204       deinterlace_scanline_linear_blend2_planar_u_c;
205   dism_class->copy_scanline_planar_v =
206       deinterlace_scanline_linear_blend2_planar_v_c;
207
208 }
209
210 static void
211 gst_deinterlace_method_linear_blend_init (GstDeinterlaceMethodLinearBlend *
212     self)
213 {
214 }