mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +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;
|
GstCaps *caps;
|
||||||
GstQuery *query;
|
GstQuery *query;
|
||||||
GstBufferPool *pool = NULL;
|
GstBufferPool *pool = NULL;
|
||||||
guint size, min, max, prefix, alignment;
|
guint size, min, max, prefix, padding, alignment;
|
||||||
|
|
||||||
caps = gst_pad_query_caps (visual->srcpad, NULL);
|
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)) {
|
if (gst_pad_peer_query (visual->srcpad, query)) {
|
||||||
/* we got configuration from our peer, parse them */
|
/* we got configuration from our peer, parse them */
|
||||||
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
||||||
&alignment, &pool);
|
&padding, &alignment, &pool);
|
||||||
} else {
|
} else {
|
||||||
size = visual->outsize;
|
size = visual->outsize;
|
||||||
min = max = 0;
|
min = max = 0;
|
||||||
prefix = 0;
|
prefix = 0;
|
||||||
|
padding = 0;
|
||||||
alignment = 0;
|
alignment = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -480,7 +481,7 @@ gst_vis_src_negotiate (GstVisual * visual)
|
||||||
|
|
||||||
config = gst_buffer_pool_get_config (pool);
|
config = gst_buffer_pool_get_config (pool);
|
||||||
gst_buffer_pool_config_set (config, target, size, min, max, prefix,
|
gst_buffer_pool_config_set (config, target, size, min, max, prefix,
|
||||||
alignment);
|
padding, alignment);
|
||||||
gst_buffer_pool_set_config (pool, config);
|
gst_buffer_pool_set_config (pool, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -773,7 +773,7 @@ theora_negotiate (GstTheoraDec * dec)
|
||||||
GstVideoFormat format;
|
GstVideoFormat format;
|
||||||
GstQuery *query;
|
GstQuery *query;
|
||||||
GstBufferPool *pool;
|
GstBufferPool *pool;
|
||||||
guint size, min, max, prefix, alignment;
|
guint size, min, max, prefix, padding, alignment;
|
||||||
GstStructure *config;
|
GstStructure *config;
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
GstVideoInfo info, cinfo;
|
GstVideoInfo info, cinfo;
|
||||||
|
@ -879,7 +879,7 @@ theora_negotiate (GstTheoraDec * dec)
|
||||||
GST_DEBUG_OBJECT (dec, "got downstream ALLOCATION hints");
|
GST_DEBUG_OBJECT (dec, "got downstream ALLOCATION hints");
|
||||||
/* we got configuration from our peer, parse them */
|
/* we got configuration from our peer, parse them */
|
||||||
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
||||||
&alignment, &pool);
|
&padding, &alignment, &pool);
|
||||||
|
|
||||||
/* check if downstream supports cropping */
|
/* check if downstream supports cropping */
|
||||||
dec->has_cropping =
|
dec->has_cropping =
|
||||||
|
@ -889,6 +889,7 @@ theora_negotiate (GstTheoraDec * dec)
|
||||||
size = 0;
|
size = 0;
|
||||||
min = max = 0;
|
min = max = 0;
|
||||||
prefix = 0;
|
prefix = 0;
|
||||||
|
padding = 0;
|
||||||
alignment = 0;
|
alignment = 0;
|
||||||
pool = NULL;
|
pool = NULL;
|
||||||
dec->has_cropping = FALSE;
|
dec->has_cropping = FALSE;
|
||||||
|
@ -917,7 +918,8 @@ theora_negotiate (GstTheoraDec * dec)
|
||||||
size = MAX (size, GST_VIDEO_INFO_SIZE (&dec->vinfo));
|
size = MAX (size, GST_VIDEO_INFO_SIZE (&dec->vinfo));
|
||||||
|
|
||||||
config = gst_buffer_pool_get_config (pool);
|
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);
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
/* just set the option, if the pool can support it we will transparently use
|
/* 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 ();
|
pool = gst_video_buffer_pool_new ();
|
||||||
|
|
||||||
structure = gst_buffer_pool_get_config (pool);
|
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))
|
if (!gst_buffer_pool_set_config (pool, structure))
|
||||||
goto config_failed;
|
goto config_failed;
|
||||||
} else
|
} else
|
||||||
pool = NULL;
|
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_object_unref (pool);
|
||||||
|
|
||||||
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);
|
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)
|
gst_video_filter_decide_allocation (GstBaseTransform * trans, GstQuery * query)
|
||||||
{
|
{
|
||||||
GstBufferPool *pool = NULL;
|
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,
|
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
||||||
&alignment, &pool);
|
&padding, &alignment, &pool);
|
||||||
|
|
||||||
if (pool) {
|
if (pool) {
|
||||||
GstStructure *config;
|
GstStructure *config;
|
||||||
|
|
|
@ -145,6 +145,7 @@ struct _GstVideoBufferPoolPrivate
|
||||||
gboolean add_videometa;
|
gboolean add_videometa;
|
||||||
gboolean need_alignment;
|
gboolean need_alignment;
|
||||||
guint prefix;
|
guint prefix;
|
||||||
|
guint padding;
|
||||||
guint align;
|
guint align;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -173,10 +174,10 @@ video_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
||||||
GstVideoInfo info;
|
GstVideoInfo info;
|
||||||
const GstCaps *caps;
|
const GstCaps *caps;
|
||||||
gint width, height;
|
gint width, height;
|
||||||
guint prefix, align;
|
guint prefix, padding, align;
|
||||||
|
|
||||||
if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, &prefix,
|
if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, &prefix,
|
||||||
&align))
|
&padding, &align))
|
||||||
goto wrong_config;
|
goto wrong_config;
|
||||||
|
|
||||||
if (caps == NULL)
|
if (caps == NULL)
|
||||||
|
@ -195,6 +196,7 @@ video_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
||||||
gst_caps_unref (priv->caps);
|
gst_caps_unref (priv->caps);
|
||||||
priv->caps = gst_caps_copy (caps);
|
priv->caps = gst_caps_copy (caps);
|
||||||
priv->prefix = prefix;
|
priv->prefix = prefix;
|
||||||
|
priv->padding = padding;
|
||||||
priv->align = align;
|
priv->align = align;
|
||||||
|
|
||||||
/* enable metadata based on config of the pool */
|
/* enable metadata based on config of the pool */
|
||||||
|
@ -242,19 +244,20 @@ video_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
|
||||||
GstVideoBufferPoolPrivate *priv = vpool->priv;
|
GstVideoBufferPoolPrivate *priv = vpool->priv;
|
||||||
GstVideoInfo *info;
|
GstVideoInfo *info;
|
||||||
GstMemory *mem;
|
GstMemory *mem;
|
||||||
|
gint maxsize;
|
||||||
|
|
||||||
info = &priv->info;
|
info = &priv->info;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (pool, "alloc %" G_GSIZE_FORMAT, info->size);
|
GST_DEBUG_OBJECT (pool, "alloc %" G_GSIZE_FORMAT, info->size);
|
||||||
|
|
||||||
mem =
|
maxsize = info->size + priv->prefix + priv->padding;
|
||||||
gst_allocator_alloc (priv->allocator, info->size + priv->prefix,
|
mem = gst_allocator_alloc (priv->allocator, maxsize, priv->align);
|
||||||
priv->align);
|
|
||||||
if (mem == NULL)
|
if (mem == NULL)
|
||||||
goto no_memory;
|
goto no_memory;
|
||||||
|
|
||||||
*buffer = gst_buffer_new ();
|
*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);
|
gst_buffer_take_memory (*buffer, -1, mem);
|
||||||
|
|
||||||
if (priv->add_videometa) {
|
if (priv->add_videometa) {
|
||||||
|
|
|
@ -611,12 +611,12 @@ gst_video_test_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
|
||||||
{
|
{
|
||||||
GstVideoTestSrc *videotestsrc;
|
GstVideoTestSrc *videotestsrc;
|
||||||
GstBufferPool *pool;
|
GstBufferPool *pool;
|
||||||
guint size, min, max, prefix, alignment;
|
guint size, min, max, prefix, padding, alignment;
|
||||||
|
|
||||||
videotestsrc = GST_VIDEO_TEST_SRC (bsrc);
|
videotestsrc = GST_VIDEO_TEST_SRC (bsrc);
|
||||||
|
|
||||||
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
|
||||||
&alignment, &pool);
|
&padding, &alignment, &pool);
|
||||||
/* adjust size */
|
/* adjust size */
|
||||||
size = MAX (size, videotestsrc->info.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_buffer_pool_set_config (pool, config);
|
||||||
}
|
}
|
||||||
gst_query_set_allocation_params (query, size, min, max, prefix,
|
gst_query_set_allocation_params (query, size, min, max, prefix,
|
||||||
alignment, pool);
|
padding, alignment, pool);
|
||||||
|
|
||||||
if (pool)
|
if (pool)
|
||||||
gst_object_unref (pool);
|
gst_object_unref (pool);
|
||||||
|
|
|
@ -483,7 +483,8 @@ ximage_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
|
||||||
GstVideoInfo info;
|
GstVideoInfo info;
|
||||||
const GstCaps *caps;
|
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;
|
goto wrong_config;
|
||||||
|
|
||||||
if (caps == NULL)
|
if (caps == NULL)
|
||||||
|
|
|
@ -1148,12 +1148,16 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
||||||
newpool = gst_ximage_buffer_pool_new (ximagesink);
|
newpool = gst_ximage_buffer_pool_new (ximagesink);
|
||||||
|
|
||||||
structure = gst_buffer_pool_get_config (newpool);
|
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))
|
if (!gst_buffer_pool_set_config (newpool, structure))
|
||||||
goto config_failed;
|
goto config_failed;
|
||||||
|
|
||||||
oldpool = ximagesink->pool;
|
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;
|
ximagesink->pool = newpool;
|
||||||
|
g_mutex_unlock (ximagesink->flow_lock);
|
||||||
|
|
||||||
/* unref the old sink */
|
/* unref the old sink */
|
||||||
if (oldpool) {
|
if (oldpool) {
|
||||||
|
@ -1161,7 +1165,6 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
||||||
* deactivated when the last ref is gone */
|
* deactivated when the last ref is gone */
|
||||||
gst_object_unref (oldpool);
|
gst_object_unref (oldpool);
|
||||||
}
|
}
|
||||||
g_mutex_unlock (ximagesink->flow_lock);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -1439,7 +1442,8 @@ gst_ximagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
|
||||||
|
|
||||||
/* we had a pool, check caps */
|
/* we had a pool, check caps */
|
||||||
config = gst_buffer_pool_get_config (pool);
|
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,
|
GST_DEBUG_OBJECT (ximagesink,
|
||||||
"we had a pool with caps %" GST_PTR_FORMAT, pcaps);
|
"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;
|
size = info.size;
|
||||||
|
|
||||||
config = gst_buffer_pool_get_config (pool);
|
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))
|
if (!gst_buffer_pool_set_config (pool, config))
|
||||||
goto config_failed;
|
goto config_failed;
|
||||||
}
|
}
|
||||||
/* we need at least 2 buffer because we hold on to the last one */
|
/* 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 */
|
/* we also support various metadata */
|
||||||
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);
|
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;
|
GstVideoInfo info;
|
||||||
const GstCaps *caps;
|
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;
|
goto wrong_config;
|
||||||
|
|
||||||
if (caps == NULL)
|
if (caps == NULL)
|
||||||
|
|
|
@ -1656,11 +1656,14 @@ gst_xvimagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
||||||
newpool = gst_xvimage_buffer_pool_new (xvimagesink);
|
newpool = gst_xvimage_buffer_pool_new (xvimagesink);
|
||||||
|
|
||||||
structure = gst_buffer_pool_get_config (newpool);
|
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))
|
if (!gst_buffer_pool_set_config (newpool, structure))
|
||||||
goto config_failed;
|
goto config_failed;
|
||||||
|
|
||||||
oldpool = xvimagesink->pool;
|
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;
|
xvimagesink->pool = newpool;
|
||||||
g_mutex_unlock (xvimagesink->flow_lock);
|
g_mutex_unlock (xvimagesink->flow_lock);
|
||||||
|
|
||||||
|
@ -1954,7 +1957,8 @@ gst_xvimagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
|
||||||
/* we had a pool, check caps */
|
/* we had a pool, check caps */
|
||||||
GST_DEBUG_OBJECT (xvimagesink, "check existing pool caps");
|
GST_DEBUG_OBJECT (xvimagesink, "check existing pool caps");
|
||||||
config = gst_buffer_pool_get_config (pool);
|
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)) {
|
if (!gst_caps_is_equal (caps, pcaps)) {
|
||||||
GST_DEBUG_OBJECT (xvimagesink, "pool has different caps");
|
GST_DEBUG_OBJECT (xvimagesink, "pool has different caps");
|
||||||
|
@ -1977,12 +1981,12 @@ gst_xvimagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
|
||||||
size = info.size;
|
size = info.size;
|
||||||
|
|
||||||
config = gst_buffer_pool_get_config (pool);
|
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))
|
if (!gst_buffer_pool_set_config (pool, config))
|
||||||
goto config_failed;
|
goto config_failed;
|
||||||
}
|
}
|
||||||
/* we need at least 2 buffer because we hold on to the last one */
|
/* 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 */
|
/* we also support various metadata */
|
||||||
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);
|
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);
|
||||||
|
|
Loading…
Reference in a new issue