summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabien Dessenne <fabien.dessenne@st.com>2017-01-30 11:04:32 +0100
committerNicolas Dufresne <nicolas.dufresne@collabora.com>2017-02-22 04:23:44 -0500
commite2dffab9bee8611b0daa818806f36541bfedde26 (patch)
tree0db421406c9fe8f42bf69c099774d3d6605caa02
parentb1efa8d4993fc5095c83fe27694ba9c225f70efd (diff)
downloadgstreamer-plugins-bad-e2dffab9bee8611b0daa818806f36541bfedde26.tar.gz
waylandsink: consider buffer size when copying to wl shm pool
When the sink receives a buffer that is neither a wl_shm one nor a dmabuf one, this buffer is copied to an internal wl_shm buffer before being sent to the display. In that case, the actual size of the received buffer (which may differ from the one negotiated in the caps) must be used. https://bugzilla.gnome.org/show_bug.cgi?id=777841
-rw-r--r--ext/wayland/gstwaylandsink.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
index 1da0d7df7..0d974196d 100644
--- a/ext/wayland/gstwaylandsink.c
+++ b/ext/wayland/gstwaylandsink.c
@@ -639,6 +639,8 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer)
}
/* update video info from video meta */
+ mem = gst_buffer_peek_memory (buffer, 0);
+
vmeta = gst_buffer_get_video_meta (buffer);
if (vmeta) {
gint i;
@@ -647,13 +649,12 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer)
sink->video_info.offset[i] = vmeta->offset[i];
sink->video_info.stride[i] = vmeta->stride[i];
}
+ sink->video_info.size = mem->size;
}
GST_LOG_OBJECT (sink, "buffer %p does not have a wl_buffer from our "
"display, creating it", buffer);
- mem = gst_buffer_peek_memory (buffer, 0);
-
format = GST_VIDEO_INFO_FORMAT (&sink->video_info);
if (gst_wl_display_check_format_for_dmabuf (sink->display, format)) {
guint i, nb_dmabuf = 0;
@@ -687,11 +688,11 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer)
if (!gst_buffer_pool_is_active (sink->pool)) {
GstStructure *config;
GstCaps *caps;
- guint size = sink->video_info.size;
config = gst_buffer_pool_get_config (sink->pool);
- gst_buffer_pool_config_get_params (config, &caps, &size, NULL, NULL);
- gst_buffer_pool_config_set_params (config, caps, size, 2, 0);
+ gst_buffer_pool_config_get_params (config, &caps, NULL, NULL, NULL);
+ gst_buffer_pool_config_set_params (config, caps, sink->video_info.size,
+ 2, 0);
/* This is a video pool, it should not fail with basic setings */
if (!gst_buffer_pool_set_config (sink->pool, config) ||