mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
basesrc: negotiate allocation
Add vmethod to configure allocation methods. Remove some unused variables
This commit is contained in:
parent
a14623f925
commit
3977991c9d
2 changed files with 78 additions and 12 deletions
|
@ -238,6 +238,9 @@ struct _GstBaseSrcPrivate
|
||||||
gboolean qos_enabled;
|
gboolean qos_enabled;
|
||||||
gdouble proportion;
|
gdouble proportion;
|
||||||
GstClockTime earliest_time;
|
GstClockTime earliest_time;
|
||||||
|
|
||||||
|
GstBufferPool *pool;
|
||||||
|
const GstMemoryAllocator *allocator;
|
||||||
};
|
};
|
||||||
|
|
||||||
static GstElementClass *parent_class = NULL;
|
static GstElementClass *parent_class = NULL;
|
||||||
|
@ -393,7 +396,6 @@ gst_base_src_init (GstBaseSrc * basesrc, gpointer g_class)
|
||||||
basesrc->num_buffers_left = -1;
|
basesrc->num_buffers_left = -1;
|
||||||
|
|
||||||
basesrc->can_activate_push = TRUE;
|
basesrc->can_activate_push = TRUE;
|
||||||
basesrc->pad_mode = GST_ACTIVATE_NONE;
|
|
||||||
|
|
||||||
pad_template =
|
pad_template =
|
||||||
gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
|
gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
|
||||||
|
@ -2567,6 +2569,67 @@ null_buffer:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.
|
/* default negotiation code.
|
||||||
*
|
*
|
||||||
* Take intersection between src and sink pads, take first
|
* Take intersection between src and sink pads, take first
|
||||||
|
@ -2654,9 +2717,16 @@ gst_base_src_negotiate (GstBaseSrc * basesrc)
|
||||||
|
|
||||||
bclass = GST_BASE_SRC_GET_CLASS (basesrc);
|
bclass = GST_BASE_SRC_GET_CLASS (basesrc);
|
||||||
|
|
||||||
if (bclass->negotiate)
|
if (G_LIKELY (bclass->negotiate))
|
||||||
result = bclass->negotiate (basesrc);
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,21 +83,15 @@ struct _GstBaseSrc {
|
||||||
/* MT-protected (with LOCK) */
|
/* MT-protected (with LOCK) */
|
||||||
guint blocksize; /* size of buffers when operating push based */
|
guint blocksize; /* size of buffers when operating push based */
|
||||||
gboolean can_activate_push; /* some scheduling properties */
|
gboolean can_activate_push; /* some scheduling properties */
|
||||||
GstActivateMode pad_mode;
|
|
||||||
gboolean seekable; /* not used anymore */
|
|
||||||
gboolean random_access;
|
gboolean random_access;
|
||||||
|
|
||||||
GstClockID clock_id; /* for syncing */
|
GstClockID clock_id; /* for syncing */
|
||||||
GstClockTime end_time;
|
|
||||||
|
|
||||||
/* MT-protected (with STREAM_LOCK *and* OBJECT_LOCK) */
|
/* MT-protected (with STREAM_LOCK *and* OBJECT_LOCK) */
|
||||||
GstSegment segment;
|
GstSegment segment;
|
||||||
/* MT-protected (with STREAM_LOCK) */
|
/* MT-protected (with STREAM_LOCK) */
|
||||||
gboolean need_newsegment;
|
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;
|
||||||
gint num_buffers_left;
|
gint num_buffers_left;
|
||||||
|
|
||||||
|
@ -115,10 +109,10 @@ struct _GstBaseSrc {
|
||||||
* GstBaseSrcClass:
|
* GstBaseSrcClass:
|
||||||
* @parent_class: Element parent class
|
* @parent_class: Element parent class
|
||||||
* @get_caps: Called to get the caps to report
|
* @get_caps: Called to get the caps to report
|
||||||
* @set_caps: Notify subclass of changed output caps
|
|
||||||
* @negotiate: Negotiated the caps with the peer.
|
* @negotiate: Negotiated the caps with the peer.
|
||||||
* @fixate: Called during negotiation if caps need fixating. Implement instead of
|
* @fixate: Called during negotiation if caps need fixating. Implement instead of
|
||||||
* setting a fixate function on the source pad.
|
* 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
|
* @start: Start processing. Subclasses should open resources and prepare
|
||||||
* to produce data.
|
* to produce data.
|
||||||
* @stop: Stop processing. Subclasses should use this to close resources.
|
* @stop: Stop processing. Subclasses should use this to close resources.
|
||||||
|
@ -165,13 +159,15 @@ struct _GstBaseSrcClass {
|
||||||
|
|
||||||
/* get caps from subclass */
|
/* get caps from subclass */
|
||||||
GstCaps* (*get_caps) (GstBaseSrc *src, GstCaps *filter);
|
GstCaps* (*get_caps) (GstBaseSrc *src, GstCaps *filter);
|
||||||
/* notify the subclass of new caps */
|
|
||||||
gboolean (*set_caps) (GstBaseSrc *src, GstCaps *caps);
|
|
||||||
|
|
||||||
/* decide on caps */
|
/* decide on caps */
|
||||||
gboolean (*negotiate) (GstBaseSrc *src);
|
gboolean (*negotiate) (GstBaseSrc *src);
|
||||||
/* called if, in negotiation, caps need fixating */
|
/* called if, in negotiation, caps need fixating */
|
||||||
void (*fixate) (GstBaseSrc *src, GstCaps *caps);
|
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 */
|
/* start and stop processing, ideal for opening/closing the resource */
|
||||||
gboolean (*start) (GstBaseSrc *src);
|
gboolean (*start) (GstBaseSrc *src);
|
||||||
|
|
Loading…
Reference in a new issue