1 /* 2 * GStreamer 3 * Copyright (C) 2005 Martin Eikermann <meiker@upb.de> 4 * Copyright (C) 2008-2010 Sebastian Dröge <slomo@collabora.co.uk> 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Library General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Library General Public License for more details. 15 * 16 * You should have received a copy of the GNU Library General Public 17 * License along with this library; if not, write to the 18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 19 * Boston, MA 02110-1301, USA. 20 */ 21 22 #ifndef __GST_DEINTERLACE_H__ 23 #define __GST_DEINTERLACE_H__ 24 25 #include <gst/gst.h> 26 #include <gst/video/video.h> 27 #include <gst/video/gstvideopool.h> 28 #include <gst/video/gstvideometa.h> 29 30 #include "gstdeinterlacemethod.h" 31 32 G_BEGIN_DECLS 33 34 #define GST_TYPE_DEINTERLACE \ 35 (gst_deinterlace_get_type()) 36 #define GST_DEINTERLACE(obj) \ 37 (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DEINTERLACE,GstDeinterlace)) 38 #define GST_DEINTERLACE_CLASS(klass) \ 39 (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DEINTERLACE,GstDeinterlace)) 40 #define GST_IS_DEINTERLACE(obj) \ 41 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DEINTERLACE)) 42 #define GST_IS_DEINTERLACE_CLASS(obj) \ 43 (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DEINTERLACE)) 44 45 typedef struct _GstDeinterlace GstDeinterlace; 46 typedef struct _GstDeinterlaceClass GstDeinterlaceClass; 47 48 typedef enum 49 { 50 GST_DEINTERLACE_TOMSMOCOMP, 51 GST_DEINTERLACE_GREEDY_H, 52 GST_DEINTERLACE_GREEDY_L, 53 GST_DEINTERLACE_VFIR, 54 GST_DEINTERLACE_LINEAR, 55 GST_DEINTERLACE_LINEAR_BLEND, 56 GST_DEINTERLACE_SCALER_BOB, 57 GST_DEINTERLACE_WEAVE, 58 GST_DEINTERLACE_WEAVE_TFF, 59 GST_DEINTERLACE_WEAVE_BFF, 60 GST_DEINTERLACE_YADIF 61 } GstDeinterlaceMethods; 62 63 typedef enum 64 { 65 GST_DEINTERLACE_ALL, /* All (missing data is interp.) */ 66 GST_DEINTERLACE_TF, /* Top Fields Only */ 67 GST_DEINTERLACE_BF, /* Bottom Fields Only */ 68 GST_DEINTERLACE_FIELDS_AUTO /* Automatically detect */ 69 } GstDeinterlaceFields; 70 71 typedef enum 72 { 73 GST_DEINTERLACE_LAYOUT_AUTO, 74 GST_DEINTERLACE_LAYOUT_TFF, 75 GST_DEINTERLACE_LAYOUT_BFF 76 } GstDeinterlaceFieldLayout; 77 78 typedef enum { 79 GST_DEINTERLACE_MODE_AUTO, 80 GST_DEINTERLACE_MODE_INTERLACED, 81 GST_DEINTERLACE_MODE_DISABLED, 82 GST_DEINTERLACE_MODE_AUTO_STRICT 83 } GstDeinterlaceMode; 84 85 typedef enum 86 { 87 GST_DEINTERLACE_LOCKING_NONE, 88 GST_DEINTERLACE_LOCKING_AUTO, 89 GST_DEINTERLACE_LOCKING_ACTIVE, 90 GST_DEINTERLACE_LOCKING_PASSIVE, 91 } GstDeinterlaceLocking; 92 93 #define GST_DEINTERLACE_MAX_FIELD_HISTORY 10 94 #define GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY 50 95 /* check max field history is large enough */ 96 #if GST_DEINTERLACE_MAX_FIELD_HISTORY < GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY * 3 97 #undef GST_DEINTERLACE_MAX_FIELD_HISTORY 98 #define GST_DEINTERLACE_MAX_FIELD_HISTORY (GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY * 3) 99 #endif 100 101 typedef struct _TelecinePattern TelecinePattern; 102 struct _TelecinePattern 103 { 104 const gchar *nick; 105 guint8 length; 106 guint8 ratio_n, ratio_d; 107 guint8 states[GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY]; 108 }; 109 110 typedef struct _GstDeinterlaceBufferState GstDeinterlaceBufferState; 111 struct _GstDeinterlaceBufferState 112 { 113 GstClockTime timestamp; 114 GstClockTime duration; 115 guint8 state; 116 }; 117 118 struct _GstDeinterlace 119 { 120 GstElement parent; 121 122 GstPad *srcpad, *sinkpad; 123 124 /* <private> */ 125 GstDeinterlaceMode mode; 126 127 GstDeinterlaceFieldLayout field_layout; 128 129 GstDeinterlaceFields fields; 130 131 GstDeinterlaceFields user_set_fields; 132 133 /* current state (differs when flushing/inverse telecine using weave) */ 134 GstDeinterlaceMethods method_id; 135 /* property value */ 136 GstDeinterlaceMethods user_set_method_id; 137 GstDeinterlaceMethod *method; 138 139 GstVideoInfo vinfo; 140 GstVideoInfo vinfo_out; 141 GstBufferPool *pool; 142 GstAllocator *allocator; 143 GstAllocationParams params; 144 145 gboolean passthrough; 146 gboolean discont; 147 148 GstClockTime field_duration; /* Duration of one field */ 149 150 /* The most recent pictures 151 PictureHistory[0] is always the most recent. 152 Pointers are NULL if the picture in question isn't valid, e.g. because 153 the program just started or a picture was skipped. 154 */ 155 GstDeinterlaceField field_history[GST_DEINTERLACE_MAX_FIELD_HISTORY]; 156 guint history_count; 157 int cur_field_idx; 158 159 /* Set to TRUE if we're in still frame mode, 160 i.e. just forward all buffers 161 */ 162 gboolean still_frame_mode; 163 164 /* Last buffer that was pushed in */ 165 GstBuffer *last_buffer; 166 167 /* Current segment */ 168 GstSegment segment; 169 170 /* QoS stuff */ 171 gdouble proportion; 172 GstClockTime earliest_time; 173 gint64 processed; 174 gint64 dropped; 175 176 GstCaps *request_caps; 177 178 gboolean reconfigure; 179 GstDeinterlaceMode new_mode; 180 GstDeinterlaceFields new_fields; 181 182 GstDeinterlaceLocking locking; 183 gint low_latency; 184 gboolean drop_orphans; 185 gboolean ignore_obscure; 186 gboolean pattern_lock; 187 gboolean pattern_refresh; 188 GstDeinterlaceBufferState buf_states[GST_DEINTERLACE_MAX_BUFFER_STATE_HISTORY]; 189 gint state_count; 190 gint pattern; 191 guint8 pattern_phase; 192 guint8 pattern_count; 193 guint8 output_count; 194 GstClockTime pattern_base_ts; 195 GstClockTime pattern_buf_dur; 196 197 gboolean need_more; 198 gboolean have_eos; 199 gboolean telecine_tc_warned; 200 }; 201 202 struct _GstDeinterlaceClass 203 { 204 GstElementClass parent_class; 205 }; 206 207 GType gst_deinterlace_get_type (void); 208 209 GST_ELEMENT_REGISTER_DECLARE (deinterlace); 210 211 G_END_DECLS 212 213 #endif /* __GST_DEINTERLACE_H__ */ 214