2 * Linear blend deinterlacing plugin. The idea for this algorithm came
3 * from the linear blend deinterlacer which originated in the mplayer
6 * Copyright (C) 2002 Billy Biggs <vektor@dumbterm.net>.
7 * Copyright (C) 2008,2010 Sebastian Dröge <slomo@collabora.co.uk>
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.
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.
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.
26 * Relicensed for GStreamer from GPL to LGPL with permit from Billy Biggs.
27 * See: http://bugzilla.gnome.org/show_bug.cgi?id=163578
34 #include "gstdeinterlacemethod.h"
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))
49 GType gst_deinterlace_method_linear_blend_get_type (void);
51 typedef GstDeinterlaceSimpleMethod GstDeinterlaceMethodLinearBlend;
52 typedef GstDeinterlaceSimpleMethodClass GstDeinterlaceMethodLinearBlendClass;
55 deinterlace_scanline_linear_blend_c (GstDeinterlaceSimpleMethod * self,
56 guint8 * out, const guint8 * t0, const guint8 * b0, const guint8 * m1,
60 deinterlace_line_linear (out, t0, b0, size);
62 deinterlace_line_linear_blend (out, t0, b0, m1, size);
67 deinterlace_scanline_linear_blend_packed_c (GstDeinterlaceSimpleMethod * self,
68 guint8 * out, const GstDeinterlaceScanlineData * scanlines)
70 deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
71 scanlines->m1, self->parent.row_stride[0]);
75 deinterlace_scanline_linear_blend_planar_y_c (GstDeinterlaceSimpleMethod * self,
76 guint8 * out, const GstDeinterlaceScanlineData * scanlines)
78 deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
79 scanlines->m1, self->parent.row_stride[0]);
83 deinterlace_scanline_linear_blend_planar_u_c (GstDeinterlaceSimpleMethod * self,
84 guint8 * out, const GstDeinterlaceScanlineData * scanlines)
86 deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
87 scanlines->m1, self->parent.row_stride[1]);
91 deinterlace_scanline_linear_blend_planar_v_c (GstDeinterlaceSimpleMethod * self,
92 guint8 * out, const GstDeinterlaceScanlineData * scanlines)
94 deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
95 scanlines->m1, self->parent.row_stride[2]);
99 deinterlace_scanline_linear_blend2_c (GstDeinterlaceSimpleMethod * self,
100 guint8 * out, const guint8 * m0, const guint8 * t1, const guint8 * b1,
104 memcpy (out, m0, size);
106 deinterlace_line_linear_blend (out, t1, b1, m0, size);
111 deinterlace_scanline_linear_blend2_packed_c (GstDeinterlaceSimpleMethod * self,
112 guint8 * out, const GstDeinterlaceScanlineData * scanlines)
114 deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
115 scanlines->b1, self->parent.row_stride[0]);
119 deinterlace_scanline_linear_blend2_planar_y_c (GstDeinterlaceSimpleMethod *
120 self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
122 deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
123 scanlines->b1, self->parent.row_stride[0]);
127 deinterlace_scanline_linear_blend2_planar_u_c (GstDeinterlaceSimpleMethod *
128 self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
130 deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
131 scanlines->b1, self->parent.row_stride[1]);
135 deinterlace_scanline_linear_blend2_planar_v_c (GstDeinterlaceSimpleMethod *
136 self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
138 deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
139 scanlines->b1, self->parent.row_stride[2]);
142 G_DEFINE_TYPE (GstDeinterlaceMethodLinearBlend,
143 gst_deinterlace_method_linear_blend, GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
146 gst_deinterlace_method_linear_blend_class_init
147 (GstDeinterlaceMethodLinearBlendClass * klass)
149 GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
150 GstDeinterlaceSimpleMethodClass *dism_class =
151 (GstDeinterlaceSimpleMethodClass *) klass;
153 dim_class->fields_required = 2;
154 dim_class->name = "Blur: Temporal";
155 dim_class->nick = "linearblend";
156 dim_class->latency = 1;
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;
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;
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;
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;
211 gst_deinterlace_method_linear_blend_init (GstDeinterlaceMethodLinearBlend *