meta-digi/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0013-waylandsink-silently-d...

100 lines
3.4 KiB
Diff

From e14996eb9c0332aeda6390db207380dd0267e7c2 Mon Sep 17 00:00:00 2001
From: Hugues Fruchet <hugues.fruchet@st.com>
Date: Wed, 25 Sep 2019 16:01:49 +0200
Subject: [PATCH 13/14] waylandsink: silently drop erroneous frame
Do not stop playback when erroneous frame is received at show_frame():
- test file descriptors validity, to not let throw erroneous
file descriptor to wayland backend (which may crash on fatal error)
- if file descriptors are not valid, do not fall into general
"GST_ELEMENT_ERROR" nor return FLOW_ERROR.
Upstream-Status: Inappropriate [DEY specific]
Signed-off-by: Hugues Fruchet <hugues.fruchet@st.com>
---
ext/wayland/gstwaylandsink.c | 6 +++---
ext/wayland/wllinuxdmabuf.c | 14 ++++++++++++++
ext/wayland/wlshmallocator.c | 10 ++++++++++
3 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
index e4952cb..cf355d3 100644
--- a/ext/wayland/gstwaylandsink.c
+++ b/ext/wayland/gstwaylandsink.c
@@ -1025,9 +1025,9 @@ activate_failed:
}
src_map_failed:
{
- GST_ELEMENT_ERROR (sink, RESOURCE, READ,
- ("Video memory can not be read from userspace."), (NULL));
- ret = GST_FLOW_ERROR;
+ /* Silently drop in case of erroneous buffer */
+ GST_ERROR_OBJECT (sink, "Video memory can not be read from userspace,"
+ "dropping buffer %p", buffer);
goto done;
}
dst_map_failed:
diff --git a/ext/wayland/wllinuxdmabuf.c b/ext/wayland/wllinuxdmabuf.c
index 96487d1..36815b5 100644
--- a/ext/wayland/wllinuxdmabuf.c
+++ b/ext/wayland/wllinuxdmabuf.c
@@ -28,6 +28,8 @@
#include "wllinuxdmabuf.h"
#include "wlvideoformat.h"
+#include <unistd.h>
+
GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug);
#define GST_CAT_DEFAULT gstwayland_debug
@@ -110,6 +112,18 @@ gst_wl_linux_dmabuf_construct_wl_buffer (GstBuffer * buf,
if (gst_buffer_find_memory (buf, offset, 1, &mem_idx, &length, &skip)) {
GstMemory *m = gst_buffer_peek_memory (buf, mem_idx);
gint fd = gst_dmabuf_memory_get_fd (m);
+ gint dup_fd = dup (fd);
+
+ /* Test if file descriptor is valid */
+ if (dup_fd < 0) {
+ GST_ERROR_OBJECT (display, "zwp_linux_dmabuf: dup failed for fd=%d (err=%d) buffer=%p",
+ fd, dup_fd, buf);
+ zwp_linux_buffer_params_v1_destroy (params);
+ data.wbuf = NULL;
+ goto out;
+ }
+ close(dup_fd);
+
zwp_linux_buffer_params_v1_add (params, fd, i, m->offset + skip,
stride, 0, 0);
} else {
diff --git a/ext/wayland/wlshmallocator.c b/ext/wayland/wlshmallocator.c
index 0a82a35..8659c2f 100644
--- a/ext/wayland/wlshmallocator.c
+++ b/ext/wayland/wlshmallocator.c
@@ -212,12 +212,22 @@ gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display,
enum wl_shm_format format;
struct wl_shm_pool *wl_pool;
struct wl_buffer *wbuffer;
+ gint fd = gst_fd_memory_get_fd (mem);
+ gint dup_fd = dup(fd);
if (!gst_wl_shm_validate_video_info (info)) {
GST_DEBUG_OBJECT (display, "Unsupported strides and offsets.");
return NULL;
}
+ /* Test if file descriptor is valid */
+ if (dup_fd < 0) {
+ GST_ERROR_OBJECT (display, "wl_shm_memory: dup failed for fd=%d (err=%d) mem=%p",
+ fd, dup_fd, mem);
+ return NULL;
+ }
+ close(dup_fd);
+
width = GST_VIDEO_INFO_WIDTH (info);
height = GST_VIDEO_INFO_HEIGHT (info);
stride = GST_VIDEO_INFO_PLANE_STRIDE (info, 0);
--
2.25.1