| /* GStreamer |
| * Copyright (C) 2005 Wim Taymans <wim@fluendo.com> |
| * Copyright (C) 2008 Mark Nauwelaerts <mnauw@users.sourceforge.net> |
| * |
| * gstcollectpads2.h: |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Library General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Library General Public License for more details. |
| * |
| * You should have received a copy of the GNU Library General Public |
| * License along with this library; if not, write to the |
| * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
| * Boston, MA 02111-1307, USA. |
| */ |
| |
| #ifndef __GST_COLLECT_PADS2_H__ |
| #define __GST_COLLECT_PADS2_H__ |
| |
| #include <gst/gst.h> |
| |
| G_BEGIN_DECLS |
| |
| #define GST_TYPE_COLLECT_PADS2 (gst_collect_pads2_get_type()) |
| #define GST_COLLECT_PADS2(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_COLLECT_PADS2,GstCollectPads2)) |
| #define GST_COLLECT_PADS2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_COLLECT_PADS2,GstCollectPads2Class)) |
| #define GST_COLLECT_PADS2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_COLLECT_PADS2,GstCollectPads2Class)) |
| #define GST_IS_COLLECT_PADS2(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_COLLECT_PADS2)) |
| #define GST_IS_COLLECT_PADS2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_COLLECT_PADS2)) |
| |
| typedef struct _GstCollectData2 GstCollectData2; |
| typedef struct _GstCollectData2Private GstCollectData2Private; |
| typedef struct _GstCollectPads2 GstCollectPads2; |
| typedef struct _GstCollectPads2Private GstCollectPads2Private; |
| typedef struct _GstCollectPads2Class GstCollectPads2Class; |
| |
| /** |
| * GstCollectData2DestroyNotify: |
| * @data: the #GstCollectData2 that will be freed |
| * |
| * A function that will be called when the #GstCollectData2 will be freed. |
| * It is passed the pointer to the structure and should free any custom |
| * memory and resources allocated for it. |
| * |
| * Since: 0.10.36 |
| */ |
| typedef void (*GstCollectData2DestroyNotify) (GstCollectData2 *data); |
| |
| /** |
| * GstCollectPads2StateFlags: |
| * @GST_COLLECT_PADS2_STATE_EOS: Set if collectdata's pad is EOS. |
| * @GST_COLLECT_PADS2_STATE_FLUSHING: Set if collectdata's pad is flushing. |
| * @GST_COLLECT_PADS2_STATE_NEW_SEGMENT: Set if collectdata's pad received a |
| * new_segment event. |
| * @GST_COLLECT_PADS2_STATE_WAITING: Set if collectdata's pad must be waited |
| * for when collecting. |
| * @GST_COLLECT_PADS2_STATE_LOCKED: Set collectdata's pad WAITING state must |
| * not be changed. |
| * #GstCollectPads2StateFlags indicate private state of a collectdata('s pad). |
| * |
| * Since: 0.10.36 |
| */ |
| typedef enum { |
| GST_COLLECT_PADS2_STATE_EOS = 1 << 0, |
| GST_COLLECT_PADS2_STATE_FLUSHING = 1 << 1, |
| GST_COLLECT_PADS2_STATE_NEW_SEGMENT = 1 << 2, |
| GST_COLLECT_PADS2_STATE_WAITING = 1 << 3, |
| GST_COLLECT_PADS2_STATE_LOCKED = 1 << 4 |
| } GstCollectPads2StateFlags; |
| |
| /** |
| * GST_COLLECT_PADS2_STATE: |
| * @data: a #GstCollectData2. |
| * |
| * A flags word containing #GstCollectPads2StateFlags flags set |
| * on this collected pad. |
| * |
| * Since: 0.10.36 |
| */ |
| #define GST_COLLECT_PADS2_STATE(data) (((GstCollectData2 *) data)->state) |
| /** |
| * GST_COLLECT_PADS2_STATE_IS_SET: |
| * @data: a #GstCollectData2. |
| * @flag: the #GstCollectPads2StateFlags to check. |
| * |
| * Gives the status of a specific flag on a collected pad. |
| * |
| * Since: 0.10.36 |
| */ |
| #define GST_COLLECT_PADS2_STATE_IS_SET(data,flag) !!(GST_COLLECT_PADS2_STATE (data) & flag) |
| /** |
| * GST_COLLECT_PADS2_STATE_SET: |
| * @data: a #GstCollectData2. |
| * @flag: the #GstCollectPads2StateFlags to set. |
| * |
| * Sets a state flag on a collected pad. |
| * |
| * Since: 0.10.36 |
| */ |
| #define GST_COLLECT_PADS2_STATE_SET(data,flag) (GST_COLLECT_PADS2_STATE (data) |= flag) |
| /** |
| * GST_COLLECT_PADS2_STATE_UNSET: |
| * @data: a #GstCollectData2. |
| * @flag: the #GstCollectPads2StateFlags to clear. |
| * |
| * Clears a state flag on a collected pad. |
| * |
| * Since: 0.10.36 |
| */ |
| #define GST_COLLECT_PADS2_STATE_UNSET(data,flag) (GST_COLLECT_PADS2_STATE (data) &= ~(flag)) |
| |
| /** |
| * GstCollectData2: |
| * @collect: owner #GstCollectPads2 |
| * @pad: #GstPad managed by this data |
| * @buffer: currently queued buffer. |
| * @pos: position in the buffer |
| * @segment: last segment received. |
| * |
| * Structure used by the collect_pads2. |
| * |
| * Since: 0.10.36 |
| */ |
| struct _GstCollectData2 |
| { |
| /* with STREAM_LOCK of @collect */ |
| GstCollectPads2 *collect; |
| GstPad *pad; |
| GstBuffer *buffer; |
| guint pos; |
| GstSegment segment; |
| |
| /*< private >*/ |
| /* state: bitfield for easier extension; |
| * eos, flushing, new_segment, waiting */ |
| GstCollectPads2StateFlags state; |
| |
| GstCollectData2Private *priv; |
| |
| gpointer _gst_reserved[GST_PADDING]; |
| }; |
| |
| /** |
| * GstCollectPads2Function: |
| * @pads: the #GstCollectPads2 that trigered the callback |
| * @user_data: user data passed to gst_collect_pads2_set_function() |
| * |
| * A function that will be called when all pads have received data. |
| * |
| * Returns: #GST_FLOW_OK for success |
| * |
| * Since: 0.10.36 |
| */ |
| typedef GstFlowReturn (*GstCollectPads2Function) (GstCollectPads2 *pads, gpointer user_data); |
| |
| /** |
| * GstCollectPads2BufferFunction: |
| * @pads: the #GstCollectPads2 that trigered the callback |
| * @data: the #GstCollectData2 of pad that has received the buffer |
| * @buffer: the #GstBuffer |
| * @user_data: user data passed to gst_collect_pads2_set_buffer_function() |
| * |
| * A function that will be called when a (considered oldest) buffer can be muxed. |
| * If all pads have reached EOS, this function is called with NULL @buffer |
| * and NULL @data. |
| * |
| * Returns: #GST_FLOW_OK for success |
| * |
| * Since: 0.10.36 |
| */ |
| typedef GstFlowReturn (*GstCollectPads2BufferFunction) (GstCollectPads2 *pads, GstCollectData2 *data, |
| GstBuffer *buffer, gpointer user_data); |
| |
| /** |
| * GstCollectPads2CompareFunction: |
| * @pads: the #GstCollectPads that is comparing the timestamps |
| * @data1: the first #GstCollectData2 |
| * @timestamp1: the first timestamp |
| * @data2: the second #GstCollectData2 |
| * @timestamp2: the second timestamp |
| * @user_data: user data passed to gst_collect_pads2_set_compare_function() |
| * |
| * A function for comparing two timestamps of buffers or newsegments collected on one pad. |
| * |
| * Returns: Integer less than zero when first timestamp is deemed older than the second one. |
| * Zero if the timestamps are deemed equally old. |
| * Integer greate than zero when second timestamp is deemed older than the first one. |
| * |
| * Since: 0.10.36 |
| */ |
| typedef gint (*GstCollectPads2CompareFunction) (GstCollectPads2 *pads, |
| GstCollectData2 * data1, GstClockTime timestamp1, |
| GstCollectData2 * data2, GstClockTime timestamp2, |
| gpointer user_data); |
| |
| /** |
| * GstCollectPads2EventFunction: |
| * @pads: the #GstCollectPads2 that trigered the callback |
| * @pad: the #GstPad that received an event |
| * @event: the #GstEvent received |
| * @user_data: user data passed to gst_collect_pads2_set_event_function() |
| * |
| * A function that will be called while processing an event. It takes |
| * ownership of the event and is responsible for forwarding |
| * events downstream (with gst_pad_event_default()) or dropping events. |
| * |
| * The STREAM_START, CAPS, STREAM_CONFIG, SEGMENT and EOS events should |
| * usually be dropped by this function. |
| * |
| * Returns: %TRUE if the pad could handle the event |
| * |
| * Since: 0.10.36 |
| */ |
| typedef gboolean (*GstCollectPads2EventFunction) (GstCollectPads2 *pads, GstCollectData2 * pad, |
| GstEvent * event, gpointer user_data); |
| |
| |
| /** |
| * GstCollectPads2ClipFunction: |
| * @pads: a #GstCollectPads2 |
| * @data: a #GstCollectData2 |
| * @inbuffer: the input #GstBuffer |
| * @outbuffer: the output #GstBuffer |
| * @user_data: user data |
| * |
| * A function that will be called when @inbuffer is received on the pad managed |
| * by @data in the collecpad object @pads. |
| * |
| * The function should use the segment of @data and the negotiated media type on |
| * the pad to perform clipping of @inbuffer. |
| * |
| * This function takes ownership of @inbuffer and should output a buffer in |
| * @outbuffer or return %NULL in @outbuffer if the buffer should be dropped. |
| * |
| * Returns: a #GstFlowReturn that corresponds to the result of clipping. |
| * |
| * Since: 0.10.36 |
| */ |
| typedef GstFlowReturn (*GstCollectPads2ClipFunction) (GstCollectPads2 *pads, GstCollectData2 *data, |
| GstBuffer *inbuffer, GstBuffer **outbuffer, |
| gpointer user_data); |
| |
| /** |
| * GST_COLLECT_PADS2_GET_STREAM_LOCK: |
| * @pads: a #GstCollectPads2 |
| * |
| * Get the stream lock of @pads. The stream lock is used to coordinate and |
| * serialize execution among the various streams being collected, and in |
| * protecting the resources used to accomplish this. |
| * |
| * Since: 0.10.36 |
| */ |
| #define GST_COLLECT_PADS2_GET_STREAM_LOCK(pads) (&((GstCollectPads2 *)pads)->stream_lock) |
| /** |
| * GST_COLLECT_PADS2_STREAM_LOCK: |
| * @pads: a #GstCollectPads2 |
| * |
| * Lock the stream lock of @pads. |
| * |
| * Since: 0.10.36 |
| */ |
| #define GST_COLLECT_PADS2_STREAM_LOCK(pads) g_rec_mutex_lock(GST_COLLECT_PADS2_GET_STREAM_LOCK (pads)) |
| /** |
| * GST_COLLECT_PADS2_STREAM_UNLOCK: |
| * @pads: a #GstCollectPads2 |
| * |
| * Unlock the stream lock of @pads. |
| * |
| * Since: 0.10.36 |
| */ |
| #define GST_COLLECT_PADS2_STREAM_UNLOCK(pads) g_rec_mutex_unlock(GST_COLLECT_PADS2_GET_STREAM_LOCK (pads)) |
| |
| /** |
| * GstCollectPads2: |
| * @data: #GList of #GstCollectData2 managed by this #GstCollectPads2. |
| * |
| * Collectpads object. |
| * |
| * Since: 0.10.36 |
| */ |
| struct _GstCollectPads2 { |
| GstObject object; |
| |
| /*< public >*/ /* with LOCK and/or STREAM_LOCK */ |
| GSList *data; /* list of CollectData items */ |
| |
| /*< private >*/ |
| GRecMutex stream_lock; /* used to serialize collection among several streams */ |
| |
| GstCollectPads2Private *priv; |
| |
| gpointer _gst_reserved[GST_PADDING]; |
| }; |
| |
| struct _GstCollectPads2Class { |
| GstObjectClass parent_class; |
| |
| /*< private >*/ |
| gpointer _gst_reserved[GST_PADDING]; |
| }; |
| |
| GType gst_collect_pads2_get_type(void); |
| |
| /* creating the object */ |
| GstCollectPads2* gst_collect_pads2_new (void); |
| |
| /* set the callbacks */ |
| void gst_collect_pads2_set_function (GstCollectPads2 *pads, |
| GstCollectPads2Function func, |
| gpointer user_data); |
| void gst_collect_pads2_set_buffer_function (GstCollectPads2 *pads, |
| GstCollectPads2BufferFunction func, |
| gpointer user_data); |
| void gst_collect_pads2_set_event_function (GstCollectPads2 *pads, |
| GstCollectPads2EventFunction func, |
| gpointer user_data); |
| void gst_collect_pads2_set_compare_function (GstCollectPads2 *pads, |
| GstCollectPads2CompareFunction func, |
| gpointer user_data); |
| void gst_collect_pads2_set_clip_function (GstCollectPads2 *pads, |
| GstCollectPads2ClipFunction clipfunc, |
| gpointer user_data); |
| |
| /* pad management */ |
| GstCollectData2* gst_collect_pads2_add_pad (GstCollectPads2 *pads, GstPad *pad, guint size); |
| GstCollectData2* gst_collect_pads2_add_pad_full (GstCollectPads2 *pads, GstPad *pad, guint size, |
| GstCollectData2DestroyNotify destroy_notify, |
| gboolean lock); |
| gboolean gst_collect_pads2_remove_pad (GstCollectPads2 *pads, GstPad *pad); |
| gboolean gst_collect_pads2_is_active (GstCollectPads2 *pads, GstPad *pad); |
| |
| /* start/stop collection */ |
| GstFlowReturn gst_collect_pads2_collect (GstCollectPads2 *pads); |
| GstFlowReturn gst_collect_pads2_collect_range (GstCollectPads2 *pads, guint64 offset, guint length); |
| |
| void gst_collect_pads2_start (GstCollectPads2 *pads); |
| void gst_collect_pads2_stop (GstCollectPads2 *pads); |
| void gst_collect_pads2_set_flushing (GstCollectPads2 *pads, gboolean flushing); |
| |
| /* get collected buffers */ |
| GstBuffer* gst_collect_pads2_peek (GstCollectPads2 *pads, GstCollectData2 *data); |
| GstBuffer* gst_collect_pads2_pop (GstCollectPads2 *pads, GstCollectData2 *data); |
| |
| /* get collected bytes */ |
| guint gst_collect_pads2_available (GstCollectPads2 *pads); |
| guint gst_collect_pads2_flush (GstCollectPads2 *pads, GstCollectData2 *data, |
| guint size); |
| GstBuffer* gst_collect_pads2_read_buffer (GstCollectPads2 * pads, GstCollectData2 * data, |
| guint size); |
| GstBuffer* gst_collect_pads2_take_buffer (GstCollectPads2 * pads, GstCollectData2 * data, |
| guint size); |
| |
| /* setting and unsetting waiting mode */ |
| void gst_collect_pads2_set_waiting (GstCollectPads2 *pads, GstCollectData2 *data, |
| gboolean waiting); |
| |
| /* convenience helper */ |
| GstFlowReturn gst_collect_pads2_clip_running_time (GstCollectPads2 * pads, |
| GstCollectData2 * cdata, GstBuffer * buf, GstBuffer ** outbuf, |
| gpointer user_data); |
| |
| |
| G_END_DECLS |
| |
| #endif /* __GST_COLLECT_PADS22_H__ */ |