Hey,

On Wed, Jul 27, 2011 at 06:11:32PM +0200, Christophe Fergeau wrote:
> Yep, I broke that in master, it's caused by the mjpeg changes, the "height"
> used when calling mjpeg_encoder_new is 1 byte less than the height which is
> then used in the loop around mjpeg_encoder_encode_scanline.

I went further debugging that, image sizes get rounded to the next even
number. I didn't notice that when I wrote the code, so the loop sending the
image to encode line by line to libjpeg uses the non-rounded height for
odd-sized images. And then libjpeg is right in complaining that one line is
missing :) The (ugly) attached  patch seems to be working as a workaround,
but I'll come up with a better fix.

Christophe
commit 74eb7e06184baf2b671c540225645d88f01d8abd
Author: Christophe Fergeau <cferg...@redhat.com>
Date:   Thu Jul 28 13:30:24 2011 +0200

    fix

diff --git a/server/red_worker.c b/server/red_worker.c
index 6737940..0ae53a7 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -7329,11 +7329,12 @@ static int encode_frame (RedWorker *worker, const 
SpiceRect *src,
         red_get_image_line(worker, chunks, &offset, &chunk, image_stride);
     }
 
-    const int image_height = src->bottom - src->top;
-    const int image_width = src->right - src->left;
+    const unsigned int stream_height = src->bottom - src->top;
+    const unsigned int stream_width = src->right - src->left;
+    uint8_t *src_line;
 
-    for (i = 0; i < image_height; i++) {
-        uint8_t *src_line =
+    for (i = 0; i < stream_height; i++) {
+        src_line =
             (uint8_t *)red_get_image_line(worker, chunks, &offset, &chunk, 
image_stride);
 
         if (!src_line) {
@@ -7341,10 +7342,14 @@ static int encode_frame (RedWorker *worker, const 
SpiceRect *src,
         }
 
         src_line += src->left * 
mjpeg_encoder_get_bytes_per_pixel(stream->mjpeg_encoder);
-        if (mjpeg_encoder_encode_scanline(stream->mjpeg_encoder, src_line, 
image_width) == 0)
+        if (mjpeg_encoder_encode_scanline(stream->mjpeg_encoder, src_line, 
stream_width) == 0)
             return FALSE;
     }
 
+    if ((stream_height > 0) && (stream_height != SPICE_ALIGN(src->bottom - 
src->top, 2)))
+        if (mjpeg_encoder_encode_scanline(stream->mjpeg_encoder, src_line, 
stream_width) == 0)
+            return FALSE;
+
     return TRUE;
 }
 

Attachment: pgp5VjqX8eYSD.pgp
Description: PGP signature

_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to