3 * Copyright (C) 2008-2010 Sebastian Dröge <slomo@collabora.co.uk>
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.
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.
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.
21 #ifndef __GST_DEINTERLACE_METHOD_H__
22 #define __GST_DEINTERLACE_METHOD_H__
25 #include <gst/video/video.h>
27 #if defined(HAVE_GCC_ASM) && defined(HAVE_ORC)
28 #if defined(HAVE_CPU_I386) || defined(HAVE_CPU_X86_64)
35 #define GST_TYPE_DEINTERLACE_METHOD (gst_deinterlace_method_get_type ())
36 #define GST_IS_DEINTERLACE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD))
37 #define GST_IS_DEINTERLACE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD))
38 #define GST_DEINTERLACE_METHOD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethodClass))
39 #define GST_DEINTERLACE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethod))
40 #define GST_DEINTERLACE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethodClass))
41 #define GST_DEINTERLACE_METHOD_CAST(obj) ((GstDeinterlaceMethod*)(obj))
43 typedef struct _GstDeinterlaceMethod GstDeinterlaceMethod;
44 typedef struct _GstDeinterlaceMethodClass GstDeinterlaceMethodClass;
47 #define PICTURE_PROGRESSIVE 0
48 #define PICTURE_INTERLACED_BOTTOM 1
49 #define PICTURE_INTERLACED_TOP 2
50 #define PICTURE_INTERLACED_MASK (PICTURE_INTERLACED_BOTTOM | PICTURE_INTERLACED_TOP)
54 /* pointer to the start of data for this field */
56 /* see PICTURE_ flags in *.c */
58 } GstDeinterlaceField;
61 * This structure defines the deinterlacer plugin.
64 typedef void (*GstDeinterlaceMethodDeinterlaceFunction) (
65 GstDeinterlaceMethod *self, const GstDeinterlaceField *history,
66 guint history_count, GstBuffer *outbuf, int cur_field_idx);
68 struct _GstDeinterlaceMethod {
71 GstVideoFormat format;
72 gint frame_width, frame_height;
79 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame;
82 struct _GstDeinterlaceMethodClass {
83 GstObjectClass parent_class;
84 guint fields_required;
87 gboolean (*supported) (GstDeinterlaceMethodClass *klass, GstVideoFormat format, gint width, gint height);
89 void (*setup) (GstDeinterlaceMethod *self, GstVideoFormat format, gint width, gint height);
91 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yuy2;
92 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yvyu;
93 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_uyvy;
94 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_i420;
95 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yv12;
96 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y444;
97 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y42b;
98 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y41b;
99 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_ayuv;
100 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv12;
101 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv21;
102 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_argb;
103 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_abgr;
104 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgba;
105 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_bgra;
106 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgb;
107 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_bgr;
113 GType gst_deinterlace_method_get_type (void);
115 gboolean gst_deinterlace_method_supported (GType type, GstVideoFormat format, gint width, gint height);
116 void gst_deinterlace_method_setup (GstDeinterlaceMethod * self, GstVideoFormat format, gint width, gint height);
117 void gst_deinterlace_method_deinterlace_frame (GstDeinterlaceMethod * self, const GstDeinterlaceField * history, guint history_count, GstBuffer * outbuf,
119 gint gst_deinterlace_method_get_fields_required (GstDeinterlaceMethod * self);
120 gint gst_deinterlace_method_get_latency (GstDeinterlaceMethod * self);
122 #define GST_TYPE_DEINTERLACE_SIMPLE_METHOD (gst_deinterlace_simple_method_get_type ())
123 #define GST_IS_DEINTERLACE_SIMPLE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD))
124 #define GST_IS_DEINTERLACE_SIMPLE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_SIMPLE_METHOD))
125 #define GST_DEINTERLACE_SIMPLE_METHOD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethodClass))
126 #define GST_DEINTERLACE_SIMPLE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethod))
127 #define GST_DEINTERLACE_SIMPLE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethodClass))
128 #define GST_DEINTERLACE_SIMPLE_METHOD_CAST(obj) ((GstDeinterlaceSimpleMethod*)(obj))
130 typedef struct _GstDeinterlaceSimpleMethod GstDeinterlaceSimpleMethod;
131 typedef struct _GstDeinterlaceSimpleMethodClass GstDeinterlaceSimpleMethodClass;
132 typedef struct _GstDeinterlaceScanlineData GstDeinterlaceScanlineData;
135 * This structure defines the simple deinterlacer plugin.
138 struct _GstDeinterlaceScanlineData {
139 const guint8 *ttp, *tp, *mp, *bp, *bbp;
140 const guint8 *tt0, *t0, *m0, *b0, *bb0;
141 const guint8 *tt1, *t1, *m1, *b1, *bb1;
142 const guint8 *tt2, *t2, *m2, *b2, *bb2;
143 gboolean bottom_field;
147 * For interpolate_scanline the input is:
149 * | t-3 t-2 t-1 t t+1
150 * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1
151 * | TT3 | | TT1 | | TTp
155 * | BB3 | | BB1 | | BBp
157 * For copy_scanline the input is:
159 * | t-3 t-2 t-1 t t+1
160 * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1
167 * All other values are NULL.
170 typedef void (*GstDeinterlaceSimpleMethodFunction) (GstDeinterlaceSimpleMethod *self, guint8 *out, const GstDeinterlaceScanlineData *scanlines);
172 struct _GstDeinterlaceSimpleMethod {
173 GstDeinterlaceMethod parent;
175 GstDeinterlaceSimpleMethodFunction interpolate_scanline_packed;
176 GstDeinterlaceSimpleMethodFunction copy_scanline_packed;
178 GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar[3];
179 GstDeinterlaceSimpleMethodFunction copy_scanline_planar[3];
182 struct _GstDeinterlaceSimpleMethodClass {
183 GstDeinterlaceMethodClass parent_class;
186 GstDeinterlaceSimpleMethodFunction interpolate_scanline_yuy2;
187 GstDeinterlaceSimpleMethodFunction copy_scanline_yuy2;
188 GstDeinterlaceSimpleMethodFunction interpolate_scanline_yvyu;
189 GstDeinterlaceSimpleMethodFunction copy_scanline_yvyu;
190 GstDeinterlaceSimpleMethodFunction interpolate_scanline_uyvy;
191 GstDeinterlaceSimpleMethodFunction copy_scanline_uyvy;
192 GstDeinterlaceSimpleMethodFunction interpolate_scanline_ayuv;
193 GstDeinterlaceSimpleMethodFunction copy_scanline_ayuv;
194 GstDeinterlaceSimpleMethodFunction interpolate_scanline_argb;
195 GstDeinterlaceSimpleMethodFunction copy_scanline_argb;
196 GstDeinterlaceSimpleMethodFunction interpolate_scanline_abgr;
197 GstDeinterlaceSimpleMethodFunction copy_scanline_abgr;
198 GstDeinterlaceSimpleMethodFunction interpolate_scanline_rgba;
199 GstDeinterlaceSimpleMethodFunction copy_scanline_rgba;
200 GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgra;
201 GstDeinterlaceSimpleMethodFunction copy_scanline_bgra;
202 GstDeinterlaceSimpleMethodFunction interpolate_scanline_rgb;
203 GstDeinterlaceSimpleMethodFunction copy_scanline_rgb;
204 GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgr;
205 GstDeinterlaceSimpleMethodFunction copy_scanline_bgr;
207 /* Semi-planar formats */
208 GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv12;
209 GstDeinterlaceSimpleMethodFunction copy_scanline_nv12;
210 GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv21;
211 GstDeinterlaceSimpleMethodFunction copy_scanline_nv21;
214 GstDeinterlaceSimpleMethodFunction copy_scanline_planar_y;
215 GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_y;
216 GstDeinterlaceSimpleMethodFunction copy_scanline_planar_u;
217 GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_u;
218 GstDeinterlaceSimpleMethodFunction copy_scanline_planar_v;
219 GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_v;
222 GType gst_deinterlace_simple_method_get_type (void);
226 #endif /* __GST_DEINTERLACE_METHOD_H__ */