update for allocation query changes

This commit is contained in:
Wim Taymans 2012-03-15 20:36:51 +01:00
parent 02dc419aae
commit 7c0e2b5b1e
7 changed files with 76 additions and 67 deletions

View file

@ -4,6 +4,7 @@ libgstlibvisual_la_SOURCES = visual.c
libgstlibvisual_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(LIBVISUAL_CFLAGS)
libgstlibvisual_la_LIBADD = \
$(top_builddir)/gst-libs/gst/audio/libgstaudio-$(GST_MAJORMINOR).la \
$(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_MAJORMINOR).la \
$(GST_BASE_LIBS) $(LIBVISUAL_LIBS)
libgstlibvisual_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstlibvisual_la_LIBTOOLFLAGS = --tag=disable-static

View file

@ -24,6 +24,7 @@
#include <gst/gst.h>
#include <gst/base/gstadapter.h>
#include <gst/video/video.h>
#include <gst/video/gstvideopool.h>
#include <gst/audio/audio.h>
#include <libvisual/libvisual.h>
@ -422,7 +423,8 @@ gst_vis_src_negotiate (GstVisual * visual)
GstCaps *caps;
GstQuery *query;
GstBufferPool *pool = NULL;
guint size, min, max, prefix, padding, alignment;
GstStructure *config;
guint size, min, max;
caps = gst_pad_query_caps (visual->srcpad, NULL);
@ -461,30 +463,32 @@ gst_vis_src_negotiate (GstVisual * visual)
/* find a pool for the negotiated caps now */
query = gst_query_new_allocation (target, TRUE);
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,
&padding, &alignment, &pool);
if (!gst_pad_peer_query (visual->srcpad, query)) {
/* not a problem, we deal with the defaults of the query */
GST_DEBUG_OBJECT (visual, "allocation query failed");
}
if (gst_query_get_n_allocation_pools (query) > 0) {
gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
size = MAX (size, visual->outsize);
} else {
pool = NULL;
size = visual->outsize;
min = max = 0;
prefix = 0;
padding = 0;
alignment = 0;
}
if (pool == NULL) {
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, target, size, min, max, prefix,
padding, alignment);
gst_buffer_pool_set_config (pool, config);
/* no pool, just parameters, we can make our own */
GST_DEBUG_OBJECT (visual, "no pool, making new pool");
pool = gst_video_buffer_pool_new ();
}
/* and configure */
config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_set (config, target, size, min, max, 0, 0, 0);
gst_buffer_pool_set_config (pool, config);
if (visual->pool)
gst_object_unref (visual->pool);
visual->pool = pool;
@ -899,8 +903,8 @@ gst_visual_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
visual->actor =
visual_actor_new (GST_VISUAL_GET_CLASS (visual)->plugin->info->
plugname);
visual_actor_new (GST_VISUAL_GET_CLASS (visual)->plugin->
info->plugname);
visual->video = visual_video_new ();
visual->audio = visual_audio_new ();
/* can't have a play without actors */

View file

@ -773,7 +773,7 @@ theora_negotiate (GstTheoraDec * dec)
GstVideoFormat format;
GstQuery *query;
GstBufferPool *pool;
guint size, min, max, prefix, padding, alignment;
guint size, min, max;
GstStructure *config;
GstCaps *caps;
GstVideoInfo info, cinfo;
@ -876,23 +876,22 @@ theora_negotiate (GstTheoraDec * dec)
query = gst_query_new_allocation (caps, TRUE);
if (gst_pad_peer_query (dec->srcpad, query)) {
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,
&padding, &alignment, &pool);
/* check if downstream supports cropping */
dec->has_cropping =
gst_query_has_allocation_meta (query, GST_VIDEO_CROP_META_API_TYPE);
} else {
/* not a problem, deal with defaults */
GST_DEBUG_OBJECT (dec, "didn't get downstream ALLOCATION hints");
dec->has_cropping = FALSE;
}
if (gst_query_get_n_allocation_pools (query) > 0) {
/* we got configuration from our peer, parse them */
gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
} else {
pool = NULL;
size = 0;
min = max = 0;
prefix = 0;
padding = 0;
alignment = 0;
pool = NULL;
dec->has_cropping = FALSE;
}
GST_DEBUG_OBJECT (dec, "downstream cropping %d", dec->has_cropping);
@ -918,14 +917,16 @@ 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, padding,
alignment);
gst_buffer_pool_config_set (config, caps, size, min, max, 0, 0, 0);
gst_caps_unref (caps);
/* just set the option, if the pool can support it we will transparently use
* it through the video info API. We could also see if the pool support this
* option and only activate it then. */
gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
if (gst_query_has_allocation_meta (query, GST_VIDEO_META_API_TYPE)) {
/* just set the option, if the pool can support it we will transparently use
* it through the video info API. We could also see if the pool support this
* option and only activate it then. */
gst_buffer_pool_config_add_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META);
}
gst_buffer_pool_set_config (pool, config);
/* and activate */

View file

@ -92,7 +92,7 @@ gst_video_filter_propose_allocation (GstBaseTransform * trans,
} else
pool = NULL;
gst_query_set_allocation_params (query, size, 0, 0, 0, 0, 15, pool);
gst_query_add_allocation_pool (query, pool, size, 0, 0);
gst_object_unref (pool);
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);
@ -113,19 +113,21 @@ config_failed:
static gboolean
gst_video_filter_decide_allocation (GstBaseTransform * trans, GstQuery * query)
{
GstBufferPool *pool = NULL;
guint size, min, max, prefix, padding, alignment;
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
&padding, &alignment, &pool);
if (gst_query_get_n_allocation_pools (query) > 0) {
GstBufferPool *pool = NULL;
if (pool) {
GstStructure *config;
gst_query_parse_nth_allocation_pool (query, 0, &pool, NULL, NULL, NULL);
config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_set_config (pool, config);
if (pool) {
GstStructure *config;
config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_set_config (pool, config);
gst_object_unref (pool);
}
}
return GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (trans,
query);

View file

@ -610,30 +610,31 @@ static gboolean
gst_video_test_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
{
GstVideoTestSrc *videotestsrc;
GstBufferPool *pool;
guint size, min, max, prefix, padding, alignment;
videotestsrc = GST_VIDEO_TEST_SRC (bsrc);
gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
&padding, &alignment, &pool);
/* adjust size */
size = MAX (size, videotestsrc->info.size);
if (gst_query_get_n_allocation_pools (query) > 0) {
GstBufferPool *pool;
guint size, min, max;
if (pool) {
GstStructure *config;
gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_set_config (pool, config);
/* adjust size */
size = MAX (size, videotestsrc->info.size);
if (pool) {
GstStructure *config;
config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_set_config (pool, config);
}
gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
if (pool)
gst_object_unref (pool);
}
gst_query_set_allocation_params (query, size, min, max, prefix,
padding, alignment, pool);
if (pool)
gst_object_unref (pool);
return TRUE;
}

View file

@ -1472,7 +1472,7 @@ gst_ximagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
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, 0, pool);
gst_query_add_allocation_pool (query, pool, size, 2, 0);
/* we also support various metadata */
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);

View file

@ -1986,7 +1986,7 @@ gst_xvimagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
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, 0, pool);
gst_query_add_allocation_pool (query, pool, size, 2, 0);
/* we also support various metadata */
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);