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
This commit is contained in:
Nicolas Dufresne 2015-01-18 11:02:00 -05:00
parent 2228d9f22b
commit 3c04db4a30
2 changed files with 39 additions and 7 deletions

View file

@ -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)

View file

@ -70,6 +70,7 @@
#endif
#include "gstvideorate.h"
#include <gst/video/video.h>
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;
}