aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWang Zidan <b50113@freescale.com>2014-07-22 14:49:21 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-07-23 21:44:22 +0100
commit81ae7794ddbc7e2d97118092e0613249793214ef (patch)
treeb52b897e3a86aa4c62079bbbb05a8de08750a67c
parentecd6764843f1bb3a8eeb8580db9e22231ec3c94d (diff)
downloadopenembedded-core-contrib-81ae7794ddbc7e2d97118092e0613249793214ef.tar.gz
gstreamer1.0-libav: avoid using non-growable pool for videodec
Using growable pool with at least 32 buffers for decoders. Signed-off-by: Wang Zidan <b50113@freescale.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-multimedia/gstreamer/gstreamer1.0-libav/videodec-Don-t-use-non-growable-pool.patch75
-rw-r--r--meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.2.4.bb3
2 files changed, 77 insertions, 1 deletions
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav/videodec-Don-t-use-non-growable-pool.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav/videodec-Don-t-use-non-growable-pool.patch
new file mode 100644
index 0000000000..d9b796b6bc
--- /dev/null
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav/videodec-Don-t-use-non-growable-pool.patch
@@ -0,0 +1,75 @@
+From 62a4d065ed7bd117d869fd8bcb61274c2870ddf5 Mon Sep 17 00:00:00 2001
+From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
+Date: Thu, 27 Mar 2014 18:53:53 -0400
+Subject: [PATCH] videodec: Don't use non-growable pool
+
+As we don't know how many output buffers we need to operate, we need to
+avoid pool that can't grow. Otherwise the pipeline may stall, waiting
+for buffers. For now, we require it to be able to grow to at least
+32 buffers, which I think is a fair amount of buffers for decoders.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=726299
+
+Commit 2a337d926cc30cd7eaae13a4b46eea68ba89e368 in master branch
+
+Upstream Status: Backported
+
+Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
+---
+ ext/libav/gstavviddec.c | 22 +++++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+
+diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c
+index 6c9c0c9..d80fd52 100644
+--- a/ext/libav/gstavviddec.c
++++ b/ext/libav/gstavviddec.c
+@@ -46,6 +46,7 @@ GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE);
+ #define DEFAULT_DIRECT_RENDERING TRUE
+ #define DEFAULT_DEBUG_MV FALSE
+ #define DEFAULT_MAX_THREADS 0
++#define REQUIRED_POOL_MAX_BUFFERS 32
+
+ enum
+ {
+@@ -1620,7 +1621,7 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
+ GstBufferPool *pool;
+ guint size, min, max;
+ GstStructure *config;
+- gboolean have_videometa, have_alignment;
++ gboolean have_videometa, have_alignment, update_pool;
+ GstAllocator *allocator = NULL;
+ GstAllocationParams params = { 0, 15, 0, 0, };
+
+@@ -1639,6 +1640,22 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
+
+ gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
+
++ /* Don't use pool that can't grow, as we don't know how many buffer we'll
++ * need, otherwise we may stall */
++ if (max != 0 && max < REQUIRED_POOL_MAX_BUFFERS) {
++ gst_object_unref (pool);
++ pool = gst_video_buffer_pool_new ();
++ max = 0;
++ update_pool = TRUE;
++
++ /* if there is an allocator, also drop it, as it might be the reason we
++ * have this limit. Default will be used */
++ if (allocator) {
++ gst_object_unref (allocator);
++ allocator = NULL;
++ }
++ }
++
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (config, state->caps, size, min, max);
+ /* we are happy with the default allocator but we would like to have 16 bytes
+@@ -1726,6 +1743,9 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
+ /* and store */
+ gst_buffer_pool_set_config (pool, config);
+
++ if (update_pool)
++ gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
++
+ gst_object_unref (pool);
+ if (allocator)
+ gst_object_unref (allocator);
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.2.4.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.2.4.bb
index 350b528e94..9e2321956c 100644
--- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.2.4.bb
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.2.4.bb
@@ -12,7 +12,8 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
SRC_URI = " \
http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz \
file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \
- "
+ file://videodec-Don-t-use-non-growable-pool.patch \
+"
SRC_URI[md5sum] = "6454f9f22b3aa37694781633e0d20a9c"
SRC_URI[sha256sum] = "2a69480d63fc2db93249d9e2e229ab3541bbc2db881b0f64de13d0bfc7d1f037"
LIBAV_EXTRA_CONFIGURE_COMMON_ARG = "--target-os=linux \