[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