summaryrefslogtreecommitdiff
path: root/gst/deinterlace/gstdeinterlacemethod.h
blob: ee646328ee701c13f30d41a1f84cd709641c22b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/*
 * GStreamer
 * Copyright (C) 2008-2010 Sebastian Dröge <slomo@collabora.co.uk>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef __GST_DEINTERLACE_METHOD_H__
#define __GST_DEINTERLACE_METHOD_H__

#include <gst/gst.h>
#include <gst/video/video.h>

#if defined(HAVE_GCC_ASM) && defined(HAVE_ORC)
#if defined(HAVE_CPU_I386) || defined(HAVE_CPU_X86_64)
#define BUILD_X86_ASM
#endif
#endif

G_BEGIN_DECLS

#define GST_TYPE_DEINTERLACE_METHOD		(gst_deinterlace_method_get_type ())
#define GST_IS_DEINTERLACE_METHOD(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_METHOD))
#define GST_IS_DEINTERLACE_METHOD_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_METHOD))
#define GST_DEINTERLACE_METHOD_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethodClass))
#define GST_DEINTERLACE_METHOD(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethod))
#define GST_DEINTERLACE_METHOD_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_METHOD, GstDeinterlaceMethodClass))
#define GST_DEINTERLACE_METHOD_CAST(obj)	((GstDeinterlaceMethod*)(obj))

typedef struct _GstDeinterlaceMethod GstDeinterlaceMethod;
typedef struct _GstDeinterlaceMethodClass GstDeinterlaceMethodClass;


#define PICTURE_PROGRESSIVE 0
#define PICTURE_INTERLACED_BOTTOM 1
#define PICTURE_INTERLACED_TOP 2
#define PICTURE_INTERLACED_MASK (PICTURE_INTERLACED_BOTTOM | PICTURE_INTERLACED_TOP)

typedef struct
{
  GstVideoFrame *frame;
  /* see PICTURE_ flags in *.c */
  guint flags;
} GstDeinterlaceField;

/*
 * This structure defines the deinterlacer plugin.
 */

typedef void (*GstDeinterlaceMethodDeinterlaceFunction) (
    GstDeinterlaceMethod *self, const GstDeinterlaceField *history,
    guint history_count, GstVideoFrame *outframe, int cur_field_idx);

struct _GstDeinterlaceMethod {
  GstObject parent;

  GstVideoInfo *vinfo;

  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame;
};

struct _GstDeinterlaceMethodClass {
  GstObjectClass parent_class;
  guint fields_required;
  guint latency;

  gboolean (*supported) (GstDeinterlaceMethodClass *klass, GstVideoFormat format, gint width, gint height);

  void (*setup) (GstDeinterlaceMethod *self, GstVideoInfo * vinfo);

  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yuy2;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yvyu;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_uyvy;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_i420;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yv12;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y444;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y42b;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y41b;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_ayuv;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv12;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv21;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_argb;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_abgr;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgba;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_bgra;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgb;
  GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_bgr;

  const gchar *name;
  const gchar *nick;
};

GType gst_deinterlace_method_get_type (void);

gboolean gst_deinterlace_method_supported (GType type, GstVideoFormat format, gint width, gint height);
void gst_deinterlace_method_setup (GstDeinterlaceMethod * self, GstVideoInfo * vinfo);
void gst_deinterlace_method_deinterlace_frame (GstDeinterlaceMethod * self, const GstDeinterlaceField * history, guint history_count, GstVideoFrame * outframe,
    int cur_field_idx);
gint gst_deinterlace_method_get_fields_required (GstDeinterlaceMethod * self);
gint gst_deinterlace_method_get_latency (GstDeinterlaceMethod * self);

#define GST_TYPE_DEINTERLACE_SIMPLE_METHOD		(gst_deinterlace_simple_method_get_type ())
#define GST_IS_DEINTERLACE_SIMPLE_METHOD(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD))
#define GST_IS_DEINTERLACE_SIMPLE_METHOD_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_SIMPLE_METHOD))
#define GST_DEINTERLACE_SIMPLE_METHOD_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethodClass))
#define GST_DEINTERLACE_SIMPLE_METHOD(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethod))
#define GST_DEINTERLACE_SIMPLE_METHOD_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethodClass))
#define GST_DEINTERLACE_SIMPLE_METHOD_CAST(obj)	((GstDeinterlaceSimpleMethod*)(obj))

