/**
* GstBaseSrcFlags:
- * @GST_BASE_SRC_STARTED: has source been started
+ * @GST_BASE_SRC_FLAG_STARTING: has source is starting
+ * @GST_BASE_SRC_FLAG_STARTED: has source been started
* @GST_BASE_SRC_FLAG_LAST: offset to define more flags
*
* The #GstElement flags that a basesrc element may have.
*/
typedef enum {
- GST_BASE_SRC_STARTED = (GST_ELEMENT_FLAG_LAST << 0),
+ GST_BASE_SRC_FLAG_STARTING = (GST_ELEMENT_FLAG_LAST << 0),
+ GST_BASE_SRC_FLAG_STARTED = (GST_ELEMENT_FLAG_LAST << 1),
/* padding */
- GST_BASE_SRC_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 2)
+ GST_BASE_SRC_FLAG_LAST = (GST_ELEMENT_FLAG_LAST << 16)
} GstBaseSrcFlags;
+#define GST_BASE_SRC_IS_STARTING(obj) GST_OBJECT_FLAG_IS_SET ((obj), GST_BASE_SRC_FLAG_STARTING)
+#define GST_BASE_SRC_IS_STARTED(obj) GST_OBJECT_FLAG_IS_SET ((obj), GST_BASE_SRC_FLAG_STARTED)
+
typedef struct _GstBaseSrc GstBaseSrc;
typedef struct _GstBaseSrcClass GstBaseSrcClass;
typedef struct _GstBaseSrcPrivate GstBaseSrcPrivate;
/* available to subclass implementations */
/* MT-protected (with LIVE_LOCK) */
- GMutex *live_lock;
- GCond *live_cond;
+ GMutex live_lock;
+ GCond live_cond;
gboolean is_live;
gboolean live_running;
/* MT-protected (with LOCK) */
- gint blocksize; /* size of buffers when operating push based */
+ guint blocksize; /* size of buffers when operating push based */
gboolean can_activate_push; /* some scheduling properties */
- GstActivateMode pad_mode;
- gboolean seekable; /* not used anymore */
gboolean random_access;
GstClockID clock_id; /* for syncing */
- GstClockTime end_time;
/* MT-protected (with STREAM_LOCK *and* OBJECT_LOCK) */
GstSegment segment;
/* MT-protected (with STREAM_LOCK) */
gboolean need_newsegment;
- guint64 offset; /* current offset in the resource, unused */
- guint64 size; /* total size of the resource, unused */
-
gint num_buffers;
gint num_buffers_left;
* GstBaseSrcClass:
* @parent_class: Element parent class
* @get_caps: Called to get the caps to report
- * @set_caps: Notify subclass of changed output caps
* @negotiate: Negotiated the caps with the peer.
- * @newsegment: Generate and send a new_segment event (UNUSED)
+ * @fixate: Called during negotiation if caps need fixating. Implement instead of
+ * setting a fixate function on the source pad.
+ * @set_caps: Notify subclass of changed output caps
+ * @decide_allocation: configure the allocation query
* @start: Start processing. Subclasses should open resources and prepare
- * to produce data.
+ * to produce data. Implementation should call gst_base_src_start_complete()
+ * when the operation completes, either from the current thread or any other
+ * thread that finishes the start operation asynchronously.
* @stop: Stop processing. Subclasses should use this to close resources.
* @get_times: Given a buffer, return the start and stop time when it
* should be pushed out. The base class will sync on the clock using
* these times.
* @get_size: Return the total size of the resource, in the configured format.
* @is_seekable: Check if the source can seek
+ * @prepare_seek_segment: Prepare the GstSegment that will be passed to the
+ * do_seek vmethod for executing a seek request. Sub-classes should override
+ * this if they support seeking in formats other than the configured native
+ * format. By default, it tries to convert the seek arguments to the
+ * configured native format and prepare a segment in that format.
+ * Since: 0.10.13
+ * @do_seek: Perform seeking on the resource to the indicated segment.
* @unlock: Unlock any pending access to the resource. Subclasses should
* unblock any blocked function ASAP. In particular, any create() function in
- * progress should be unblocked and should return GST_FLOW_WRONG_STATE. Any
- * future @create<!-- -->() function call should also return GST_FLOW_WRONG_STATE
+ * progress should be unblocked and should return GST_FLOW_FLUSHING. Any
+ * future @create<!-- -->() function call should also return GST_FLOW_FLUSHING
* until the @unlock_stop<!-- -->() function has been called.
* @unlock_stop: Clear the previous unlock request. Subclasses should clear
* any state they set during unlock(), such as clearing command queues.
+ * @query: Handle a requested query.
* @event: Override this to implement custom event handling.
* @create: Ask the subclass to create a buffer with offset and size.
* When the subclass returns GST_FLOW_OK, it MUST return a buffer of the
* requested size unless fewer bytes are available because an EOS condition
* is near. No buffer should be returned when the return value is different
* from GST_FLOW_OK. A return value of GST_FLOW_UNEXPECTED signifies that the
- * end of stream is reached.
- * @do_seek: Perform seeking on the resource to the indicated segment.
- * @prepare_seek_segment: Prepare the GstSegment that will be passed to the
- * do_seek vmethod for executing a seek request. Sub-classes should override
- * this if they support seeking in formats other than the configured native
- * format. By default, it tries to convert the seek arguments to the
- * configured native format and prepare a segment in that format.
- * Since: 0.10.13
- * @query: Handle a requested query.
- * @check_get_range: Check whether the source would support pull-based
- * operation if it were to be opened now. This vfunc is optional, but
- * should be implemented if possible to avoid unnecessary start/stop
- * cycles. The default implementation will open and close the resource
- * to find out whether get_range is supported, and that is usually
- * undesirable.
- * @fixate: Called during negotiation if caps need fixating. Implement instead of
- * setting a fixate function on the source pad.
+ * end of stream is reached. The default implementation will call @alloc and
+ * then call @fill.
+ * @alloc: Ask the subclass to allocate a buffer with for offset and size. The
+ * default implementation will create a new buffer from the negotiated allocator.
+ * @fill: Ask the subclass to fill the buffer with data for offset and size. The
+ * passed buffer is guaranteed to hold the requested amount of bytes.
*
* Subclasses can override any of the available virtual methods or not, as
* needed. At the minimum, the @create method should be overridden to produce
/* get caps from subclass */
GstCaps* (*get_caps) (GstBaseSrc *src, GstCaps *filter);
- /* notify the subclass of new caps */
- gboolean (*set_caps) (GstBaseSrc *src, GstCaps *caps);
-
/* decide on caps */
gboolean (*negotiate) (GstBaseSrc *src);
/* called if, in negotiation, caps need fixating */
- void (*fixate) (GstBaseSrc *src, GstCaps *caps);
+ GstCaps * (*fixate) (GstBaseSrc *src, GstCaps *caps);
+ /* notify the subclass of new caps */
+ gboolean (*set_caps) (GstBaseSrc *src, GstCaps *caps);
+
+ /* setup allocation query */
+ gboolean (*decide_allocation) (GstBaseSrc *src, GstQuery *query);
/* start and stop processing, ideal for opening/closing the resource */
gboolean (*start) (GstBaseSrc *src);
/* notify subclasses of an event */
gboolean (*event) (GstBaseSrc *src, GstEvent *event);
- /* ask the subclass to create a buffer with offset and size */
+ /* ask the subclass to create a buffer with offset and size, the default
+ * implementation will call alloc and fill. */
GstFlowReturn (*create) (GstBaseSrc *src, guint64 offset, guint size,
GstBuffer **buf);
+ /* ask the subclass to allocate an output buffer. The default implementation
+ * will use the negotiated allocator. */
+ GstFlowReturn (*alloc) (GstBaseSrc *src, guint64 offset, guint size,
+ GstBuffer **buf);
+ /* ask the subclass to fill the buffer with data from offset and size */
+ GstFlowReturn (*fill) (GstBaseSrc *src, guint64 offset, guint size,
+ GstBuffer *buf);
/*< private >*/
gpointer _gst_reserved[GST_PADDING_LARGE];
void gst_base_src_set_format (GstBaseSrc *src, GstFormat format);
+void gst_base_src_set_dynamic_size (GstBaseSrc * src, gboolean dynamic);
+
+void gst_base_src_set_async (GstBaseSrc *src, gboolean async);
+gboolean gst_base_src_is_async (GstBaseSrc *src);
+
+void gst_base_src_start_complete (GstBaseSrc * basesrc, GstFlowReturn ret);
+GstFlowReturn gst_base_src_start_wait (GstBaseSrc * basesrc);
+
gboolean gst_base_src_query_latency (GstBaseSrc *src, gboolean * live,
GstClockTime * min_latency,
GstClockTime * max_latency);
-void gst_base_src_set_blocksize (GstBaseSrc *src, gulong blocksize);
-gulong gst_base_src_get_blocksize (GstBaseSrc *src);
+void gst_base_src_set_blocksize (GstBaseSrc *src, guint blocksize);
+guint gst_base_src_get_blocksize (GstBaseSrc *src);
void gst_base_src_set_do_timestamp (GstBaseSrc *src, gboolean timestamp);
gboolean gst_base_src_get_do_timestamp (GstBaseSrc *src);
gboolean gst_base_src_new_seamless_segment (GstBaseSrc *src, gint64 start, gint64 stop, gint64 position);
+
+gboolean gst_base_src_set_caps (GstBaseSrc *src, GstCaps *caps);
+
G_END_DECLS
#endif /* __GST_BASE_SRC_H__ */