1/* vim: set filetype=c: */ 2% ClassName 3GstBaseSrc 4% TYPE_CLASS_NAME 5GST_TYPE_BASE_SRC 6% pads 7srcpad-simple 8% pkg-config 9gstreamer-base-1.0 10% includes 11#include <gst/base/gstbasesrc.h> 12% prototypes 13static GstCaps *gst_replace_get_caps (GstBaseSrc * src, GstCaps * filter); 14static gboolean gst_replace_negotiate (GstBaseSrc * src); 15static GstCaps *gst_replace_fixate (GstBaseSrc * src, GstCaps * caps); 16static gboolean gst_replace_set_caps (GstBaseSrc * src, GstCaps * caps); 17static gboolean gst_replace_decide_allocation (GstBaseSrc * src, 18 GstQuery * query); 19static gboolean gst_replace_start (GstBaseSrc * src); 20static gboolean gst_replace_stop (GstBaseSrc * src); 21static void gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer, 22 GstClockTime * start, GstClockTime * end); 23static gboolean gst_replace_get_size (GstBaseSrc * src, guint64 * size); 24static gboolean gst_replace_is_seekable (GstBaseSrc * src); 25static gboolean gst_replace_prepare_seek_segment (GstBaseSrc * src, 26 GstEvent * seek, GstSegment * segment); 27static gboolean gst_replace_do_seek (GstBaseSrc * src, GstSegment * segment); 28static gboolean gst_replace_unlock (GstBaseSrc * src); 29static gboolean gst_replace_unlock_stop (GstBaseSrc * src); 30static gboolean gst_replace_query (GstBaseSrc * src, GstQuery * query); 31static gboolean gst_replace_event (GstBaseSrc * src, GstEvent * event); 32static GstFlowReturn gst_replace_create (GstBaseSrc * src, guint64 offset, 33 guint size, GstBuffer ** buf); 34static GstFlowReturn gst_replace_alloc (GstBaseSrc * src, guint64 offset, 35 guint size, GstBuffer ** buf); 36static GstFlowReturn gst_replace_fill (GstBaseSrc * src, guint64 offset, 37 guint size, GstBuffer * buf); 38% declare-class 39 GstBaseSrcClass *base_src_class = GST_BASE_SRC_CLASS (klass); 40% set-methods 41 base_src_class->get_caps = GST_DEBUG_FUNCPTR (gst_replace_get_caps); 42 base_src_class->negotiate = GST_DEBUG_FUNCPTR (gst_replace_negotiate); 43 base_src_class->fixate = GST_DEBUG_FUNCPTR (gst_replace_fixate); 44 base_src_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps); 45 base_src_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_replace_decide_allocation); 46 base_src_class->start = GST_DEBUG_FUNCPTR (gst_replace_start); 47 base_src_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop); 48 base_src_class->get_times = GST_DEBUG_FUNCPTR (gst_replace_get_times); 49 base_src_class->get_size = GST_DEBUG_FUNCPTR (gst_replace_get_size); 50 base_src_class->is_seekable = GST_DEBUG_FUNCPTR (gst_replace_is_seekable); 51 base_src_class->prepare_seek_segment = GST_DEBUG_FUNCPTR (gst_replace_prepare_seek_segment); 52 base_src_class->do_seek = GST_DEBUG_FUNCPTR (gst_replace_do_seek); 53 base_src_class->unlock = GST_DEBUG_FUNCPTR (gst_replace_unlock); 54 base_src_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_replace_unlock_stop); 55 base_src_class->query = GST_DEBUG_FUNCPTR (gst_replace_query); 56 base_src_class->event = GST_DEBUG_FUNCPTR (gst_replace_event); 57 base_src_class->create = GST_DEBUG_FUNCPTR (gst_replace_create); 58 base_src_class->alloc = GST_DEBUG_FUNCPTR (gst_replace_alloc); 59 base_src_class->fill = GST_DEBUG_FUNCPTR (gst_replace_fill); 60% methods 61/* get caps from subclass */ 62static GstCaps * 63gst_replace_get_caps (GstBaseSrc * src, GstCaps * filter) 64{ 65 GstReplace *replace = GST_REPLACE (src); 66 67 GST_DEBUG_OBJECT (replace, "get_caps"); 68 69 return NULL; 70} 71 72/* decide on caps */ 73static gboolean 74gst_replace_negotiate (GstBaseSrc * src) 75{ 76 GstReplace *replace = GST_REPLACE (src); 77 78 GST_DEBUG_OBJECT (replace, "negotiate"); 79 80 return TRUE; 81} 82 83/* called if, in negotiation, caps need fixating */ 84static GstCaps * 85gst_replace_fixate (GstBaseSrc * src, GstCaps * caps) 86{ 87 GstReplace *replace = GST_REPLACE (src); 88 89 GST_DEBUG_OBJECT (replace, "fixate"); 90 91 return NULL; 92} 93 94/* notify the subclass of new caps */ 95static gboolean 96gst_replace_set_caps (GstBaseSrc * src, GstCaps * caps) 97{ 98 GstReplace *replace = GST_REPLACE (src); 99 100 GST_DEBUG_OBJECT (replace, "set_caps"); 101 102 return TRUE; 103} 104 105/* setup allocation query */ 106static gboolean 107gst_replace_decide_allocation (GstBaseSrc * src, GstQuery * query) 108{ 109 GstReplace *replace = GST_REPLACE (src); 110 111 GST_DEBUG_OBJECT (replace, "decide_allocation"); 112 113 return TRUE; 114} 115 116/* start and stop processing, ideal for opening/closing the resource */ 117static gboolean 118gst_replace_start (GstBaseSrc * src) 119{ 120 GstReplace *replace = GST_REPLACE (src); 121 122 GST_DEBUG_OBJECT (replace, "start"); 123 124 return TRUE; 125} 126 127static gboolean 128gst_replace_stop (GstBaseSrc * src) 129{ 130 GstReplace *replace = GST_REPLACE (src); 131 132 GST_DEBUG_OBJECT (replace, "stop"); 133 134 return TRUE; 135} 136 137/* given a buffer, return start and stop time when it should be pushed 138 * out. The base class will sync on the clock using these times. */ 139static void 140gst_replace_get_times (GstBaseSrc * src, GstBuffer * buffer, 141 GstClockTime * start, GstClockTime * end) 142{ 143 GstReplace *replace = GST_REPLACE (src); 144 145 GST_DEBUG_OBJECT (replace, "get_times"); 146 147} 148 149/* get the total size of the resource in bytes */ 150static gboolean 151gst_replace_get_size (GstBaseSrc * src, guint64 * size) 152{ 153 GstReplace *replace = GST_REPLACE (src); 154 155 GST_DEBUG_OBJECT (replace, "get_size"); 156 157 return TRUE; 158} 159 160/* check if the resource is seekable */ 161static gboolean 162gst_replace_is_seekable (GstBaseSrc * src) 163{ 164 GstReplace *replace = GST_REPLACE (src); 165 166 GST_DEBUG_OBJECT (replace, "is_seekable"); 167 168 return TRUE; 169} 170 171/* Prepare the segment on which to perform do_seek(), converting to the 172 * current basesrc format. */ 173static gboolean 174gst_replace_prepare_seek_segment (GstBaseSrc * src, GstEvent * seek, 175 GstSegment * segment) 176{ 177 GstReplace *replace = GST_REPLACE (src); 178 179 GST_DEBUG_OBJECT (replace, "prepare_seek_segment"); 180 181 return TRUE; 182} 183 184/* notify subclasses of a seek */ 185static gboolean 186gst_replace_do_seek (GstBaseSrc * src, GstSegment * segment) 187{ 188 GstReplace *replace = GST_REPLACE (src); 189 190 GST_DEBUG_OBJECT (replace, "do_seek"); 191 192 return TRUE; 193} 194 195/* unlock any pending access to the resource. subclasses should unlock 196 * any function ASAP. */ 197static gboolean 198gst_replace_unlock (GstBaseSrc * src) 199{ 200 GstReplace *replace = GST_REPLACE (src); 201 202 GST_DEBUG_OBJECT (replace, "unlock"); 203 204 return TRUE; 205} 206 207/* Clear any pending unlock request, as we succeeded in unlocking */ 208static gboolean 209gst_replace_unlock_stop (GstBaseSrc * src) 210{ 211 GstReplace *replace = GST_REPLACE (src); 212 213 GST_DEBUG_OBJECT (replace, "unlock_stop"); 214 215 return TRUE; 216} 217 218/* notify subclasses of a query */ 219static gboolean 220gst_replace_query (GstBaseSrc * src, GstQuery * query) 221{ 222 GstReplace *replace = GST_REPLACE (src); 223 224 GST_DEBUG_OBJECT (replace, "query"); 225 226 return TRUE; 227} 228 229/* notify subclasses of an event */ 230static gboolean 231gst_replace_event (GstBaseSrc * src, GstEvent * event) 232{ 233 GstReplace *replace = GST_REPLACE (src); 234 235 GST_DEBUG_OBJECT (replace, "event"); 236 237 return TRUE; 238} 239 240/* ask the subclass to create a buffer with offset and size, the default 241 * implementation will call alloc and fill. */ 242static GstFlowReturn 243gst_replace_create (GstBaseSrc * src, guint64 offset, guint size, 244 GstBuffer ** buf) 245{ 246 GstReplace *replace = GST_REPLACE (src); 247 248 GST_DEBUG_OBJECT (replace, "create"); 249 250 return GST_FLOW_OK; 251} 252 253/* ask the subclass to allocate an output buffer. The default implementation 254 * will use the negotiated allocator. */ 255static GstFlowReturn 256gst_replace_alloc (GstBaseSrc * src, guint64 offset, guint size, 257 GstBuffer ** buf) 258{ 259 GstReplace *replace = GST_REPLACE (src); 260 261 GST_DEBUG_OBJECT (replace, "alloc"); 262 263 return GST_FLOW_OK; 264} 265 266/* ask the subclass to fill the buffer with data from offset and size */ 267static GstFlowReturn 268gst_replace_fill (GstBaseSrc * src, guint64 offset, guint size, GstBuffer * buf) 269{ 270 GstReplace *replace = GST_REPLACE (src); 271 272 GST_DEBUG_OBJECT (replace, "fill"); 273 274 return GST_FLOW_OK; 275} 276% end 277