# HG changeset patch # User reimar # Date 1238525311 0 # Node ID a476e5590725d5b8761b076330ac5bc683011040 # Parent a8352444823b75a3e7e7290bd689fb3c7c46ff40 Slightly simplify first part of ipvideo_decode_block_opcode_0xA, hopefully allows for further simplifications in the future. diff -r a8352444823b -r a476e5590725 interplayvideo.c --- a/interplayvideo.c Tue Mar 31 18:41:39 2009 +0000 +++ b/interplayvideo.c Tue Mar 31 18:48:31 2009 +0000 @@ -399,12 +399,10 @@ static int ipvideo_decode_block_opcode_0xA(IpvideoContext *s) { int x, y; - unsigned char P[16]; + unsigned char P[8]; unsigned char B[16]; int flags = 0; - int index; int split; - int lower_half; /* 4-color encoding for each 4x4 quadrant, or 4-color encoding on * either top and bottom or left and right halves */ @@ -417,28 +415,23 @@ /* 4-color encoding for each quadrant; need 28 more bytes */ CHECK_STREAM_PTR(28); - - memcpy(B, s->stream_ptr, 4); - s->stream_ptr += 4; - for (y = 4; y < 16; y += 4) { - memcpy(P + y, s->stream_ptr, 4); - s->stream_ptr += 4; - memcpy(B + y, s->stream_ptr, 4); - s->stream_ptr += 4; - } + s->stream_ptr -= 4; - for (y = 0; y < 8; y++) { - - lower_half = (y >= 4) ? 4 : 0; - flags = (B[y + 8] << 8) | B[y]; - - for (x = 0; x < 8; x++, flags >>= 2) { - split = (x >= 4) ? 8 : 0; - index = split + lower_half + (flags & 0x03); - *s->pixel_ptr++ = P[index]; + for (y = 0; y < 16; y++) { + // new values for each 4x4 block + if (!(y & 3)) { + memcpy(P, s->stream_ptr, 4); + s->stream_ptr += 4; + flags = bytestream_get_le32(&s->stream_ptr); } - s->pixel_ptr += s->line_inc; + for (x = 0; x < 4; x++, flags >>= 2) { + *s->pixel_ptr++ = P[flags & 0x03]; + } + + s->pixel_ptr += s->stride - 4; + // switch to right half + if (y == 7) s->pixel_ptr -= 8 * s->stride - 4; } } else {