From 3c04db4a307048db70ee1d08c1d62e26ad9569d8 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Sun, 18 Jan 2015 11:02:00 -0500 Subject: [PATCH] videorate: Implement allocation query VideRate keeps 1 buffer in order to duplicate base on closest buffer relative to targeted time. This extra buffer need to be request otherwise the pipeline may stall when fixed size buffer pool is used. https://bugzilla.gnome.org/show_bug.cgi?id=738302 --- gst/videorate/Makefile.am | 3 ++- gst/videorate/gstvideorate.c | 43 +++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/gst/videorate/Makefile.am b/gst/videorate/Makefile.am index d950ad9840..1a5631ed83 100644 --- a/gst/videorate/Makefile.am +++ b/gst/videorate/Makefile.am @@ -5,7 +5,8 @@ plugin_LTLIBRARIES = libgstvideorate.la libgstvideorate_la_SOURCES = gstvideorate.c libgstvideorate_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) libgstvideorate_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -libgstvideorate_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) +libgstvideorate_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) \ + $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_API_VERSION).la libgstvideorate_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS) Android.mk: Makefile.am $(BUILT_SOURCES) diff --git a/gst/videorate/gstvideorate.c b/gst/videorate/gstvideorate.c index 6a20258526..f996dc5ca3 100644 --- a/gst/videorate/gstvideorate.c +++ b/gst/videorate/gstvideorate.c @@ -70,6 +70,7 @@ #endif #include "gstvideorate.h" +#include GST_DEBUG_CATEGORY_STATIC (video_rate_debug); #define GST_CAT_DEFAULT video_rate_debug @@ -848,18 +849,48 @@ gst_video_rate_query (GstBaseTransform * trans, GstPadDirection direction, gst_query_set_latency (query, live, min, max); } gst_object_unref (peer); - break; } - /* Simple fallthrough if we don't have a latency or not a peer that we - * can't ask about its latency yet.. */ + break; + } + case GST_QUERY_ALLOCATION: + { + guint i, n_allocation; + + n_allocation = gst_query_get_n_allocation_pools (query); + + for (i = 0; i < n_allocation; i++) { + GstBufferPool *pool; + guint size, min, max; + + gst_query_parse_nth_allocation_pool (query, i, &pool, &size, &min, + &max); + + min += 1; + + if (max != 0) + max = MAX (min, max); + + gst_query_set_nth_allocation_pool (query, i, pool, size, min, max); + } + + if (n_allocation == 0) { + GstCaps *caps; + GstVideoInfo info; + + gst_query_parse_allocation (query, &caps, NULL); + gst_video_info_from_caps (&info, caps); + + gst_query_add_allocation_pool (query, NULL, info.size, 1, 0); + } + break; } default: - res = - GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction, - query); break; } + res = + GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction, query); + return res; } -- 2.34.1