[Spice-devel] [PATCH spice-server 1/2] Fix GStreamer encoding if stride is not 4 bytes aligned

Frediano Ziglio fziglio at redhat.com
Wed Mar 22 10:18:32 UTC 2017


This is required by GStreamer.

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 server/gstreamer-encoder.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/server/gstreamer-encoder.c b/server/gstreamer-encoder.c
index df54cad..e637b8a 100644
--- a/server/gstreamer-encoder.c
+++ b/server/gstreamer-encoder.c
@@ -1260,7 +1260,7 @@ static inline int line_copy(SpiceGstEncoder *encoder, const SpiceBitmap *bitmap,
 
          /* Copy the line */
          uint8_t *src = chunks->chunk[chunk_index].data + chunk_offset;
-         memcpy(dst, src, stream_stride);
+         memcpy(dst, src, MIN(stream_stride, bitmap->stride));
          dst += stream_stride;
          chunk_offset += bitmap->stride;
      }
@@ -1351,7 +1351,7 @@ static int push_raw_frame(SpiceGstEncoder *encoder,
 {
     uint32_t height = src->bottom - src->top;
     uint32_t stream_stride = (src->right - src->left) * encoder->format->bpp / 8;
-    uint32_t len = stream_stride * height;
+    uint32_t len;
     GstBuffer *buffer = gst_buffer_new();
     /* TODO Use GST_MAP_INFO_INIT once GStreamer 1.4.5 is no longer relevant */
     GstMapInfo map = { .memory = NULL };
@@ -1362,6 +1362,10 @@ static int push_raw_frame(SpiceGstEncoder *encoder,
     uint32_t skip_lines = top_down ? src->top : bitmap->y - (src->bottom - 0);
     uint32_t chunk_offset = bitmap->stride * skip_lines;
 
+    // GStreamer require the stream to be 4 bytes aligned
+    stream_stride = (stream_stride + 3) & -4;
+    len = stream_stride * height;
+
     if (stream_stride != bitmap->stride) {
         /* We have to do a line-by-line copy because for each we have to
          * leave out pixels on the left or right.
-- 
2.9.3



More information about the Spice-devel mailing list