diff options
-rw-r--r-- | meta/recipes-multimedia/gstreamer/gstreamer1.0-libav/videodec-Don-t-use-non-growable-pool.patch | 75 | ||||
-rw-r--r-- | meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.2.4.bb | 3 |
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 @@ | |||
1 | From 62a4d065ed7bd117d869fd8bcb61274c2870ddf5 Mon Sep 17 00:00:00 2001 | ||
2 | From: Nicolas Dufresne <nicolas.dufresne@collabora.com> | ||
3 | Date: Thu, 27 Mar 2014 18:53:53 -0400 | ||
4 | Subject: [PATCH] videodec: Don't use non-growable pool | ||
5 | |||
6 | As we don't know how many output buffers we need to operate, we need to | ||
7 | avoid pool that can't grow. Otherwise the pipeline may stall, waiting | ||
8 | for buffers. For now, we require it to be able to grow to at least | ||
9 | 32 buffers, which I think is a fair amount of buffers for decoders. | ||
10 | |||
11 | https://bugzilla.gnome.org/show_bug.cgi?id=726299 | ||
12 | |||
13 | Commit 2a337d926cc30cd7eaae13a4b46eea68ba89e368 in master branch | ||
14 | |||
15 | Upstream Status: Backported | ||
16 | |||
17 | Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> | ||
18 | --- | ||
19 | ext/libav/gstavviddec.c | 22 +++++++++++++++++++++- | ||
20 | 1 file changed, 21 insertions(+), 1 deletion(-) | ||
21 | |||
22 | diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c | ||
23 | index 6c9c0c9..d80fd52 100644 | ||
24 | --- a/ext/libav/gstavviddec.c | ||
25 | +++ b/ext/libav/gstavviddec.c | ||
26 | @@ -46,6 +46,7 @@ GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE); | ||
27 | #define DEFAULT_DIRECT_RENDERING TRUE | ||
28 | #define DEFAULT_DEBUG_MV FALSE | ||
29 | #define DEFAULT_MAX_THREADS 0 | ||
30 | +#define REQUIRED_POOL_MAX_BUFFERS 32 | ||
31 | |||
32 | enum | ||
33 | { | ||
34 | @@ -1620,7 +1621,7 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) | ||
35 | GstBufferPool *pool; | ||
36 | guint size, min, max; | ||
37 | GstStructure *config; | ||
38 | - gboolean have_videometa, have_alignment; | ||
39 | + gboolean have_videometa, have_alignment, update_pool; | ||
40 | GstAllocator *allocator = NULL; | ||
41 | GstAllocationParams params = { 0, 15, 0, 0, }; | ||
42 | |||
43 | @@ -1639,6 +1640,22 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) | ||
44 | |||
45 | gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max); | ||
46 | |||
47 | + /* Don't use pool that can't grow, as we don't know how many buffer we'll | ||
48 | + * need, otherwise we may stall */ | ||
49 | + if (max != 0 && max < REQUIRED_POOL_MAX_BUFFERS) { | ||
50 | + gst_object_unref (pool); | ||
51 | + pool = gst_video_buffer_pool_new (); | ||
52 | + max = 0; | ||
53 | + update_pool = TRUE; | ||
54 | + | ||
55 | + /* if there is an allocator, also drop it, as it might be the reason we | ||
56 | + * have this limit. Default will be used */ | ||
57 | + if (allocator) { | ||
58 | + gst_object_unref (allocator); | ||
59 | + allocator = NULL; | ||
60 | + } | ||
61 | + } | ||
62 | + | ||
63 | config = gst_buffer_pool_get_config (pool); | ||
64 | gst_buffer_pool_config_set_params (config, state->caps, size, min, max); | ||
65 | /* we are happy with the default allocator but we would like to have 16 bytes | ||
66 | @@ -1726,6 +1743,9 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) | ||
67 | /* and store */ | ||
68 | gst_buffer_pool_set_config (pool, config); | ||
69 | |||
70 | + if (update_pool) | ||
71 | + gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max); | ||
72 | + | ||
73 | gst_object_unref (pool); | ||
74 | if (allocator) | ||
75 | 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 \ | |||
12 | SRC_URI = " \ | 12 | SRC_URI = " \ |
13 | http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz \ | 13 | http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz \ |
14 | file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \ | 14 | file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \ |
15 | " | 15 | file://videodec-Don-t-use-non-growable-pool.patch \ |
16 | " | ||
16 | SRC_URI[md5sum] = "6454f9f22b3aa37694781633e0d20a9c" | 17 | SRC_URI[md5sum] = "6454f9f22b3aa37694781633e0d20a9c" |
17 | SRC_URI[sha256sum] = "2a69480d63fc2db93249d9e2e229ab3541bbc2db881b0f64de13d0bfc7d1f037" | 18 | SRC_URI[sha256sum] = "2a69480d63fc2db93249d9e2e229ab3541bbc2db881b0f64de13d0bfc7d1f037" |
18 | LIBAV_EXTRA_CONFIGURE_COMMON_ARG = "--target-os=linux \ | 19 | LIBAV_EXTRA_CONFIGURE_COMMON_ARG = "--target-os=linux \ |