1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License
6  * as published by the Free Software Foundation; either version 3
7  * of the License, or (at your option) any later version, with
8  * some exceptions, please read the COPYING file.
9  *
10  * gtkD 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
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with gtkD; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
18  */
19 
20 // generated automatically - do not change
21 // find conversion definition on APILookup.txt
22 // implement new conversion functionalities on the wrap.utils pakage
23 
24 
25 module gst.base.CollectPads;
26 
27 private import glib.ConstructionException;
28 private import gobject.ObjectG;
29 private import gst.base.c.functions;
30 public  import gst.base.c.types;
31 private import gstreamer.Buffer;
32 private import gstreamer.Event;
33 private import gstreamer.ObjectGst;
34 private import gstreamer.Pad;
35 private import gstreamer.Query;
36 
37 
38 /**
39  * Manages a set of pads that operate in collect mode. This means that control
40  * is given to the manager of this object when all pads have data.
41  * 
42  * * Collectpads are created with gst_collect_pads_new(). A callback should then
43  * be installed with gst_collect_pads_set_function ().
44  * 
45  * * Pads are added to the collection with gst_collect_pads_add_pad()/
46  * gst_collect_pads_remove_pad(). The pad has to be a sinkpad. When added,
47  * the chain, event and query functions of the pad are overridden. The
48  * element_private of the pad is used to store private information for the
49  * collectpads.
50  * 
51  * * For each pad, data is queued in the _chain function or by
52  * performing a pull_range.
53  * 
54  * * When data is queued on all pads in waiting mode, the callback function is called.
55  * 
56  * * Data can be dequeued from the pad with the gst_collect_pads_pop() method.
57  * One can peek at the data with the gst_collect_pads_peek() function.
58  * These functions will return %NULL if the pad received an EOS event. When all
59  * pads return %NULL from a gst_collect_pads_peek(), the element can emit an EOS
60  * event itself.
61  * 
62  * * Data can also be dequeued in byte units using the gst_collect_pads_available(),
63  * gst_collect_pads_read_buffer() and gst_collect_pads_flush() calls.
64  * 
65  * * Elements should call gst_collect_pads_start() and gst_collect_pads_stop() in
66  * their state change functions to start and stop the processing of the collectpads.
67  * The gst_collect_pads_stop() call should be called before calling the parent
68  * element state change function in the PAUSED_TO_READY state change to ensure
69  * no pad is blocked and the element can finish streaming.
70  * 
71  * * gst_collect_pads_set_waiting() sets a pad to waiting or non-waiting mode.
72  * CollectPads element is not waiting for data to be collected on non-waiting pads.
73  * Thus these pads may but need not have data when the callback is called.
74  * All pads are in waiting mode by default.
75  */
76 public class CollectPads : ObjectGst
77 {
78 	/** the main Gtk struct */
79 	protected GstCollectPads* gstCollectPads;
80 
81 	/** Get the main Gtk struct */
82 	public GstCollectPads* getCollectPadsStruct(bool transferOwnership = false)
83 	{
84 		if (transferOwnership)
85 			ownedRef = false;
86 		return gstCollectPads;
87 	}
88 
89 	/** the main Gtk struct as a void* */
90 	protected override void* getStruct()
91 	{
92 		return cast(void*)gstCollectPads;
93 	}
94 
95 	/**
96 	 * Sets our main struct and passes it to the parent class.
97 	 */
98 	public this (GstCollectPads* gstCollectPads, bool ownedRef = false)
99 	{
100 		this.gstCollectPads = gstCollectPads;
101 		super(cast(GstObject*)gstCollectPads, ownedRef);
102 	}
103 
104 
105 	/** */
106 	public static GType getType()
107 	{
108 		return gst_collect_pads_get_type();
109 	}
110 
111 	/**
112 	 * Create a new instance of #GstCollectPads.
113 	 *
114 	 * MT safe.
115 	 *
116 	 * Returns: a new #GstCollectPads, or %NULL in case of an error.
117 	 *
118 	 * Throws: ConstructionException GTK+ fails to create the object.
119 	 */
120 	public this()
121 	{
122 		auto p = gst_collect_pads_new();
123 
124 		if(p is null)
125 		{
126 			throw new ConstructionException("null returned by new");
127 		}
128 
129 		this(cast(GstCollectPads*) p, true);
130 	}
131 
132 	/**
133 	 * Add a pad to the collection of collect pads. The pad has to be
134 	 * a sinkpad. The refcount of the pad is incremented. Use
135 	 * gst_collect_pads_remove_pad() to remove the pad from the collection
136 	 * again.
137 	 *
138 	 * You specify a size for the returned #GstCollectData structure
139 	 * so that you can use it to store additional information.
140 	 *
141 	 * You can also specify a #GstCollectDataDestroyNotify that will be called
142 	 * just before the #GstCollectData structure is freed. It is passed the
143 	 * pointer to the structure and should free any custom memory and resources
144 	 * allocated for it.
145 	 *
146 	 * Keeping a pad locked in waiting state is only relevant when using
147 	 * the default collection algorithm (providing the oldest buffer).
148 	 * It ensures a buffer must be available on this pad for a collection
149 	 * to take place.  This is of typical use to a muxer element where
150 	 * non-subtitle streams should always be in waiting state,
151 	 * e.g. to assure that caps information is available on all these streams
152 	 * when initial headers have to be written.
153 	 *
154 	 * The pad will be automatically activated in push mode when @pads is
155 	 * started.
156 	 *
157 	 * MT safe.
158 	 *
159 	 * Params:
160 	 *     pad = the pad to add
161 	 *     size = the size of the returned #GstCollectData structure
162 	 *     destroyNotify = function to be called before the returned
163 	 *         #GstCollectData structure is freed
164 	 *     lock = whether to lock this pad in usual waiting state
165 	 *
166 	 * Returns: a new #GstCollectData to identify the
167 	 *     new pad. Or %NULL if wrong parameters are supplied.
168 	 */
169 	public GstCollectData* addPad(Pad pad, uint size, GstCollectDataDestroyNotify destroyNotify, bool lock)
170 	{
171 		return gst_collect_pads_add_pad(gstCollectPads, (pad is null) ? null : pad.getPadStruct(), size, destroyNotify, lock);
172 	}
173 
174 	/**
175 	 * Query how much bytes can be read from each queued buffer. This means
176 	 * that the result of this call is the maximum number of bytes that can
177 	 * be read from each of the pads.
178 	 *
179 	 * This function should be called with @pads STREAM_LOCK held, such as
180 	 * in the callback.
181 	 *
182 	 * MT safe.
183 	 *
184 	 * Returns: The maximum number of bytes queued on all pads. This function
185 	 *     returns 0 if a pad has no queued buffer.
186 	 */
187 	public uint available()
188 	{
189 		return gst_collect_pads_available(gstCollectPads);
190 	}
191 
192 	/**
193 	 * Convenience clipping function that converts incoming buffer's timestamp
194 	 * to running time, or clips the buffer if outside configured segment.
195 	 *
196 	 * Since 1.6, this clipping function also sets the DTS parameter of the
197 	 * GstCollectData structure. This version of the running time DTS can be
198 	 * negative. G_MININT64 is used to indicate invalid value.
199 	 *
200 	 * Params:
201 	 *     cdata = collect data of corresponding pad
202 	 *     buf = buffer being clipped
203 	 *     outbuf = output buffer with running time, or NULL if clipped
204 	 *     userData = user data (unused)
205 	 */
206 	public GstFlowReturn clipRunningTime(GstCollectData* cdata, Buffer buf, out Buffer outbuf, void* userData)
207 	{
208 		GstBuffer* outoutbuf = null;
209 
210 		auto p = gst_collect_pads_clip_running_time(gstCollectPads, cdata, (buf is null) ? null : buf.getBufferStruct(), &outoutbuf, userData);
211 
212 		outbuf = ObjectG.getDObject!(Buffer)(outoutbuf);
213 
214 		return p;
215 	}
216 
217 	/**
218 	 * Default #GstCollectPads event handling that elements should always
219 	 * chain up to to ensure proper operation.  Element might however indicate
220 	 * event should not be forwarded downstream.
221 	 *
222 	 * Params:
223 	 *     data = collect data of corresponding pad
224 	 *     event = event being processed
225 	 *     discard = process but do not send event downstream
226 	 */
227 	public bool eventDefault(GstCollectData* data, Event event, bool discard)
228 	{
229 		return gst_collect_pads_event_default(gstCollectPads, data, (event is null) ? null : event.getEventStruct(), discard) != 0;
230 	}
231 
232 	/**
233 	 * Flush @size bytes from the pad @data.
234 	 *
235 	 * This function should be called with @pads STREAM_LOCK held, such as
236 	 * in the callback.
237 	 *
238 	 * MT safe.
239 	 *
240 	 * Params:
241 	 *     data = the data to use
242 	 *     size = the number of bytes to flush
243 	 *
244 	 * Returns: The number of bytes flushed This can be less than @size and
245 	 *     is 0 if the pad was end-of-stream.
246 	 */
247 	public uint flush(GstCollectData* data, uint size)
248 	{
249 		return gst_collect_pads_flush(gstCollectPads, data, size);
250 	}
251 
252 	/**
253 	 * Peek at the buffer currently queued in @data. This function
254 	 * should be called with the @pads STREAM_LOCK held, such as in the callback
255 	 * handler.
256 	 *
257 	 * MT safe.
258 	 *
259 	 * Params:
260 	 *     data = the data to use
261 	 *
262 	 * Returns: The buffer in @data or %NULL if no
263 	 *     buffer is queued. should unref the buffer after usage.
264 	 */
265 	public Buffer peek(GstCollectData* data)
266 	{
267 		auto p = gst_collect_pads_peek(gstCollectPads, data);
268 
269 		if(p is null)
270 		{
271 			return null;
272 		}
273 
274 		return ObjectG.getDObject!(Buffer)(cast(GstBuffer*) p, true);
275 	}
276 
277 	/**
278 	 * Pop the buffer currently queued in @data. This function
279 	 * should be called with the @pads STREAM_LOCK held, such as in the callback
280 	 * handler.
281 	 *
282 	 * MT safe.
283 	 *
284 	 * Params:
285 	 *     data = the data to use
286 	 *
287 	 * Returns: The buffer in @data or %NULL if no
288 	 *     buffer was queued. You should unref the buffer after usage.
289 	 */
290 	public Buffer pop(GstCollectData* data)
291 	{
292 		auto p = gst_collect_pads_pop(gstCollectPads, data);
293 
294 		if(p is null)
295 		{
296 			return null;
297 		}
298 
299 		return ObjectG.getDObject!(Buffer)(cast(GstBuffer*) p, true);
300 	}
301 
302 	/**
303 	 * Default #GstCollectPads query handling that elements should always
304 	 * chain up to to ensure proper operation.  Element might however indicate
305 	 * query should not be forwarded downstream.
306 	 *
307 	 * Params:
308 	 *     data = collect data of corresponding pad
309 	 *     query = query being processed
310 	 *     discard = process but do not send event downstream
311 	 */
312 	public bool queryDefault(GstCollectData* data, Query query, bool discard)
313 	{
314 		return gst_collect_pads_query_default(gstCollectPads, data, (query is null) ? null : query.getQueryStruct(), discard) != 0;
315 	}
316 
317 	/**
318 	 * Get a subbuffer of @size bytes from the given pad @data.
319 	 *
320 	 * This function should be called with @pads STREAM_LOCK held, such as in the
321 	 * callback.
322 	 *
323 	 * MT safe.
324 	 *
325 	 * Params:
326 	 *     data = the data to use
327 	 *     size = the number of bytes to read
328 	 *
329 	 * Returns: A sub buffer. The size of the buffer can
330 	 *     be less that requested. A return of %NULL signals that the pad is
331 	 *     end-of-stream. Unref the buffer after use.
332 	 */
333 	public Buffer readBuffer(GstCollectData* data, uint size)
334 	{
335 		auto p = gst_collect_pads_read_buffer(gstCollectPads, data, size);
336 
337 		if(p is null)
338 		{
339 			return null;
340 		}
341 
342 		return ObjectG.getDObject!(Buffer)(cast(GstBuffer*) p, true);
343 	}
344 
345 	/**
346 	 * Remove a pad from the collection of collect pads. This function will also
347 	 * free the #GstCollectData and all the resources that were allocated with
348 	 * gst_collect_pads_add_pad().
349 	 *
350 	 * The pad will be deactivated automatically when @pads is stopped.
351 	 *
352 	 * MT safe.
353 	 *
354 	 * Params:
355 	 *     pad = the pad to remove
356 	 *
357 	 * Returns: %TRUE if the pad could be removed.
358 	 */
359 	public bool removePad(Pad pad)
360 	{
361 		return gst_collect_pads_remove_pad(gstCollectPads, (pad is null) ? null : pad.getPadStruct()) != 0;
362 	}
363 
364 	/**
365 	 * Set the callback function and user data that will be called with
366 	 * the oldest buffer when all pads have been collected, or %NULL on EOS.
367 	 * If a buffer is passed, the callback owns a reference and must unref
368 	 * it.
369 	 *
370 	 * MT safe.
371 	 *
372 	 * Params:
373 	 *     func = the function to set
374 	 *     userData = user data passed to the function
375 	 */
376 	public void setBufferFunction(GstCollectPadsBufferFunction func, void* userData)
377 	{
378 		gst_collect_pads_set_buffer_function(gstCollectPads, func, userData);
379 	}
380 
381 	/**
382 	 * Install a clipping function that is called right after a buffer is received
383 	 * on a pad managed by @pads. See #GstCollectPadsClipFunction for more info.
384 	 *
385 	 * Params:
386 	 *     clipfunc = clip function to install
387 	 *     userData = user data to pass to @clip_func
388 	 */
389 	public void setClipFunction(GstCollectPadsClipFunction clipfunc, void* userData)
390 	{
391 		gst_collect_pads_set_clip_function(gstCollectPads, clipfunc, userData);
392 	}
393 
394 	/**
395 	 * Set the timestamp comparison function.
396 	 *
397 	 * MT safe.
398 	 *
399 	 * Params:
400 	 *     func = the function to set
401 	 *     userData = user data passed to the function
402 	 */
403 	public void setCompareFunction(GstCollectPadsCompareFunction func, void* userData)
404 	{
405 		gst_collect_pads_set_compare_function(gstCollectPads, func, userData);
406 	}
407 
408 	/**
409 	 * Set the event callback function and user data that will be called when
410 	 * collectpads has received an event originating from one of the collected
411 	 * pads.  If the event being processed is a serialized one, this callback is
412 	 * called with @pads STREAM_LOCK held, otherwise not.  As this lock should be
413 	 * held when calling a number of CollectPads functions, it should be acquired
414 	 * if so (unusually) needed.
415 	 *
416 	 * MT safe.
417 	 *
418 	 * Params:
419 	 *     func = the function to set
420 	 *     userData = user data passed to the function
421 	 */
422 	public void setEventFunction(GstCollectPadsEventFunction func, void* userData)
423 	{
424 		gst_collect_pads_set_event_function(gstCollectPads, func, userData);
425 	}
426 
427 	/**
428 	 * Install a flush function that is called when the internal
429 	 * state of all pads should be flushed as part of flushing seek
430 	 * handling. See #GstCollectPadsFlushFunction for more info.
431 	 *
432 	 * Params:
433 	 *     func = flush function to install
434 	 *     userData = user data to pass to @func
435 	 *
436 	 * Since: 1.4
437 	 */
438 	public void setFlushFunction(GstCollectPadsFlushFunction func, void* userData)
439 	{
440 		gst_collect_pads_set_flush_function(gstCollectPads, func, userData);
441 	}
442 
443 	/**
444 	 * Change the flushing state of all the pads in the collection. No pad
445 	 * is able to accept anymore data when @flushing is %TRUE. Calling this
446 	 * function with @flushing %FALSE makes @pads accept data again.
447 	 * Caller must ensure that downstream streaming (thread) is not blocked,
448 	 * e.g. by sending a FLUSH_START downstream.
449 	 *
450 	 * MT safe.
451 	 *
452 	 * Params:
453 	 *     flushing = desired state of the pads
454 	 */
455 	public void setFlushing(bool flushing)
456 	{
457 		gst_collect_pads_set_flushing(gstCollectPads, flushing);
458 	}
459 
460 	/**
461 	 * CollectPads provides a default collection algorithm that will determine
462 	 * the oldest buffer available on all of its pads, and then delegate
463 	 * to a configured callback.
464 	 * However, if circumstances are more complicated and/or more control
465 	 * is desired, this sets a callback that will be invoked instead when
466 	 * all the pads added to the collection have buffers queued.
467 	 * Evidently, this callback is not compatible with
468 	 * gst_collect_pads_set_buffer_function() callback.
469 	 * If this callback is set, the former will be unset.
470 	 *
471 	 * MT safe.
472 	 *
473 	 * Params:
474 	 *     func = the function to set
475 	 *     userData = user data passed to the function
476 	 */
477 	public void setFunction(GstCollectPadsFunction func, void* userData)
478 	{
479 		gst_collect_pads_set_function(gstCollectPads, func, userData);
480 	}
481 
482 	/**
483 	 * Set the query callback function and user data that will be called after
484 	 * collectpads has received a query originating from one of the collected
485 	 * pads.  If the query being processed is a serialized one, this callback is
486 	 * called with @pads STREAM_LOCK held, otherwise not.  As this lock should be
487 	 * held when calling a number of CollectPads functions, it should be acquired
488 	 * if so (unusually) needed.
489 	 *
490 	 * MT safe.
491 	 *
492 	 * Params:
493 	 *     func = the function to set
494 	 *     userData = user data passed to the function
495 	 */
496 	public void setQueryFunction(GstCollectPadsQueryFunction func, void* userData)
497 	{
498 		gst_collect_pads_set_query_function(gstCollectPads, func, userData);
499 	}
500 
501 	/**
502 	 * Sets a pad to waiting or non-waiting mode, if at least this pad
503 	 * has not been created with locked waiting state,
504 	 * in which case nothing happens.
505 	 *
506 	 * This function should be called with @pads STREAM_LOCK held, such as
507 	 * in the callback.
508 	 *
509 	 * MT safe.
510 	 *
511 	 * Params:
512 	 *     data = the data to use
513 	 *     waiting = boolean indicating whether this pad should operate
514 	 *         in waiting or non-waiting mode
515 	 */
516 	public void setWaiting(GstCollectData* data, bool waiting)
517 	{
518 		gst_collect_pads_set_waiting(gstCollectPads, data, waiting);
519 	}
520 
521 	/**
522 	 * Default #GstCollectPads event handling for the src pad of elements.
523 	 * Elements can chain up to this to let flushing seek event handling
524 	 * be done by #GstCollectPads.
525 	 *
526 	 * Params:
527 	 *     pad = src #GstPad that received the event
528 	 *     event = event being processed
529 	 *
530 	 * Since: 1.4
531 	 */
532 	public bool srcEventDefault(Pad pad, Event event)
533 	{
534 		return gst_collect_pads_src_event_default(gstCollectPads, (pad is null) ? null : pad.getPadStruct(), (event is null) ? null : event.getEventStruct()) != 0;
535 	}
536 
537 	/**
538 	 * Starts the processing of data in the collect_pads.
539 	 *
540 	 * MT safe.
541 	 */
542 	public void start()
543 	{
544 		gst_collect_pads_start(gstCollectPads);
545 	}
546 
547 	/**
548 	 * Stops the processing of data in the collect_pads. this function
549 	 * will also unblock any blocking operations.
550 	 *
551 	 * MT safe.
552 	 */
553 	public void stop()
554 	{
555 		gst_collect_pads_stop(gstCollectPads);
556 	}
557 
558 	/**
559 	 * Get a subbuffer of @size bytes from the given pad @data. Flushes the amount
560 	 * of read bytes.
561 	 *
562 	 * This function should be called with @pads STREAM_LOCK held, such as in the
563 	 * callback.
564 	 *
565 	 * MT safe.
566 	 *
567 	 * Params:
568 	 *     data = the data to use
569 	 *     size = the number of bytes to read
570 	 *
571 	 * Returns: A sub buffer. The size of the buffer can
572 	 *     be less that requested. A return of %NULL signals that the pad is
573 	 *     end-of-stream. Unref the buffer after use.
574 	 */
575 	public Buffer takeBuffer(GstCollectData* data, uint size)
576 	{
577 		auto p = gst_collect_pads_take_buffer(gstCollectPads, data, size);
578 
579 		if(p is null)
580 		{
581 			return null;
582 		}
583 
584 		return ObjectG.getDObject!(Buffer)(cast(GstBuffer*) p, true);
585 	}
586 }