diff --git a/ext/libvisual/visual.c b/ext/libvisual/visual.c index 6cc0d6443a..29e85ff458 100644 --- a/ext/libvisual/visual.c +++ b/ext/libvisual/visual.c @@ -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); } diff --git a/ext/theora/gsttheoradec.c b/ext/theora/gsttheoradec.c index 4baee386cf..358c6b4776 100644 --- a/ext/theora/gsttheoradec.c +++ b/ext/theora/gsttheoradec.c @@ -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 diff --git a/gst-libs/gst/video/gstvideofilter.c b/gst-libs/gst/video/gstvideofilter.c index ec4e69292f..706ac22a22 100644 --- a/gst-libs/gst/video/gstvideofilter.c +++ b/gst-libs/gst/video/gstvideofilter.c @@ -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; diff --git a/gst-libs/gst/video/gstvideopool.c b/gst-libs/gst/video/gstvideopool.c index 91d07ebe3e..d26d72d708 100644 --- a/gst-libs/gst/video/gstvideopool.c +++ b/gst-libs/gst/video/gstvideopool.c @@ -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) { diff --git a/gst/videotestsrc/gstvideotestsrc.c b/gst/videotestsrc/gstvideotestsrc.c index de83957e46..72b21b6314 100644 --- a/gst/videotestsrc/gstvideotestsrc.c +++ b/gst/videotestsrc/gstvideotestsrc.c @@ -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); diff --git a/sys/ximage/ximagepool.c b/sys/ximage/ximagepool.c index 02c47a5f37..4c3f5937f2 100644 --- a/sys/ximage/ximagepool.c +++ b/sys/ximage/ximagepool.c @@ -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) diff --git a/sys/ximage/ximagesink.c b/sys/ximage/ximagesink.c index 916cd45ff2..305169bd43 100644 --- a/sys/ximage/ximagesink.c +++ b/sys/ximage/ximagesink.c @@ -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); diff --git a/sys/xvimage/xvimagepool.c b/sys/xvimage/xvimagepool.c index ad2a51d8f7..eac9f23143 100644 --- a/sys/xvimage/xvimagepool.c +++ b/sys/xvimage/xvimagepool.c @@ -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) diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index 93d62d613c..24609735d8 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -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);