[Swfdec-commits] swfdec/swfdec_video_decoder_screen.c

Benjamin Otte company at kemper.freedesktop.org
Wed Jun 25 06:44:05 PDT 2008


 swfdec/swfdec_video_decoder_screen.c |   21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

New commits:
commit a94963359fbc01d3556883211e6036eb8660ab5b
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Jun 25 15:43:04 2008 +0200

    fix screen decoder
    
    - pointer math fixes for 64bit
    - compute the size of the decoded buffer correctly

diff --git a/swfdec/swfdec_video_decoder_screen.c b/swfdec/swfdec_video_decoder_screen.c
index 8a7b91d..42504b5 100644
--- a/swfdec/swfdec_video_decoder_screen.c
+++ b/swfdec/swfdec_video_decoder_screen.c
@@ -78,16 +78,18 @@ swfdec_video_decoder_screen_decode (SwfdecVideoDecoder *dec, SwfdecBuffer *buffe
     return;
   }
   stride = w * 4;
-  SWFDEC_LOG ("size: %u x %u - block size %u x %u\n", w, h, bw, bh);
+  SWFDEC_LOG ("size: %u x %u - block size %u x %u", w, h, bw, bh);
   for (j = 0; j < h; j += bh) {
     for (i = 0; i < w; i += bw) {
-      guint x, y, size;
+      guint x, y, size, curw, curh;
       SwfdecBuffer *buf;
       guint8 *in, *out;
       size = swfdec_bits_get_bu16 (&bits);
       if (size == 0)
 	continue;
-      buf = swfdec_bits_decompress (&bits, size, bw * bh * 4);
+      curw = MIN (bw, w - i);
+      curh = MIN (bh, h - j);
+      buf = swfdec_bits_decompress (&bits, size, curw * curh * 3);
       if (buf == NULL) {
 	SWFDEC_ERROR ("could not decode block at %ux%u", i, j);
 	continue;
@@ -95,13 +97,14 @@ swfdec_video_decoder_screen_decode (SwfdecVideoDecoder *dec, SwfdecBuffer *buffe
       /* convert format and write out data */
       out = dec->plane[0] + stride * (h - j - 1) + i * 4;
       in = buf->data;
-      for (y = 0; y < MIN (bh, h - j); y++) {
-	for (x = 0; x < MIN (bw, w - i); x++) {
-	  out[x * 4 - y * stride + SWFDEC_COLOR_INDEX_BLUE] = *in++;
-	  out[x * 4 - y * stride + SWFDEC_COLOR_INDEX_GREEN] = *in++;
-	  out[x * 4 - y * stride + SWFDEC_COLOR_INDEX_RED] = *in++;
-	  out[x * 4 - y * stride + SWFDEC_COLOR_INDEX_ALPHA] = 0xFF;
+      for (y = 0; y < curh; y++) {
+	for (x = 0; x < curw; x++) {
+	  out[x * 4 + SWFDEC_COLOR_INDEX_BLUE] = *in++;
+	  out[x * 4 + SWFDEC_COLOR_INDEX_GREEN] = *in++;
+	  out[x * 4 + SWFDEC_COLOR_INDEX_RED] = *in++;
+	  out[x * 4 + SWFDEC_COLOR_INDEX_ALPHA] = 0xFF;
 	}
+	out -= stride;
       }
       swfdec_buffer_unref (buf);
     }


More information about the Swfdec-commits mailing list