mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 02:31:03 +00:00
take padding into account
This commit is contained in:
parent
090a8b2273
commit
39d78762b9
9 changed files with 46 additions and 30 deletions
|
@ -422,7 +422,7 @@ gst_vis_src_negotiate (GstVisual * visual)
|
|||
GstCaps *caps;
|
||||
GstQuery *query;
|
||||
GstBufferPool *pool = NULL;
|
||||
guint size, min, max, prefix, alignment;
|
||||
guint size, min, max, prefix, padding, alignment;
|
||||
|
||||
caps = gst_pad_query_caps (visual->srcpad, NULL);
|
||||
|
||||
|
@ -464,11 +464,12 @@ gst_vis_src_negotiate (GstVisual * visual)
|
|||
if (gst_pad_peer_query (visual->srcpad, query)) {
|
||||
/* we got configuration from our peer, parse them */
|
||||
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
||||
&alignment, &pool);
|
||||
&padding, &alignment, &pool);
|
||||
} else {
|
||||
size = visual->outsize;
|
||||
min = max = 0;
|
||||
prefix = 0;
|
||||
padding = 0;
|
||||
alignment = 0;
|
||||
}
|
||||
|
||||
|
@ -480,7 +481,7 @@ gst_vis_src_negotiate (GstVisual * visual)
|
|||
|
||||
config = gst_buffer_pool_get_config (pool);
|
||||
gst_buffer_pool_config_set (config, target, size, min, max, prefix,
|
||||
alignment);
|
||||
padding, alignment);
|
||||
gst_buffer_pool_set_config (pool, config);
|
||||
}
|
||||
|
||||
|
|
|
@ -773,7 +773,7 @@ theora_negotiate (GstTheoraDec * dec)
|
|||
GstVideoFormat format;
|
||||
GstQuery *query;
|
||||
GstBufferPool *pool;
|
||||
guint size, min, max, prefix, alignment;
|
||||
guint size, min, max, prefix, padding, alignment;
|
||||
GstStructure *config;
|
||||
GstCaps *caps;
|
||||
GstVideoInfo info, cinfo;
|
||||
|
@ -879,7 +879,7 @@ theora_negotiate (GstTheoraDec * dec)
|
|||
GST_DEBUG_OBJECT (dec, "got downstream ALLOCATION hints");
|
||||
/* we got configuration from our peer, parse them */
|
||||
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
||||
&alignment, &pool);
|
||||
&padding, &alignment, &pool);
|
||||
|
||||
/* check if downstream supports cropping */
|
||||
dec->has_cropping =
|
||||
|
@ -889,6 +889,7 @@ theora_negotiate (GstTheoraDec * dec)
|
|||
size = 0;
|
||||
min = max = 0;
|
||||
prefix = 0;
|
||||
padding = 0;
|
||||
alignment = 0;
|
||||
pool = NULL;
|
||||
dec->has_cropping = FALSE;
|
||||
|
@ -917,7 +918,8 @@ theora_negotiate (GstTheoraDec * dec)
|
|||
size = MAX (size, GST_VIDEO_INFO_SIZE (&dec->vinfo));
|
||||
|
||||
config = gst_buffer_pool_get_config (pool);
|
||||
gst_buffer_pool_config_set (config, caps, size, min, max, prefix, alignment);
|
||||
gst_buffer_pool_config_set (config, caps, size, min, max, prefix, padding,
|
||||
alignment);
|
||||
gst_caps_unref (caps);
|
||||
|
||||
/* just set the option, if the pool can support it we will transparently use
|
||||
|
|
|
@ -86,13 +86,13 @@ gst_video_filter_propose_allocation (GstBaseTransform * trans,
|
|||
pool = gst_video_buffer_pool_new ();
|
||||
|
||||
structure = gst_buffer_pool_get_config (pool);
|
||||
gst_buffer_pool_config_set (structure, caps, size, 0, 0, 0, 15);
|
||||
gst_buffer_pool_config_set (structure, caps, size, 0, 0, 0, 0, 15);
|
||||
if (!gst_buffer_pool_set_config (pool, structure))
|
||||
goto config_failed;
|
||||
} else
|
||||
pool = NULL;
|
||||
|
||||
gst_query_set_allocation_params (query, size, 0, 0, 0, 15, pool);
|
||||
gst_query_set_allocation_params (query, size, 0, 0, 0, 0, 15, pool);
|
||||
gst_object_unref (pool);
|
||||
|
||||
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);
|
||||
|
@ -114,10 +114,10 @@ static gboolean
|
|||
gst_video_filter_decide_allocation (GstBaseTransform * trans, GstQuery * query)
|
||||
{
|
||||
GstBufferPool *pool = NULL;
|
||||
guint size, min, max, prefix, alignment;
|
||||
guint size, min, max, prefix, padding, alignment;
|
||||
|
||||
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
||||
&alignment, &pool);
|
||||
&padding, &alignment, &pool);
|
||||
|
||||
if (pool) {
|
||||
GstStructure *config;
|
||||
|
|
|
@ -145,6 +145,7 @@ struct _GstVideoBufferPoolPrivate
|
|||
gboolean add_videometa;
|
||||
gboolean need_alignment;
|
||||
guint prefix;
|
||||
guint padding;
|
||||
guint align;
|
||||
};
|
||||
|
||||
|
@ -173,10 +174,10 @@ video_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
|||
GstVideoInfo info;
|
||||
const GstCaps *caps;
|
||||
gint width, height;
|
||||
guint prefix, align;
|
||||
guint prefix, padding, align;
|
||||
|
||||
if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, &prefix,
|
||||
&align))
|
||||
&padding, &align))
|
||||
goto wrong_config;
|
||||
|
||||
if (caps == NULL)
|
||||
|
@ -195,6 +196,7 @@ video_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
|||
gst_caps_unref (priv->caps);
|
||||
priv->caps = gst_caps_copy (caps);
|
||||
priv->prefix = prefix;
|
||||
priv->padding = padding;
|
||||
priv->align = align;
|
||||
|
||||
/* enable metadata based on config of the pool */
|
||||
|
@ -242,19 +244,20 @@ video_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
|
|||
GstVideoBufferPoolPrivate *priv = vpool->priv;
|
||||
GstVideoInfo *info;
|
||||
GstMemory *mem;
|
||||
gint maxsize;
|
||||
|
||||
info = &priv->info;
|
||||
|
||||
GST_DEBUG_OBJECT (pool, "alloc %" G_GSIZE_FORMAT, info->size);
|
||||
|
||||
mem =
|
||||
gst_allocator_alloc (priv->allocator, info->size + priv->prefix,
|
||||
priv->align);
|
||||
maxsize = info->size + priv->prefix + priv->padding;
|
||||
mem = gst_allocator_alloc (priv->allocator, maxsize, priv->align);
|
||||
if (mem == NULL)
|
||||
goto no_memory;
|
||||
|
||||
*buffer = gst_buffer_new ();
|
||||
gst_memory_resize (mem, priv->prefix, info->size);
|
||||
if (priv->prefix != 0 || priv->padding != 0)
|
||||
gst_memory_resize (mem, priv->prefix, info->size);
|
||||
gst_buffer_take_memory (*buffer, -1, mem);
|
||||
|
||||
if (priv->add_videometa) {
|
||||
|
|
|
@ -611,12 +611,12 @@ gst_video_test_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
|
|||
{
|
||||
GstVideoTestSrc *videotestsrc;
|
||||
GstBufferPool *pool;
|
||||
guint size, min, max, prefix, alignment;
|
||||
guint size, min, max, prefix, padding, alignment;
|
||||
|
||||
videotestsrc = GST_VIDEO_TEST_SRC (bsrc);
|
||||
|
||||
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
||||
&alignment, &pool);
|
||||
&padding, &alignment, &pool);
|
||||
/* adjust size */
|
||||
size = MAX (size, videotestsrc->info.size);
|
||||
|
||||
|
@ -629,7 +629,7 @@ gst_video_test_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
|
|||
gst_buffer_pool_set_config (pool, config);
|
||||
}
|
||||
gst_query_set_allocation_params (query, size, min, max, prefix,
|
||||
alignment, pool);
|
||||
padding, alignment, pool);
|
||||
|
||||
if (pool)
|
||||
gst_object_unref (pool);
|
||||
|
|
|
@ -483,7 +483,8 @@ ximage_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
|||
GstVideoInfo info;
|
||||
const GstCaps *caps;
|
||||
|
||||
if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, NULL, NULL))
|
||||
if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL))
|
||||
goto wrong_config;
|
||||
|
||||
if (caps == NULL)
|
||||
|
|
|
@ -1148,12 +1148,16 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
|||
newpool = gst_ximage_buffer_pool_new (ximagesink);
|
||||
|
||||
structure = gst_buffer_pool_get_config (newpool);
|
||||
gst_buffer_pool_config_set (structure, caps, size, 2, 0, 0, 15);
|
||||
gst_buffer_pool_config_set (structure, caps, size, 2, 0, 0, 0, 15);
|
||||
if (!gst_buffer_pool_set_config (newpool, structure))
|
||||
goto config_failed;
|
||||
|
||||
oldpool = ximagesink->pool;
|
||||
/* we don't activate the pool yet, this will be done by downstream after it
|
||||
* has configured the pool. If downstream does not want our pool we will
|
||||
* activate it when we render into it */
|
||||
ximagesink->pool = newpool;
|
||||
g_mutex_unlock (ximagesink->flow_lock);
|
||||
|
||||
/* unref the old sink */
|
||||
if (oldpool) {
|
||||
|
@ -1161,7 +1165,6 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
|||
* deactivated when the last ref is gone */
|
||||
gst_object_unref (oldpool);
|
||||
}
|
||||
g_mutex_unlock (ximagesink->flow_lock);
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
@ -1439,7 +1442,8 @@ gst_ximagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
|
|||
|
||||
/* we had a pool, check caps */
|
||||
config = gst_buffer_pool_get_config (pool);
|
||||
gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL);
|
||||
gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL,
|
||||
NULL);
|
||||
|
||||
GST_DEBUG_OBJECT (ximagesink,
|
||||
"we had a pool with caps %" GST_PTR_FORMAT, pcaps);
|
||||
|
@ -1463,12 +1467,12 @@ gst_ximagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
|
|||
size = info.size;
|
||||
|
||||
config = gst_buffer_pool_get_config (pool);
|
||||
gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0);
|
||||
gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0, 0);
|
||||
if (!gst_buffer_pool_set_config (pool, config))
|
||||
goto config_failed;
|
||||
}
|
||||
/* we need at least 2 buffer because we hold on to the last one */
|
||||
gst_query_set_allocation_params (query, size, 2, 0, 0, 0, pool);
|
||||
gst_query_set_allocation_params (query, size, 2, 0, 0, 0, 0, pool);
|
||||
|
||||
/* we also support various metadata */
|
||||
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);
|
||||
|
|
|
@ -519,7 +519,8 @@ xvimage_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
|||
GstVideoInfo info;
|
||||
const GstCaps *caps;
|
||||
|
||||
if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, NULL, NULL))
|
||||
if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL))
|
||||
goto wrong_config;
|
||||
|
||||
if (caps == NULL)
|
||||
|
|
|
@ -1656,11 +1656,14 @@ gst_xvimagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
|||
newpool = gst_xvimage_buffer_pool_new (xvimagesink);
|
||||
|
||||
structure = gst_buffer_pool_get_config (newpool);
|
||||
gst_buffer_pool_config_set (structure, caps, size, 2, 0, 0, 15);
|
||||
gst_buffer_pool_config_set (structure, caps, size, 2, 0, 0, 0, 15);
|
||||
if (!gst_buffer_pool_set_config (newpool, structure))
|
||||
goto config_failed;
|
||||
|
||||
oldpool = xvimagesink->pool;
|
||||
/* we don't activate the pool yet, this will be done by downstream after it
|
||||
* has configured the pool. If downstream does not want our pool we will
|
||||
* activate it when we render into it */
|
||||
xvimagesink->pool = newpool;
|
||||
g_mutex_unlock (xvimagesink->flow_lock);
|
||||
|
||||
|
@ -1954,7 +1957,8 @@ gst_xvimagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
|
|||
/* we had a pool, check caps */
|
||||
GST_DEBUG_OBJECT (xvimagesink, "check existing pool caps");
|
||||
config = gst_buffer_pool_get_config (pool);
|
||||
gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL);
|
||||
gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL,
|
||||
NULL);
|
||||
|
||||
if (!gst_caps_is_equal (caps, pcaps)) {
|
||||
GST_DEBUG_OBJECT (xvimagesink, "pool has different caps");
|
||||
|
@ -1977,12 +1981,12 @@ gst_xvimagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
|
|||
size = info.size;
|
||||
|
||||
config = gst_buffer_pool_get_config (pool);
|
||||
gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0);
|
||||
gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0, 0);
|
||||
if (!gst_buffer_pool_set_config (pool, config))
|
||||
goto config_failed;
|
||||
}
|
||||
/* we need at least 2 buffer because we hold on to the last one */
|
||||
gst_query_set_allocation_params (query, size, 2, 0, 0, 0, pool);
|
||||
gst_query_set_allocation_params (query, size, 2, 0, 0, 0, 0, pool);
|
||||
|
||||
/* we also support various metadata */
|
||||
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);
|
||||
|
|
Loading…
Reference in a new issue