[Spice-devel] [PATCH spice-server 6/6] gstreamer: Avoid memory copy if strides are different

Frediano Ziglio fziglio at redhat.com
Mon Dec 12 19:28:36 UTC 2016


If bitmap stride and stream stride are different copy was used.
Using GStreamer 1.0 you can avoid the copy setting correctly
image offset and stride.

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

diff --git a/server/gstreamer-encoder.c b/server/gstreamer-encoder.c
index 7ace505..2411c36 100644
--- a/server/gstreamer-encoder.c
+++ b/server/gstreamer-encoder.c
@@ -1338,8 +1338,8 @@ static int push_raw_frame(SpiceGstEncoder *encoder,
                           gpointer bitmap_opaque)
 {
     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;
+    uint32_t chunk_index = 0;
     GstBuffer *buffer = gst_buffer_new();
     /* TODO Use GST_MAP_INFO_INIT once GStreamer 1.4.5 is no longer relevant */
     GstMapInfo map = { .memory = NULL };
@@ -1350,6 +1350,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;
 
+#ifdef HAVE_GSTREAMER_0_10
+    uint32_t stream_stride = (src->right - src->left) * encoder->format->bpp / 8;
+
+    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.
@@ -1365,9 +1369,18 @@ static int push_raw_frame(SpiceGstEncoder *encoder,
             return VIDEO_ENCODER_FRAME_UNSUPPORTED;
         }
     } else {
+#else
+    if (TRUE) {
+        /* using GStreamer 1.0 we can avoid to cropping the image if the
+         * stride is different simply passing appropriate offset and stride */
+        gsize offset[GST_VIDEO_MAX_PLANES] = {src->left * encoder->format->bpp / 8, 0, 0, 0};
+        gint stride[GST_VIDEO_MAX_PLANES] = {bitmap->stride, 0, 0, 0};
+        gst_buffer_add_video_meta_full(buffer, GST_VIDEO_FRAME_FLAG_NONE,
+            encoder->format->gst_format, bitmap->x, bitmap->y, 1, offset, stride);
+
+        len = bitmap->stride * height;
+
         /* We can copy the bitmap chunk by chunk */
-        uint32_t chunk_index = 0;
-#ifdef DO_ZERO_COPY
         if (!zero_copy(encoder, bitmap, bitmap_opaque, buffer, &chunk_index,
                        &chunk_offset, &len)) {
             gst_buffer_unref(buffer);
-- 
2.9.3



More information about the Spice-devel mailing list