diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2009-03-31 18:48:31 +0000 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2009-03-31 18:48:31 +0000 |
commit | 5e8b83ac3be00dc7a8d19f503a29c7b7d949b6ad (patch) | |
tree | 553dad7623bee5e7792293deff1c0f45dde9e8cc /libavcodec/interplayvideo.c | |
parent | f938cbf984dc51adc135fca0c1d3dbe5bd8e72ee (diff) | |
download | ffmpeg-5e8b83ac3be00dc7a8d19f503a29c7b7d949b6ad.tar.gz |
Slightly simplify first part of ipvideo_decode_block_opcode_0xA,
hopefully allows for further simplifications in the future.
Originally committed as revision 18280 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/interplayvideo.c')
-rw-r--r-- | libavcodec/interplayvideo.c | 35 |
1 files changed, 14 insertions, 21 deletions
diff --git a/libavcodec/interplayvideo.c b/libavcodec/interplayvideo.c index 9bcc9f45e9..40f7cd7922 100644 --- a/libavcodec/interplayvideo.c +++ b/libavcodec/interplayvideo.c @@ -399,12 +399,10 @@ static int ipvideo_decode_block_opcode_0x9(IpvideoContext *s) 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 @@ static int ipvideo_decode_block_opcode_0xA(IpvideoContext *s) /* 4-color encoding for each quadrant; need 28 more bytes */ CHECK_STREAM_PTR(28); + s->stream_ptr -= 4; - 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; - } - - for (y = 0; y < 8; y++) { - - lower_half = (y >= 4) ? 4 : 0; - flags = (B[y + 8] << 8) | B[y]; + 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); + } - 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 (x = 0; x < 4; x++, flags >>= 2) { + *s->pixel_ptr++ = P[flags & 0x03]; } - s->pixel_ptr += s->line_inc; + s->pixel_ptr += s->stride - 4; + // switch to right half + if (y == 7) s->pixel_ptr -= 8 * s->stride - 4; } } else { |