[Spice-devel] [PATCH 5/6] LZ4: Fix the row alignment when it is not on a 32bit boundary

Christophe Fergeau cfergeau at redhat.com
Mon Jan 26 07:52:42 PST 2015


On Mon, Jan 26, 2015 at 03:20:23PM +0100, Javier Celaya wrote:
> Hello,
> 
> El Lunes, 26 de enero de 2015 15:13:57 Christophe Fergeau escribió:
> > Hey,
> > 
> > On Thu, Jan 22, 2015 at 05:21:23PM +0100, Javier Celaya wrote:
> > > ---
> > > 
> > >  common/canvas_base.c | 25 +++++++++++++++++++++++--
> > >  1 file changed, 23 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/common/canvas_base.c b/common/canvas_base.c
> > > index c45d535..170def1 100644
> > > --- a/common/canvas_base.c
> > > +++ b/common/canvas_base.c
> > > @@ -563,8 +563,7 @@ static pixman_image_t *canvas_get_lz4(CanvasBase
> > > *canvas, SpiceImage *image, int> 
> > >  {
> > >  
> > >      pixman_image_t *surface = NULL;
> > >      int dec_size, enc_size, available;
> > > 
> > > -    int stride;
> > > -    int stride_abs;
> > > +    int stride, stride_abs, stride_encoded;
> > > 
> > >      uint8_t *dest, *data, *data_end;
> > >      int width, height, top_down;
> > >      LZ4_streamDecode_t *stream;
> > > 
> > > @@ -575,19 +574,23 @@ static pixman_image_t *canvas_get_lz4(CanvasBase
> > > *canvas, SpiceImage *image, int> 
> > >      data = image->u.lz4.data->chunk[0].data;
> > >      data_end = data + image->u.lz4.data->chunk[0].len;
> > >      width = image->descriptor.width;
> > > 
> > > +    stride_encoded = width;
> > > 
> > >      height = image->descriptor.height;
> > >      top_down = *(data++);
> > >      spice_format = *(data++);
> > >      switch (spice_format) {
> > >      
> > >          case SPICE_BITMAP_FMT_16BIT:
> > >              format = PIXMAN_x1r5g5b5;
> > > 
> > > +            stride_encoded *= 2;
> > > 
> > >              break;
> > >          
> > >          case SPICE_BITMAP_FMT_24BIT:
> > >          
> > >          case SPICE_BITMAP_FMT_32BIT:
> > >              format = PIXMAN_x8r8g8b8;
> > > 
> > > +            stride_encoded *= 4;
> > > 
> > >              break;
> > >          
> > >          case SPICE_BITMAP_FMT_RGBA:
> > >              format = PIXMAN_a8r8g8b8;
> > > 
> > > +            stride_encoded *= 4;
> > > 
> > >              break;
> > >          
> > >          default:
> > >              spice_warning("Unsupported bitmap format %d with LZ4\n",
> > >              spice_format);
> > > 
> > > @@ -631,6 +634,24 @@ static pixman_image_t *canvas_get_lz4(CanvasBase
> > > *canvas, SpiceImage *image, int> 
> > >          data += enc_size;
> > >      
> > >      } while (data < data_end);
> > > 
> > > +    if (stride_abs > stride_encoded) {
> > 
> > My understanding is that this will only trigger in the 24bpp case when
> > the next commit adds
> >           case SPICE_BITMAP_FMT_24BIT:
> >               stride_encoded *= 3;
> > ?
> > If so, it should be mentioned in the commit log that this only add some
> > helper code which will be used when 24bpp support is added or something
> > like this.
> 
> It also triggers with 16bpp when width is an odd number, so the commit makes 
> sense by itself. But I can say something about the "future" support to 24bpp.

If width is an odd number, the code in this patch ends up doing 'weird'
since it copies 32 bit at a time, so it will copy 16 bit extra at the
end of each line.

Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20150126/e598da69/attachment.sig>


More information about the Spice-devel mailing list