upload tizen1.0 source
[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   deinterlace_line_linear_blend (out, t0, b0, m1, size);
60 }
61
62 static void
63 deinterlace_scanline_linear_blend_packed_c (GstDeinterlaceSimpleMethod * self,
64     guint8 * out, const GstDeinterlaceScanlineData * scanlines)
65 {
66   deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
67       scanlines->m1, self->parent.row_stride[0]);
68 }
69
70 static void
71 deinterlace_scanline_linear_blend_planar_y_c (GstDeinterlaceSimpleMethod * self,
72     guint8 * out, const GstDeinterlaceScanlineData * scanlines)
73 {
74   deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
75       scanlines->m1, self->parent.row_stride[0]);
76 }
77
78 static void
79 deinterlace_scanline_linear_blend_planar_u_c (GstDeinterlaceSimpleMethod * self,
80     guint8 * out, const GstDeinterlaceScanlineData * scanlines)
81 {
82   deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
83       scanlines->m1, self->parent.row_stride[1]);
84 }
85
86 static void
87 deinterlace_scanline_linear_blend_planar_v_c (GstDeinterlaceSimpleMethod * self,
88     guint8 * out, const GstDeinterlaceScanlineData * scanlines)
89 {
90   deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
91       scanlines->m1, self->parent.row_stride[2]);
92 }
93
94 static inline void
95 deinterlace_scanline_linear_blend2_c (GstDeinterlaceSimpleMethod * self,
96     guint8 * out, const guint8 * m0, const guint8 * t1, const guint8 * b1,
97     gint size)
98 {
99   deinterlace_line_linear_blend (out, t1, b1, m0, size);
100 }
101
102 static void
103 deinterlace_scanline_linear_blend2_packed_c (GstDeinterlaceSimpleMethod * self,
104     guint8 * out, const GstDeinterlaceScanlineData * scanlines)
105 {
106   deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
107       scanlines->b1, self->parent.row_stride[0]);
108 }
109
110 static void
111 deinterlace_scanline_linear_blend2_planar_y_c (GstDeinterlaceSimpleMethod *
112     self, 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_u_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[1]);
124 }
125
126 static void
127 deinterlace_scanline_linear_blend2_planar_v_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[2]);
132 }
133
134 G_DEFINE_TYPE (GstDeinterlaceMethodLinearBlend,
135     gst_deinterlace_method_linear_blend, GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
136
137 static void
138     gst_deinterlace_method_linear_blend_class_init
139     (GstDeinterlaceMethodLinearBlendClass * klass)
140 {
141   GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
142   GstDeinterlaceSimpleMethodClass *dism_class =
143       (GstDeinterlaceSimpleMethodClass *) klass;
144
145   dim_class->fields_required = 2;
146   dim_class->name = "Blur: Temporal";
147   dim_class->nick = "linearblend";
148   dim_class->latency = 0;
149
150   dism_class->interpolate_scanline_yuy2 =
151       deinterlace_scanline_linear_blend_packed_c;
152   dism_class->interpolate_scanline_yvyu =
153       deinterlace_scanline_linear_blend_packed_c;
154   dism_class->interpolate_scanline_uyvy =
155       deinterlace_scanline_linear_blend_packed_c;
156   dism_class->interpolate_scanline_ayuv =
157       deinterlace_scanline_linear_blend_packed_c;
158   dism_class->interpolate_scanline_argb =
159       deinterlace_scanline_linear_blend_packed_c;
160   dism_class->interpolate_scanline_rgba =
161       deinterlace_scanline_linear_blend_packed_c;
162   dism_class->interpolate_scanline_abgr =
163       deinterlace_scanline_linear_blend_packed_c;
164   dism_class->interpolate_scanline_bgra =
165       deinterlace_scanline_linear_blend_packed_c;
166   dism_class->interpolate_scanline_rgb =
167       deinterlace_scanline_linear_blend_packed_c;
168   dism_class->interpolate_scanline_bgr =
169       deinterlace_scanline_linear_blend_packed_c;
170   dism_class->interpolate_scanline_nv12 =
171       deinterlace_scanline_linear_blend_packed_c;
172   dism_class->interpolate_scanline_nv21 =
173       deinterlace_scanline_linear_blend_packed_c;
174
175   dism_class->interpolate_scanline_planar_y =
176       deinterlace_scanline_linear_blend_planar_y_c;
177   dism_class->interpolate_scanline_planar_u =
178       deinterlace_scanline_linear_blend_planar_u_c;
179   dism_class->interpolate_scanline_planar_v =
180       deinterlace_scanline_linear_blend_planar_v_c;
181
182   dism_class->copy_scanline_yuy2 = deinterlace_scanline_linear_blend2_packed_c;
183   dism_class->copy_scanline_yvyu = deinterlace_scanline_linear_blend2_packed_c;
184   dism_class->copy_scanline_uyvy = deinterlace_scanline_linear_blend2_packed_c;
185   dism_class->copy_scanline_ayuv = deinterlace_scanline_linear_blend2_packed_c;
186   dism_class->copy_scanline_argb = deinterlace_scanline_linear_blend2_packed_c;
187   dism_class->copy_scanline_abgr = deinterlace_scanline_linear_blend2_packed_c;
188   dism_class->copy_scanline_rgba = deinterlace_scanline_linear_blend2_packed_c;
189   dism_class->copy_scanline_bgra = deinterlace_scanline_linear_blend2_packed_c;
190   dism_class->copy_scanline_rgb = deinterlace_scanline_linear_blend2_packed_c;
191   dism_class->copy_scanline_bgr = deinterlace_scanline_linear_blend2_packed_c;
192
193   dism_class->copy_scanline_planar_y =
194       deinterlace_scanline_linear_blend2_planar_y_c;
195   dism_class->copy_scanline_planar_u =
196       deinterlace_scanline_linear_blend2_planar_u_c;
197   dism_class->copy_scanline_planar_v =
198       deinterlace_scanline_linear_blend2_planar_v_c;
199
200 }
201
202 static void
203 gst_deinterlace_method_linear_blend_init (GstDeinterlaceMethodLinearBlend *
204     self)
205 {
206 }