2 * Copyright (C) 2005 Wim Taymans <wim@fluendo.com>
3 * Copyright (C) 2008 Mark Nauwelaerts <mnauw@users.sourceforge.net>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
23 #ifndef __GST_COLLECT_PADS_H__
24 #define __GST_COLLECT_PADS_H__
30 #define GST_TYPE_COLLECT_PADS (gst_collect_pads_get_type())
31 #define GST_COLLECT_PADS(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_COLLECT_PADS,GstCollectPads))
32 #define GST_COLLECT_PADS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_COLLECT_PADS,GstCollectPadsClass))
33 #define GST_COLLECT_PADS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_COLLECT_PADS,GstCollectPadsClass))
34 #define GST_IS_COLLECT_PADS(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_COLLECT_PADS))
35 #define GST_IS_COLLECT_PADS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_COLLECT_PADS))
37 typedef struct _GstCollectData GstCollectData;
38 typedef struct _GstCollectDataPrivate GstCollectDataPrivate;
39 typedef struct _GstCollectPads GstCollectPads;
40 typedef struct _GstCollectPadsPrivate GstCollectPadsPrivate;
41 typedef struct _GstCollectPadsClass GstCollectPadsClass;
44 * GstCollectDataDestroyNotify:
45 * @data: the #GstCollectData that will be freed
47 * A function that will be called when the #GstCollectData will be freed.
48 * It is passed the pointer to the structure and should free any custom
49 * memory and resources allocated for it.
51 typedef void (*GstCollectDataDestroyNotify) (GstCollectData *data);
54 * GstCollectPadsStateFlags:
55 * @GST_COLLECT_PADS_STATE_EOS: Set if collectdata's pad is EOS.
56 * @GST_COLLECT_PADS_STATE_FLUSHING: Set if collectdata's pad is flushing.
57 * @GST_COLLECT_PADS_STATE_NEW_SEGMENT: Set if collectdata's pad received a
59 * @GST_COLLECT_PADS_STATE_WAITING: Set if collectdata's pad must be waited
60 * for when collecting.
61 * @GST_COLLECT_PADS_STATE_LOCKED: Set collectdata's pad WAITING state must
63 * #GstCollectPadsStateFlags indicate private state of a collectdata('s pad).
66 GST_COLLECT_PADS_STATE_EOS = 1 << 0,
67 GST_COLLECT_PADS_STATE_FLUSHING = 1 << 1,
68 GST_COLLECT_PADS_STATE_NEW_SEGMENT = 1 << 2,
69 GST_COLLECT_PADS_STATE_WAITING = 1 << 3,
70 GST_COLLECT_PADS_STATE_LOCKED = 1 << 4
71 } GstCollectPadsStateFlags;
74 * GST_COLLECT_PADS_STATE:
75 * @data: a #GstCollectData.
77 * A flags word containing #GstCollectPadsStateFlags flags set
78 * on this collected pad.
80 #define GST_COLLECT_PADS_STATE(data) (((GstCollectData *) data)->state)
82 * GST_COLLECT_PADS_STATE_IS_SET:
83 * @data: a #GstCollectData.
84 * @flag: the #GstCollectPadsStateFlags to check.
86 * Gives the status of a specific flag on a collected pad.
88 #define GST_COLLECT_PADS_STATE_IS_SET(data,flag) !!(GST_COLLECT_PADS_STATE (data) & flag)
90 * GST_COLLECT_PADS_STATE_SET:
91 * @data: a #GstCollectData.
92 * @flag: the #GstCollectPadsStateFlags to set.
94 * Sets a state flag on a collected pad.
96 #define GST_COLLECT_PADS_STATE_SET(data,flag) (GST_COLLECT_PADS_STATE (data) |= flag)
98 * GST_COLLECT_PADS_STATE_UNSET:
99 * @data: a #GstCollectData.
100 * @flag: the #GstCollectPadsStateFlags to clear.
102 * Clears a state flag on a collected pad.
104 #define GST_COLLECT_PADS_STATE_UNSET(data,flag) (GST_COLLECT_PADS_STATE (data) &= ~(flag))
107 * GST_COLLECT_PADS_DTS:
108 * @data: A #GstCollectData.
110 * Returns the DTS that has been converted to running time when using
111 * gst_collect_pads_clip_running_time(). Unlike the value saved into
112 * the buffer, this value is of type gint64 and may be negative. This allow
113 * properly handling streams with frame reordering where the first DTS may
114 * be negative. If the initial DTS was not set, this value will be
115 * set to %G_MININT64.
119 #define GST_COLLECT_PADS_DTS(data) (((GstCollectData *) data)->ABI.abi.dts)
122 * GST_COLLECT_PADS_DTS_IS_VALID:
123 * @data: A #GstCollectData.
125 * Check if running DTS value store is valid.
129 #define GST_COLLECT_PADS_DTS_IS_VALID(data) (GST_CLOCK_STIME_IS_VALID (GST_COLLECT_PADS_DTS (data)))
133 * @collect: owner #GstCollectPads
134 * @pad: #GstPad managed by this data
135 * @buffer: currently queued buffer.
136 * @pos: position in the buffer
137 * @segment: last segment received.
138 * @dts: the signed version of the DTS converted to running time. To access
139 * this memeber, use %GST_COLLECT_PADS_DTS macro. (Since 1.6)
141 * Structure used by the collect_pads.
143 struct _GstCollectData
145 /* with STREAM_LOCK of @collect */
146 GstCollectPads *collect;
153 /* state: bitfield for easier extension;
154 * eos, flushing, new_segment, waiting */
155 GstCollectPadsStateFlags state;
157 GstCollectDataPrivate *priv;
165 gpointer _gst_reserved[GST_PADDING];
170 * GstCollectPadsFunction:
171 * @pads: the #GstCollectPads that triggered the callback
172 * @user_data: user data passed to gst_collect_pads_set_function()
174 * A function that will be called when all pads have received data.
176 * Returns: %GST_FLOW_OK for success
178 typedef GstFlowReturn (*GstCollectPadsFunction) (GstCollectPads *pads, gpointer user_data);
181 * GstCollectPadsBufferFunction:
182 * @pads: the #GstCollectPads that triggered the callback
183 * @data: the #GstCollectData of pad that has received the buffer
184 * @buffer: (transfer full): the #GstBuffer
185 * @user_data: user data passed to gst_collect_pads_set_buffer_function()
187 * A function that will be called when a (considered oldest) buffer can be muxed.
188 * If all pads have reached EOS, this function is called with %NULL @buffer
191 * Returns: %GST_FLOW_OK for success
193 typedef GstFlowReturn (*GstCollectPadsBufferFunction) (GstCollectPads *pads, GstCollectData *data,
194 GstBuffer *buffer, gpointer user_data);
197 * GstCollectPadsCompareFunction:
198 * @pads: the #GstCollectPads that is comparing the timestamps
199 * @data1: the first #GstCollectData
200 * @timestamp1: the first timestamp
201 * @data2: the second #GstCollectData
202 * @timestamp2: the second timestamp
203 * @user_data: user data passed to gst_collect_pads_set_compare_function()
205 * A function for comparing two timestamps of buffers or newsegments collected on one pad.
207 * Returns: Integer less than zero when first timestamp is deemed older than the second one.
208 * Zero if the timestamps are deemed equally old.
209 * Integer greater than zero when second timestamp is deemed older than the first one.
211 typedef gint (*GstCollectPadsCompareFunction) (GstCollectPads *pads,
212 GstCollectData * data1, GstClockTime timestamp1,
213 GstCollectData * data2, GstClockTime timestamp2,
217 * GstCollectPadsEventFunction:
218 * @pads: the #GstCollectPads that triggered the callback
219 * @pad: the #GstPad that received an event
220 * @event: the #GstEvent received
221 * @user_data: user data passed to gst_collect_pads_set_event_function()
223 * A function that will be called while processing an event. It takes
224 * ownership of the event and is responsible for chaining up (to
225 * gst_collect_pads_event_default()) or dropping events (such typical cases
226 * being handled by the default handler).
228 * Returns: %TRUE if the pad could handle the event
230 typedef gboolean (*GstCollectPadsEventFunction) (GstCollectPads *pads, GstCollectData * pad,
231 GstEvent * event, gpointer user_data);
235 * GstCollectPadsQueryFunction:
236 * @pads: the #GstCollectPads that triggered the callback
237 * @pad: the #GstPad that received an event
238 * @query: the #GstEvent received
239 * @user_data: user data passed to gst_collect_pads_set_query_function()
241 * A function that will be called while processing a query. It takes
242 * ownership of the query and is responsible for chaining up (to
243 * events downstream (with gst_pad_event_default()).
245 * Returns: %TRUE if the pad could handle the event
247 typedef gboolean (*GstCollectPadsQueryFunction) (GstCollectPads *pads, GstCollectData * pad,
248 GstQuery * query, gpointer user_data);
251 * GstCollectPadsClipFunction:
252 * @pads: a #GstCollectPads
253 * @data: a #GstCollectData
254 * @inbuffer: (transfer full): the input #GstBuffer
255 * @outbuffer: the output #GstBuffer
256 * @user_data: user data
258 * A function that will be called when @inbuffer is received on the pad managed
259 * by @data in the collectpad object @pads.
261 * The function should use the segment of @data and the negotiated media type on
262 * the pad to perform clipping of @inbuffer.
264 * This function takes ownership of @inbuffer and should output a buffer in
265 * @outbuffer or return %NULL in @outbuffer if the buffer should be dropped.
267 * Returns: a #GstFlowReturn that corresponds to the result of clipping.
269 typedef GstFlowReturn (*GstCollectPadsClipFunction) (GstCollectPads *pads, GstCollectData *data,
270 GstBuffer *inbuffer, GstBuffer **outbuffer,
275 * GstCollectPadsFlushFunction:
276 * @pads: a #GstCollectPads
277 * @user_data: user data
279 * A function that will be called while processing a flushing seek event.
281 * The function should flush any internal state of the element and the state of
282 * all the pads. It should clear only the state not directly managed by the
283 * @pads object. It is therefore not necessary to call
284 * gst_collect_pads_set_flushing nor gst_collect_pads_clear from this function.
288 typedef void (*GstCollectPadsFlushFunction) (GstCollectPads *pads, gpointer user_data);
291 * GST_COLLECT_PADS_GET_STREAM_LOCK:
292 * @pads: a #GstCollectPads
294 * Get the stream lock of @pads. The stream lock is used to coordinate and
295 * serialize execution among the various streams being collected, and in
296 * protecting the resources used to accomplish this.
298 #define GST_COLLECT_PADS_GET_STREAM_LOCK(pads) (&((GstCollectPads *)pads)->stream_lock)
300 * GST_COLLECT_PADS_STREAM_LOCK:
301 * @pads: a #GstCollectPads
303 * Lock the stream lock of @pads.
305 #define GST_COLLECT_PADS_STREAM_LOCK(pads) g_rec_mutex_lock(GST_COLLECT_PADS_GET_STREAM_LOCK (pads))
307 * GST_COLLECT_PADS_STREAM_UNLOCK:
308 * @pads: a #GstCollectPads
310 * Unlock the stream lock of @pads.
312 #define GST_COLLECT_PADS_STREAM_UNLOCK(pads) g_rec_mutex_unlock(GST_COLLECT_PADS_GET_STREAM_LOCK (pads))
316 * @data: (element-type GstBase.CollectData): #GList of #GstCollectData managed
317 * by this #GstCollectPads.
319 * Collectpads object.
321 struct _GstCollectPads {
324 /*< public >*/ /* with LOCK and/or STREAM_LOCK */
325 GSList *data; /* list of CollectData items */
328 GRecMutex stream_lock; /* used to serialize collection among several streams */
330 GstCollectPadsPrivate *priv;
332 gpointer _gst_reserved[GST_PADDING];
335 struct _GstCollectPadsClass {
336 GstObjectClass parent_class;
339 gpointer _gst_reserved[GST_PADDING];
343 GType gst_collect_pads_get_type (void);
345 /* creating the object */
348 GstCollectPads* gst_collect_pads_new (void);
350 /* set the callbacks */
353 void gst_collect_pads_set_function (GstCollectPads *pads,
354 GstCollectPadsFunction func,
357 void gst_collect_pads_set_buffer_function (GstCollectPads *pads,
358 GstCollectPadsBufferFunction func,
361 void gst_collect_pads_set_event_function (GstCollectPads *pads,
362 GstCollectPadsEventFunction func,
365 void gst_collect_pads_set_query_function (GstCollectPads *pads,
366 GstCollectPadsQueryFunction func,
369 void gst_collect_pads_set_compare_function (GstCollectPads *pads,
370 GstCollectPadsCompareFunction func,
373 void gst_collect_pads_set_clip_function (GstCollectPads *pads,
374 GstCollectPadsClipFunction clipfunc,
377 void gst_collect_pads_set_flush_function (GstCollectPads *pads,
378 GstCollectPadsFlushFunction func,
384 GstCollectData* gst_collect_pads_add_pad (GstCollectPads *pads, GstPad *pad, guint size,
385 GstCollectDataDestroyNotify destroy_notify,
388 gboolean gst_collect_pads_remove_pad (GstCollectPads *pads, GstPad *pad);
390 /* start/stop collection */
393 void gst_collect_pads_start (GstCollectPads *pads);
396 void gst_collect_pads_stop (GstCollectPads *pads);
399 void gst_collect_pads_set_flushing (GstCollectPads *pads, gboolean flushing);
401 /* get collected buffers */
404 GstBuffer* gst_collect_pads_peek (GstCollectPads *pads, GstCollectData *data);
407 GstBuffer* gst_collect_pads_pop (GstCollectPads *pads, GstCollectData *data);
409 /* get collected bytes */
412 guint gst_collect_pads_available (GstCollectPads *pads);
415 guint gst_collect_pads_flush (GstCollectPads *pads, GstCollectData *data,
418 GstBuffer* gst_collect_pads_read_buffer (GstCollectPads * pads, GstCollectData * data,
421 GstBuffer* gst_collect_pads_take_buffer (GstCollectPads * pads, GstCollectData * data,
424 /* setting and unsetting waiting mode */
427 void gst_collect_pads_set_waiting (GstCollectPads *pads, GstCollectData *data,
430 /* convenience helper */
433 GstFlowReturn gst_collect_pads_clip_running_time (GstCollectPads * pads,
434 GstCollectData * cdata,
435 GstBuffer * buf, GstBuffer ** outbuf,
438 /* default handlers */
441 gboolean gst_collect_pads_event_default (GstCollectPads * pads, GstCollectData * data,
442 GstEvent * event, gboolean discard);
444 gboolean gst_collect_pads_src_event_default (GstCollectPads * pads, GstPad * pad,
447 gboolean gst_collect_pads_query_default (GstCollectPads * pads, GstCollectData * data,
448 GstQuery * query, gboolean discard);
451 #ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
452 G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstCollectPads, gst_object_unref)
457 #endif /* __GST_COLLECT_PADS_H__ */