typedef struct _GstDeinterlaceSimpleMethod GstDeinterlaceSimpleMethod;
typedef struct _GstDeinterlaceSimpleMethodClass GstDeinterlaceSimpleMethodClass;
typedef struct _GstDeinterlaceScanlineData GstDeinterlaceScanlineData;

/*
 * This structure defines the simple deinterlacer plugin.
 */

struct _GstDeinterlaceScanlineData {
 const guint8 *ttp, *tp, *mp, *bp, *bbp;
 const guint8 *tt0, *t0, *m0, *b0, *bb0;
 const guint8 *tt1, *t1, *m1, *b1, *bb1;
 const guint8 *tt2, *t2, *m2, *b2, *bb2;
 gboolean bottom_field;
};

/*
 * For interpolate_scanline the input is:
 *
 * |   t-3       t-2       t-1       t        t+1
 * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1
 * |  TT3    |         |   TT1   |         |   TTp
 * |         |   T2    |         |   T0    |
 * |   M3    |         |    M1   |         |    Mp
 * |         |   B2    |         |   B0    |
 * |  BB3    |         |   BB1   |         |   BBp
 *
 * For copy_scanline the input is:
 *
 * |   t-3       t-2       t-1       t         t+1
 * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1
 * |         |   TT2   |         |  TT0    |
 * |   T3    |         |   T1    |         |   Tp
 * |         |    M2   |         |   M0    |
 * |   B3    |         |   B1    |         |   Bp
 * |         |   BB2   |         |  BB0    |
 *
 * All other values are NULL.
 */

typedef void (*GstDeinterlaceSimpleMethodFunction) (GstDeinterlaceSimpleMethod *self, guint8 *out, const GstDeinterlaceScanlineData *scanlines, guint size);

struct _GstDeinterlaceSimpleMethod {
  GstDeinterlaceMethod parent;

  GstDeinterlaceSimpleMethodFunction interpolate_scanline_packed;
  GstDeinterlaceSimpleMethodFunction copy_scanline_packed;

  GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar[3];
  GstDeinterlaceSimpleMethodFunction copy_scanline_planar[3];
};

struct _GstDeinterlaceSimpleMethodClass {
  GstDeinterlaceMethodClass parent_class;

  /* Packed formats */
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_yuy2;
  GstDeinterlaceSimpleMethodFunction copy_scanline_yuy2;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_yvyu;
  GstDeinterlaceSimpleMethodFunction copy_scanline_yvyu;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_uyvy;
  GstDeinterlaceSimpleMethodFunction copy_scanline_uyvy;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_ayuv;
  GstDeinterlaceSimpleMethodFunction copy_scanline_ayuv;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_argb;
  GstDeinterlaceSimpleMethodFunction copy_scanline_argb;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_abgr;
  GstDeinterlaceSimpleMethodFunction copy_scanline_abgr;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_rgba;
  GstDeinterlaceSimpleMethodFunction copy_scanline_rgba;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgra;
  GstDeinterlaceSimpleMethodFunction copy_scanline_bgra;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_rgb;
  GstDeinterlaceSimpleMethodFunction copy_scanline_rgb;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgr;
  GstDeinterlaceSimpleMethodFunction copy_scanline_bgr;

  /* Semi-planar formats */
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv12;
  GstDeinterlaceSimpleMethodFunction copy_scanline_nv12;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv21;
  GstDeinterlaceSimpleMethodFunction copy_scanline_nv21;

  /* Planar formats */
  GstDeinterlaceSimpleMethodFunction copy_scanline_planar_y;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_y;
  GstDeinterlaceSimpleMethodFunction copy_scanline_planar_u;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_u;
  GstDeinterlaceSimpleMethodFunction copy_scanline_planar_v;
  GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_v;
};

GType gst_deinterlace_simple_method_get_type (void);

G_END_DECLS

#endif /* __GST_DEINTERLACE_METHOD_H__ */