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,
59 deinterlace_line_linear_blend (out, t0, b0, m1, size);
63 deinterlace_scanline_linear_blend_packed_c (GstDeinterlaceSimpleMethod * self,
64 guint8 * out, const GstDeinterlaceScanlineData * scanlines)
66 deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
67 scanlines->m1, self->parent.row_stride[0]);
71 deinterlace_scanline_linear_blend_planar_y_c (GstDeinterlaceSimpleMethod * self,
72 guint8 * out, const GstDeinterlaceScanlineData * scanlines)
74 deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
75 scanlines->m1, self->parent.row_stride[0]);
79 deinterlace_scanline_linear_blend_planar_u_c (GstDeinterlaceSimpleMethod * self,
80 guint8 * out, const GstDeinterlaceScanlineData * scanlines)
82 deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
83 scanlines->m1, self->parent.row_stride[1]);
87 deinterlace_scanline_linear_blend_planar_v_c (GstDeinterlaceSimpleMethod * self,
88 guint8 * out, const GstDeinterlaceScanlineData * scanlines)
90 deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
91 scanlines->m1, self->parent.row_stride[2]);
95 deinterlace_scanline_linear_blend2_c (GstDeinterlaceSimpleMethod * self,
96 guint8 * out, const guint8 * m0, const guint8 * t1, const guint8 * b1,
99 deinterlace_line_linear_blend (out, t1, b1, m0, size);
103 deinterlace_scanline_linear_blend2_packed_c (GstDeinterlaceSimpleMethod * self,
104 guint8 * out, const GstDeinterlaceScanlineData * scanlines)
106 deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
107 scanlines->b1, self->parent.row_stride[0]);
111 deinterlace_scanline_linear_blend2_planar_y_c (GstDeinterlaceSimpleMethod *
112 self, 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_u_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[1]);
127 deinterlace_scanline_linear_blend2_planar_v_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[2]);
134 G_DEFINE_TYPE (GstDeinterlaceMethodLinearBlend,
135 gst_deinterlace_method_linear_blend, GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
138 gst_deinterlace_method_linear_blend_class_init
139 (GstDeinterlaceMethodLinearBlendClass * klass)
141 GstDeinterlaceMethodClass *dim_class = (GstDeinterlaceMethodClass *) klass;
142 GstDeinterlaceSimpleMethodClass *dism_class =
143 (GstDeinterlaceSimpleMethodClass *) klass;
145 dim_class->fields_required = 2;
146 dim_class->name = "Blur: Temporal";
147 dim_class->nick = "linearblend";
148 dim_class->latency = 0;
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;
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;
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;
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;
203 gst_deinterlace_method_linear_blend_init (GstDeinterlaceMethodLinearBlend *