gnu: gstreamer: Fix buffer offset problem.

* gnu/packages/patches/gstreamer-buffer-reset-offset.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/gstreamer.scm (gstreamer)[source](patches): New field.
[arguments]: Do not disable any tests.
master
Marius Bakke 2019-06-29 19:07:40 +02:00
parent bdb51ed6d1
commit 55d1d9eb2f
No known key found for this signature in database
GPG Key ID: A2A06DF2A33A54FA
3 changed files with 62 additions and 13 deletions

View File

@ -901,6 +901,7 @@ dist_patch_DATA = \
%D%/packages/patches/guile-relocatable.patch \
%D%/packages/patches/guile-rsvg-pkgconfig.patch \
%D%/packages/patches/guile-emacs-fix-configure.patch \
%D%/packages/patches/gstreamer-buffer-reset-offset.patch \
%D%/packages/patches/gtk2-respect-GUIX_GTK2_PATH.patch \
%D%/packages/patches/gtk2-respect-GUIX_GTK2_IM_MODULE_FILE.patch \
%D%/packages/patches/gtk2-theme-paths.patch \

View File

@ -110,6 +110,7 @@ arrays of data.")
(uri (string-append
"https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-"
version ".tar.xz"))
(patches (search-patches "gstreamer-buffer-reset-offset.patch"))
(sha256
(base32
"003wy1p1in85p9sr5jsyhbnwqaiwz069flwkhyx7qhxy31qjz3hf"))))
@ -119,19 +120,7 @@ arrays of data.")
`(#:configure-flags
(list (string-append "--with-html-dir="
(assoc-ref %outputs "doc")
"/share/gtk-doc/html"))
,@(if (not (target-64bit?))
;; Skip test that fails on 32-bit systems:
;; <https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/316>.
`(#:phases (modify-phases %standard-phases
(add-before 'check 'disable-gstbufferpool-test
(lambda _
(substitute* "tests/check/Makefile"
(("^[[:blank:]]+gst/gstbufferpool.*$")
""))
#t))))
'())))
"/share/gtk-doc/html"))))
(propagated-inputs `(("glib" ,glib))) ; required by gstreamer-1.0.pc.
(native-inputs
`(("bison" ,bison)

View File

@ -0,0 +1,59 @@
Fix a buffer offset problem in GStreamer 1.16. Initially reported by Mark H.
Weaver in <https://lists.gnu.org/archive/html/guix-devel/2019-06/msg00140.html>.
See also <https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/316>.
From 1734c9fc1a4f99b165383ae1eb02f04e0844a00c Mon Sep 17 00:00:00 2001
From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Date: Sat, 29 Jun 2019 09:22:05 -0400
Subject: [PATCH] bufferpool: Fix the buffer size reset code
The offset in gst_buffer_resize() is additive. So to move back the
offset to zero, we need to pass the opposite of the current offset. This
was raised through the related unit test failingon 32bit as on 64bit
the alignment padding was enough to hide the issue. The test was
modified to also fail on 64bit. This patch will remove spurious
assertions like:
assertion 'bufmax >= bufoffs + offset + size' failed
Fixes #316
---
gst/gstbufferpool.c | 7 +++++--
tests/check/gst/gstbufferpool.c | 2 +-
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/gst/gstbufferpool.c b/gst/gstbufferpool.c
index e5c7a5872..619860e63 100644
--- a/gst/gstbufferpool.c
+++ b/gst/gstbufferpool.c
@@ -1222,8 +1222,11 @@ default_reset_buffer (GstBufferPool * pool, GstBuffer * buffer)
GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE;
/* if the memory is intact reset the size to the full size */
- if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_TAG_MEMORY))
- gst_buffer_resize (buffer, 0, pool->priv->size);
+ if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_TAG_MEMORY)) {
+ gsize offset;
+ gst_buffer_get_sizes (buffer, &offset, NULL);
+ gst_buffer_resize (buffer, -offset, pool->priv->size);
+ }
/* remove all metadata without the POOLED flag */
gst_buffer_foreach_meta (buffer, remove_meta_unpooled, pool);
diff --git a/tests/check/gst/gstbufferpool.c b/tests/check/gst/gstbufferpool.c
index f0c3c8d8e..dd9b2dc03 100644
--- a/tests/check/gst/gstbufferpool.c
+++ b/tests/check/gst/gstbufferpool.c
@@ -190,7 +190,7 @@ GST_START_TEST (test_buffer_modify_discard)
gst_buffer_pool_acquire_buffer (pool, &buf, NULL);
buffer_track_destroy (buf, &dcount);
/* do resize, as we didn't modify the memory, pool should reuse this buffer */
- gst_buffer_resize (buf, 5, 2);
+ gst_buffer_resize (buf, 8, 2);
gst_buffer_unref (buf);
/* buffer should've gone back into pool */
--
2.22.0