gboolean qos_enabled;
gdouble proportion;
GstClockTime earliest_time;
+
+ GstBufferPool *pool;
+ const GstMemoryAllocator *allocator;
};
static GstElementClass *parent_class = NULL;
basesrc->num_buffers_left = -1;
basesrc->can_activate_push = TRUE;
- basesrc->pad_mode = GST_ACTIVATE_NONE;
pad_template =
gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
}
}
+static void
+gst_base_src_set_allocation (GstBaseSrc * basesrc, GstBufferPool * pool,
+ const GstMemoryAllocator * allocator)
+{
+ if (basesrc->priv->pool)
+ gst_object_unref (basesrc->priv->pool);
+ basesrc->priv->pool = pool;
+
+ basesrc->priv->allocator = allocator;
+}
+
+static gboolean
+gst_base_src_prepare_allocation (GstBaseSrc * basesrc, GstCaps * caps)
+{
+ GstBaseSrcClass *bclass;
+ gboolean result = TRUE;
+ GstQuery *query;
+ GstBufferPool *pool = NULL;
+ const GstMemoryAllocator *allocator = NULL;
+ guint size, min, max, prefix, alignment;
+
+ bclass = GST_BASE_SRC_GET_CLASS (basesrc);
+
+ /* make query and let peer pad answer, we don't really care if it worked or
+ * not, if it failed, the allocation query would contain defaults and the
+ * subclass would then set better values if needed */
+ query = gst_query_new_allocation (caps, TRUE);
+ gst_pad_peer_query (basesrc->srcpad, query);
+
+ if (G_LIKELY (bclass->setup_allocation))
+ result = bclass->setup_allocation (basesrc, query);
+
+ gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
+ &alignment, &pool);
+
+ if (size == 0) {
+ const gchar *mem = NULL;
+
+ /* no size, we have variable size buffers */
+ if (gst_query_get_n_allocation_memories (query) > 0) {
+ mem = gst_query_parse_nth_allocation_memory (query, 0);
+ }
+ allocator = gst_memory_allocator_find (mem);
+ } else if (pool == NULL) {
+ /* fixed size, we can use a bufferpool */
+ GstStructure *config;
+
+ /* we did not get a pool, make one ourselves then */
+ pool = gst_buffer_pool_new ();
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set (config, caps, size, min, max, prefix,
+ alignment);
+ gst_buffer_pool_set_config (pool, config);
+ }
+
+ gst_base_src_set_allocation (basesrc, pool, allocator);
+
+ return result;
+}
+
/* default negotiation code.
*
* Take intersection between src and sink pads, take first
bclass = GST_BASE_SRC_GET_CLASS (basesrc);
- if (bclass->negotiate)
+ if (G_LIKELY (bclass->negotiate))
result = bclass->negotiate (basesrc);
+ if (G_LIKELY (result)) {
+ GstCaps *caps;
+
+ caps = gst_pad_get_current_caps (basesrc->srcpad);
+
+ result = gst_base_src_prepare_allocation (basesrc, caps);
+ }
return result;
}
/* MT-protected (with LOCK) */
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.
* @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
* @start: Start processing. Subclasses should open resources and prepare
* to produce data.
* @stop: Stop processing. Subclasses should use this to close resources.
/* 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);
+ /* notify the subclass of new caps */
+ gboolean (*set_caps) (GstBaseSrc *src, GstCaps *caps);
+
+ /* setup allocation query */
+ gboolean (*setup_allocation) (GstBaseSrc *src, GstQuery *query);
/* start and stop processing, ideal for opening/closing the resource */
gboolean (*start) (GstBaseSrc *src);