1 /* 2 * GStreamer 3 * Copyright (C) 2008-2010 Sebastian Dröge <slomo@collabora.co.uk> 4 * 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. 9 * 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. 14 * 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., 51 Franklin St, Fifth Floor, 18 * Boston, MA 02110-1301, USA. 19 */ 20 21 #ifndef __GST_DEINTERLACE_METHOD_H__ 22 #define __GST_DEINTERLACE_METHOD_H__ 23 24 #include <gst/gst.h> 25 #include <gst/video/video.h> 26 27 #if defined(HAVE_GCC_ASM) && defined(HAVE_ORC) 28 #if defined(HAVE_CPU_I386) || defined(HAVE_CPU_X86_64) 29 #define BUILD_X86_ASM 30 #endif 31 #endif 32 33 G_BEGIN_DECLS 34 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)) 42 43 typedef struct _GstDeinterlaceMethod GstDeinterlaceMethod; 44 typedef struct _GstDeinterlaceMethodClass GstDeinterlaceMethodClass; 45 46 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) 51 52 typedef struct 53 { 54 GstVideoFrame *frame; 55 /* see PICTURE_ flags in *.c */ 56 guint flags; 57 GstVideoTimeCode *tc; 58 GstVideoCaptionMeta *caption; 59 } GstDeinterlaceField; 60 61 /* 62 * This structure defines the deinterlacer plugin. 63 */ 64 65 typedef void (*GstDeinterlaceMethodDeinterlaceFunction) ( 66 GstDeinterlaceMethod *self, const GstDeinterlaceField *history, 67 guint history_count, GstVideoFrame *outframe, int cur_field_idx); 68 69 struct _GstDeinterlaceMethod { 70 GstObject parent; 71 72 GstVideoInfo *vinfo; 73 74 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame; 75 }; 76 77 struct _GstDeinterlaceMethodClass { 78 GstObjectClass parent_class; 79 guint fields_required; 80 guint latency; 81 82 gboolean (*supported) (GstDeinterlaceMethodClass *klass, GstVideoFormat format, gint width, gint height); 83 84 void (*setup) (GstDeinterlaceMethod *self, GstVideoInfo * vinfo); 85 86 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yuy2; 87 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yvyu; 88 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_uyvy; 89 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_i420; 90 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_yv12; 91 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y444; 92 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y42b; 93 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y41b; 94 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_ayuv; 95 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv12; 96 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv21; 97 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_argb; 98 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_abgr; 99 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgba; 100 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_bgra; 101 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgb; 102 GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_bgr; 103 104 const gchar *name; 105 const gchar *nick; 106 }; 107 108 GType gst_deinterlace_method_get_type (void); 109 110 gboolean gst_deinterlace_method_supported (GType type, GstVideoFormat format, gint width, gint height); 111 void gst_deinterlace_method_setup (GstDeinterlaceMethod * self, GstVideoInfo * vinfo); 112 void gst_deinterlace_method_deinterlace_frame (GstDeinterlaceMethod * self, const GstDeinterlaceField * history, guint history_count, GstVideoFrame * outframe, 113 int cur_field_idx); 114 gint gst_deinterlace_method_get_fields_required (GstDeinterlaceMethod * self); 115 gint gst_deinterlace_method_get_latency (GstDeinterlaceMethod * self); 116 117 #define GST_TYPE_DEINTERLACE_SIMPLE_METHOD (gst_deinterlace_simple_method_get_type ()) 118 #define GST_IS_DEINTERLACE_SIMPLE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD)) 119 #define GST_IS_DEINTERLACE_SIMPLE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DEINTERLACE_SIMPLE_METHOD)) 120 #define GST_DEINTERLACE_SIMPLE_METHOD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethodClass)) 121 #define GST_DEINTERLACE_SIMPLE_METHOD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethod)) 122 #define GST_DEINTERLACE_SIMPLE_METHOD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEINTERLACE_SIMPLE_METHOD, GstDeinterlaceSimpleMethodClass)) 123 #define GST_DEINTERLACE_SIMPLE_METHOD_CAST(obj) ((GstDeinterlaceSimpleMethod*)(obj)) 124 125 typedef struct _GstDeinterlaceSimpleMethod GstDeinterlaceSimpleMethod; 126 typedef struct _GstDeinterlaceSimpleMethodClass GstDeinterlaceSimpleMethodClass; 127 typedef struct _GstDeinterlaceScanlineData GstDeinterlaceScanlineData; 128 129 /* 130 * This structure defines the simple deinterlacer plugin. 131 */ 132 133 struct _GstDeinterlaceScanlineData { 134 const guint8 *ttp, *tp, *mp, *bp, *bbp; 135 const guint8 *tt0, *t0, *m0, *b0, *bb0; 136 const guint8 *tt1, *t1, *m1, *b1, *bb1; 137 const guint8 *tt2, *t2, *m2, *b2, *bb2; 138 const guint8 *tp2, *bp2; 139 gboolean bottom_field; 140 }; 141 142 /* 143 * For interpolate_scanline the input is: 144 * 145 * | t-3 t-2 t-1 t t+1 t+2 146 * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1 | Field -2 147 * | TT3 | | TT1 | | TTp | 148 * | | T2 | | T0 | | Tp2 149 * | M3 | | M1 | | Mp | 150 * | | B2 | | B0 | | Bp2 151 * | BB3 | | BB1 | | BBp | 152 * 153 * For copy_scanline the input is: 154 * 155 * | t-3 t-2 t-1 t t+1 156 * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1 157 * | | TT2 | | TT0 | 158 * | T3 | | T1 | | Tp 159 * | | M2 | | M0 | 160 * | B3 | | B1 | | Bp 161 * | | BB2 | | BB0 | 162 * 163 * All other values are NULL. 164 */ 165 166 typedef void (*GstDeinterlaceSimpleMethodFunction) (GstDeinterlaceSimpleMethod *self, guint8 *out, const GstDeinterlaceScanlineData *scanlines, guint size); 167 168 struct _GstDeinterlaceSimpleMethod { 169 GstDeinterlaceMethod parent; 170 171 GstDeinterlaceSimpleMethodFunction interpolate_scanline_packed; 172 GstDeinterlaceSimpleMethodFunction copy_scanline_packed; 173 174 GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar[3]; 175 GstDeinterlaceSimpleMethodFunction copy_scanline_planar[3]; 176 }; 177 178 struct _GstDeinterlaceSimpleMethodClass { 179 GstDeinterlaceMethodClass parent_class; 180 181 /* Packed formats */ 182 GstDeinterlaceSimpleMethodFunction interpolate_scanline_yuy2; 183 GstDeinterlaceSimpleMethodFunction copy_scanline_yuy2; 184 GstDeinterlaceSimpleMethodFunction interpolate_scanline_yvyu; 185 GstDeinterlaceSimpleMethodFunction copy_scanline_yvyu; 186 GstDeinterlaceSimpleMethodFunction interpolate_scanline_uyvy; 187 GstDeinterlaceSimpleMethodFunction copy_scanline_uyvy; 188 GstDeinterlaceSimpleMethodFunction interpolate_scanline_ayuv; 189 GstDeinterlaceSimpleMethodFunction copy_scanline_ayuv; 190 GstDeinterlaceSimpleMethodFunction interpolate_scanline_argb; 191 GstDeinterlaceSimpleMethodFunction copy_scanline_argb; 192 GstDeinterlaceSimpleMethodFunction interpolate_scanline_abgr; 193 GstDeinterlaceSimpleMethodFunction copy_scanline_abgr; 194 GstDeinterlaceSimpleMethodFunction interpolate_scanline_rgba; 195 GstDeinterlaceSimpleMethodFunction copy_scanline_rgba; 196 GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgra; 197 GstDeinterlaceSimpleMethodFunction copy_scanline_bgra; 198 GstDeinterlaceSimpleMethodFunction interpolate_scanline_rgb; 199 GstDeinterlaceSimpleMethodFunction copy_scanline_rgb; 200 GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgr; 201 GstDeinterlaceSimpleMethodFunction copy_scanline_bgr; 202 203 /* Semi-planar formats */ 204 GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv12; 205 GstDeinterlaceSimpleMethodFunction copy_scanline_nv12; 206 GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv21; 207 GstDeinterlaceSimpleMethodFunction copy_scanline_nv21; 208 209 /* Planar formats */ 210 GstDeinterlaceSimpleMethodFunction copy_scanline_planar_y; 211 GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_y; 212 GstDeinterlaceSimpleMethodFunction copy_scanline_planar_u; 213 GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_u; 214 GstDeinterlaceSimpleMethodFunction copy_scanline_planar_v; 215 GstDeinterlaceSimpleMethodFunction interpolate_scanline_planar_v; 216 }; 217 218 GType gst_deinterlace_simple_method_get_type (void); 219 220 G_END_DECLS 221 222 #endif /* __GST_DEINTERLACE_METHOD_H__ */ 223