diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2012-03-25 04:05:05 +0400 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2012-03-25 04:09:18 +0400 |
commit | f31a68e78c129a1ed20c73c3a6a774aff8275930 (patch) | |
tree | 2e8508ad2185fb0fbe31f49e6b2bebf3b4b07023 | |
parent | 68893afe1d4583038d3788b6c3e462e42ce6074d (diff) |
interplayvideo: convert to bytestream2.
-rw-r--r-- | libavcodec/interplayvideo.c | 323 |
1 files changed, 124 insertions, 199 deletions
diff --git a/libavcodec/interplayvideo.c b/libavcodec/interplayvideo.c index 4a250a8f19..256b6c65b1 100644 --- a/libavcodec/interplayvideo.c +++ b/libavcodec/interplayvideo.c @@ -56,14 +56,8 @@ typedef struct IpvideoContext { const unsigned char *decoding_map; int decoding_map_size; - const unsigned char *buf; - int size; - int is_16bpp; - const unsigned char *stream_ptr; - const unsigned char *stream_end; - const uint8_t *mv_ptr; - const uint8_t *mv_end; + GetByteContext stream_ptr, mv_ptr; unsigned char *pixel_ptr; int line_inc; int stride; @@ -72,13 +66,6 @@ typedef struct IpvideoContext { uint32_t pal[256]; } IpvideoContext; -#define CHECK_STREAM_PTR(stream_ptr, stream_end, n) \ - if (stream_end - stream_ptr < n) { \ - av_log(s->avctx, AV_LOG_ERROR, "Interplay video warning: stream_ptr out of bounds (%p >= %p)\n", \ - stream_ptr + n, stream_end); \ - return -1; \ - } - static int copy_from(IpvideoContext *s, AVFrame *src, int delta_x, int delta_y) { int current_offset = s->pixel_ptr - s->current_frame.data[0]; @@ -118,11 +105,9 @@ static int ipvideo_decode_block_opcode_0x2(IpvideoContext *s) /* copy block from 2 frames ago using a motion vector; need 1 more byte */ if (!s->is_16bpp) { - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 1); - B = *s->stream_ptr++; + B = bytestream2_get_byte(&s->stream_ptr); } else { - CHECK_STREAM_PTR(s->mv_ptr, s->mv_end, 1); - B = *s->mv_ptr++; + B = bytestream2_get_byte(&s->mv_ptr); } if (B < 56) { @@ -146,11 +131,9 @@ static int ipvideo_decode_block_opcode_0x3(IpvideoContext *s) /* need 1 more byte for motion */ if (!s->is_16bpp) { - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 1); - B = *s->stream_ptr++; + B = bytestream2_get_byte(&s->stream_ptr); } else { - CHECK_STREAM_PTR(s->mv_ptr, s->mv_end, 1); - B = *s->mv_ptr++; + B = bytestream2_get_byte(&s->mv_ptr); } if (B < 56) { @@ -172,11 +155,9 @@ static int ipvideo_decode_block_opcode_0x4(IpvideoContext *s) /* copy a block from the previous frame; need 1 more byte */ if (!s->is_16bpp) { - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 1); - B = *s->stream_ptr++; + B = bytestream2_get_byte(&s->stream_ptr); } else { - CHECK_STREAM_PTR(s->mv_ptr, s->mv_end, 1); - B = *s->mv_ptr++; + B = bytestream2_get_byte(&s->mv_ptr); } BL = B & 0x0F; @@ -194,10 +175,8 @@ static int ipvideo_decode_block_opcode_0x5(IpvideoContext *s) /* copy a block from the previous frame using an expanded range; * need 2 more bytes */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); - - x = *s->stream_ptr++; - y = *s->stream_ptr++; + x = bytestream2_get_byte(&s->stream_ptr); + y = bytestream2_get_byte(&s->stream_ptr); av_dlog(NULL, " motion bytes = %d, %d\n", x, y); return copy_from(s, &s->last_frame, x, y); @@ -219,18 +198,14 @@ static int ipvideo_decode_block_opcode_0x7(IpvideoContext *s) unsigned int flags; /* 2-color encoding */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); - - P[0] = *s->stream_ptr++; - P[1] = *s->stream_ptr++; + P[0] = bytestream2_get_byte(&s->stream_ptr); + P[1] = bytestream2_get_byte(&s->stream_ptr); if (P[0] <= P[1]) { /* need 8 more bytes from the stream */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); - for (y = 0; y < 8; y++) { - flags = *s->stream_ptr++ | 0x100; + flags = bytestream2_get_byte(&s->stream_ptr) | 0x100; for (; flags != 1; flags >>= 1) *s->pixel_ptr++ = P[flags & 1]; s->pixel_ptr += s->line_inc; @@ -239,9 +214,7 @@ static int ipvideo_decode_block_opcode_0x7(IpvideoContext *s) } else { /* need 2 more bytes from the stream */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); - - flags = bytestream_get_le16(&s->stream_ptr); + flags = bytestream2_get_le16(&s->stream_ptr); for (y = 0; y < 8; y += 2) { for (x = 0; x < 8; x += 2, flags >>= 1) { s->pixel_ptr[x ] = @@ -260,26 +233,23 @@ static int ipvideo_decode_block_opcode_0x7(IpvideoContext *s) static int ipvideo_decode_block_opcode_0x8(IpvideoContext *s) { int x, y; - unsigned char P[2]; + unsigned char P[4]; unsigned int flags = 0; /* 2-color encoding for each 4x4 quadrant, or 2-color encoding on * either top and bottom or left and right halves */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); - - P[0] = *s->stream_ptr++; - P[1] = *s->stream_ptr++; + P[0] = bytestream2_get_byte(&s->stream_ptr); + P[1] = bytestream2_get_byte(&s->stream_ptr); if (P[0] <= P[1]) { - - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 14); - s->stream_ptr -= 2; - for (y = 0; y < 16; y++) { // new values for each 4x4 block if (!(y & 3)) { - P[0] = *s->stream_ptr++; P[1] = *s->stream_ptr++; - flags = bytestream_get_le16(&s->stream_ptr); + if (y) { + P[0] = bytestream2_get_byte(&s->stream_ptr); + P[1] = bytestream2_get_byte(&s->stream_ptr); + } + flags = bytestream2_get_le16(&s->stream_ptr); } for (x = 0; x < 4; x++, flags >>= 1) @@ -290,13 +260,11 @@ static int ipvideo_decode_block_opcode_0x8(IpvideoContext *s) } } else { + flags = bytestream2_get_le32(&s->stream_ptr); + P[2] = bytestream2_get_byte(&s->stream_ptr); + P[3] = bytestream2_get_byte(&s->stream_ptr); - /* need 10 more bytes */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 10); - - if (s->stream_ptr[4] <= s->stream_ptr[5]) { - - flags = bytestream_get_le32(&s->stream_ptr); + if (P[2] <= P[3]) { /* vertical split; left & right halves are 2-color encoded */ @@ -307,8 +275,9 @@ static int ipvideo_decode_block_opcode_0x8(IpvideoContext *s) // switch to right half if (y == 7) { s->pixel_ptr -= 8 * s->stride - 4; - P[0] = *s->stream_ptr++; P[1] = *s->stream_ptr++; - flags = bytestream_get_le32(&s->stream_ptr); + P[0] = P[2]; + P[1] = P[3]; + flags = bytestream2_get_le32(&s->stream_ptr); } } @@ -318,12 +287,12 @@ static int ipvideo_decode_block_opcode_0x8(IpvideoContext *s) for (y = 0; y < 8; y++) { if (y == 4) { - P[0] = *s->stream_ptr++; - P[1] = *s->stream_ptr++; + P[0] = P[2]; + P[1] = P[3]; + flags = bytestream2_get_le32(&s->stream_ptr); } - flags = *s->stream_ptr++ | 0x100; - for (; flags != 1; flags >>= 1) + for (x = 0; x < 8; x++, flags >>= 1) *s->pixel_ptr++ = P[flags & 1]; s->pixel_ptr += s->line_inc; } @@ -340,20 +309,15 @@ static int ipvideo_decode_block_opcode_0x9(IpvideoContext *s) unsigned char P[4]; /* 4-color encoding */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); - - memcpy(P, s->stream_ptr, 4); - s->stream_ptr += 4; + bytestream2_get_buffer(&s->stream_ptr, P, 4); if (P[0] <= P[1]) { if (P[2] <= P[3]) { /* 1 of 4 colors for each pixel, need 16 more bytes */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 16); - for (y = 0; y < 8; y++) { /* get the next set of 8 2-bit flags */ - int flags = bytestream_get_le16(&s->stream_ptr); + int flags = bytestream2_get_le16(&s->stream_ptr); for (x = 0; x < 8; x++, flags >>= 2) *s->pixel_ptr++ = P[flags & 0x03]; s->pixel_ptr += s->line_inc; @@ -363,9 +327,7 @@ static int ipvideo_decode_block_opcode_0x9(IpvideoContext *s) uint32_t flags; /* 1 of 4 colors for each 2x2 block, need 4 more bytes */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); - - flags = bytestream_get_le32(&s->stream_ptr); + flags = bytestream2_get_le32(&s->stream_ptr); for (y = 0; y < 8; y += 2) { for (x = 0; x < 8; x += 2, flags >>= 2) { @@ -382,9 +344,7 @@ static int ipvideo_decode_block_opcode_0x9(IpvideoContext *s) uint64_t flags; /* 1 of 4 colors for each 2x1 or 1x2 block, need 8 more bytes */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); - - flags = bytestream_get_le64(&s->stream_ptr); + flags = bytestream2_get_le64(&s->stream_ptr); if (P[2] <= P[3]) { for (y = 0; y < 8; y++) { for (x = 0; x < 8; x += 2, flags >>= 2) { @@ -411,24 +371,21 @@ static int ipvideo_decode_block_opcode_0x9(IpvideoContext *s) static int ipvideo_decode_block_opcode_0xA(IpvideoContext *s) { int x, y; - unsigned char P[4]; + unsigned char P[8]; int flags = 0; + bytestream2_get_buffer(&s->stream_ptr, P, 4); + /* 4-color encoding for each 4x4 quadrant, or 4-color encoding on * either top and bottom or left and right halves */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 24); - - if (s->stream_ptr[0] <= s->stream_ptr[1]) { + if (P[0] <= P[1]) { /* 4-color encoding for each quadrant; need 32 bytes */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 32); - 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); + if (y) bytestream2_get_buffer(&s->stream_ptr, P, 4); + flags = bytestream2_get_le32(&s->stream_ptr); } for (x = 0; x < 4; x++, flags >>= 2) @@ -441,20 +398,16 @@ static int ipvideo_decode_block_opcode_0xA(IpvideoContext *s) } else { // vertical split? - int vert = s->stream_ptr[12] <= s->stream_ptr[13]; - uint64_t flags = 0; + int vert; + uint64_t flags = bytestream2_get_le64(&s->stream_ptr); + + bytestream2_get_buffer(&s->stream_ptr, P + 4, 4); + vert = P[4] <= P[5]; /* 4-color encoding for either left and right or top and bottom * halves */ for (y = 0; y < 16; y++) { - // load values for each half - if (!(y & 7)) { - memcpy(P, s->stream_ptr, 4); - s->stream_ptr += 4; - flags = bytestream_get_le64(&s->stream_ptr); - } - for (x = 0; x < 4; x++, flags >>= 2) *s->pixel_ptr++ = P[flags & 0x03]; @@ -463,6 +416,12 @@ static int ipvideo_decode_block_opcode_0xA(IpvideoContext *s) // switch to right half if (y == 7) s->pixel_ptr -= 8 * s->stride - 4; } else if (y & 1) s->pixel_ptr += s->line_inc; + + // load values for second half + if (y == 7) { + memcpy(P, P + 4, 4); + flags = bytestream2_get_le64(&s->stream_ptr); + } } } @@ -475,11 +434,8 @@ static int ipvideo_decode_block_opcode_0xB(IpvideoContext *s) int y; /* 64-color encoding (each pixel in block is a different color) */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 64); - for (y = 0; y < 8; y++) { - memcpy(s->pixel_ptr, s->stream_ptr, 8); - s->stream_ptr += 8; + bytestream2_get_buffer(&s->stream_ptr, s->pixel_ptr, 8); s->pixel_ptr += s->stride; } @@ -492,14 +448,12 @@ static int ipvideo_decode_block_opcode_0xC(IpvideoContext *s) int x, y; /* 16-color block encoding: each 2x2 block is a different color */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 16); - for (y = 0; y < 8; y += 2) { for (x = 0; x < 8; x += 2) { s->pixel_ptr[x ] = s->pixel_ptr[x + 1 ] = s->pixel_ptr[x + s->stride] = - s->pixel_ptr[x + 1 + s->stride] = *s->stream_ptr++; + s->pixel_ptr[x + 1 + s->stride] = bytestream2_get_byte(&s->stream_ptr); } s->pixel_ptr += s->stride * 2; } @@ -514,12 +468,10 @@ static int ipvideo_decode_block_opcode_0xD(IpvideoContext *s) unsigned char P[2]; /* 4-color block encoding: each 4x4 block is a different color */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); - for (y = 0; y < 8; y++) { if (!(y & 3)) { - P[0] = *s->stream_ptr++; - P[1] = *s->stream_ptr++; + P[0] = bytestream2_get_byte(&s->stream_ptr); + P[1] = bytestream2_get_byte(&s->stream_ptr); } memset(s->pixel_ptr, P[0], 4); memset(s->pixel_ptr + 4, P[1], 4); @@ -536,8 +488,7 @@ static int ipvideo_decode_block_opcode_0xE(IpvideoContext *s) unsigned char pix; /* 1-color encoding: the whole block is 1 solid color */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 1); - pix = *s->stream_ptr++; + pix = bytestream2_get_byte(&s->stream_ptr); for (y = 0; y < 8; y++) { memset(s->pixel_ptr, pix, 8); @@ -554,9 +505,8 @@ static int ipvideo_decode_block_opcode_0xF(IpvideoContext *s) unsigned char sample[2]; /* dithered encoding */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); - sample[0] = *s->stream_ptr++; - sample[1] = *s->stream_ptr++; + sample[0] = bytestream2_get_byte(&s->stream_ptr); + sample[1] = bytestream2_get_byte(&s->stream_ptr); for (y = 0; y < 8; y++) { for (x = 0; x < 8; x += 2) { @@ -575,10 +525,8 @@ static int ipvideo_decode_block_opcode_0x6_16(IpvideoContext *s) signed char x, y; /* copy a block from the second last frame using an expanded range */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); - - x = *s->stream_ptr++; - y = *s->stream_ptr++; + x = bytestream2_get_byte(&s->stream_ptr); + y = bytestream2_get_byte(&s->stream_ptr); av_dlog(NULL, " motion bytes = %d, %d\n", x, y); return copy_from(s, &s->second_last_frame, x, y); @@ -592,17 +540,13 @@ static int ipvideo_decode_block_opcode_0x7_16(IpvideoContext *s) uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; /* 2-color encoding */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); - - P[0] = bytestream_get_le16(&s->stream_ptr); - P[1] = bytestream_get_le16(&s->stream_ptr); + P[0] = bytestream2_get_le16(&s->stream_ptr); + P[1] = bytestream2_get_le16(&s->stream_ptr); if (!(P[0] & 0x8000)) { - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); - for (y = 0; y < 8; y++) { - flags = *s->stream_ptr++ | 0x100; + flags = bytestream2_get_byte(&s->stream_ptr) | 0x100; for (; flags != 1; flags >>= 1) *pixel_ptr++ = P[flags & 1]; pixel_ptr += s->line_inc; @@ -610,9 +554,7 @@ static int ipvideo_decode_block_opcode_0x7_16(IpvideoContext *s) } else { - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); - - flags = bytestream_get_le16(&s->stream_ptr); + flags = bytestream2_get_le16(&s->stream_ptr); for (y = 0; y < 8; y += 2) { for (x = 0; x < 8; x += 2, flags >>= 1) { pixel_ptr[x ] = @@ -630,28 +572,25 @@ static int ipvideo_decode_block_opcode_0x7_16(IpvideoContext *s) static int ipvideo_decode_block_opcode_0x8_16(IpvideoContext *s) { int x, y; - uint16_t P[2]; + uint16_t P[4]; unsigned int flags = 0; uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; /* 2-color encoding for each 4x4 quadrant, or 2-color encoding on * either top and bottom or left and right halves */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); - - P[0] = bytestream_get_le16(&s->stream_ptr); - P[1] = bytestream_get_le16(&s->stream_ptr); + P[0] = bytestream2_get_le16(&s->stream_ptr); + P[1] = bytestream2_get_le16(&s->stream_ptr); if (!(P[0] & 0x8000)) { - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 24); - s->stream_ptr -= 4; - for (y = 0; y < 16; y++) { // new values for each 4x4 block if (!(y & 3)) { - P[0] = bytestream_get_le16(&s->stream_ptr); - P[1] = bytestream_get_le16(&s->stream_ptr); - flags = bytestream_get_le16(&s->stream_ptr); + if (y) { + P[0] = bytestream2_get_le16(&s->stream_ptr); + P[1] = bytestream2_get_le16(&s->stream_ptr); + } + flags = bytestream2_get_le16(&s->stream_ptr); } for (x = 0; x < 4; x++, flags >>= 1) @@ -663,11 +602,11 @@ static int ipvideo_decode_block_opcode_0x8_16(IpvideoContext *s) } else { - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 12); - - if (!(AV_RL16(s->stream_ptr + 4) & 0x8000)) { + flags = bytestream2_get_le32(&s->stream_ptr); + P[2] = bytestream2_get_le16(&s->stream_ptr); + P[3] = bytestream2_get_le16(&s->stream_ptr); - flags = bytestream_get_le32(&s->stream_ptr); + if (!(P[2] & 0x8000)) { /* vertical split; left & right halves are 2-color encoded */ @@ -678,9 +617,9 @@ static int ipvideo_decode_block_opcode_0x8_16(IpvideoContext *s) // switch to right half if (y == 7) { pixel_ptr -= 8 * s->stride - 4; - P[0] = bytestream_get_le16(&s->stream_ptr); - P[1] = bytestream_get_le16(&s->stream_ptr); - flags = bytestream_get_le32(&s->stream_ptr); + P[0] = P[2]; + P[1] = P[3]; + flags = bytestream2_get_le32(&s->stream_ptr); } } @@ -690,12 +629,12 @@ static int ipvideo_decode_block_opcode_0x8_16(IpvideoContext *s) for (y = 0; y < 8; y++) { if (y == 4) { - P[0] = bytestream_get_le16(&s->stream_ptr); - P[1] = bytestream_get_le16(&s->stream_ptr); + P[0] = P[2]; + P[1] = P[3]; + flags = bytestream2_get_le32(&s->stream_ptr); } - flags = *s->stream_ptr++ | 0x100; - for (; flags != 1; flags >>= 1) + for (x = 0; x < 8; x++, flags >>= 1) *pixel_ptr++ = P[flags & 1]; pixel_ptr += s->line_inc; } @@ -713,20 +652,16 @@ static int ipvideo_decode_block_opcode_0x9_16(IpvideoContext *s) uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; /* 4-color encoding */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); - for (x = 0; x < 4; x++) - P[x] = bytestream_get_le16(&s->stream_ptr); + P[x] = bytestream2_get_le16(&s->stream_ptr); if (!(P[0] & 0x8000)) { if (!(P[2] & 0x8000)) { /* 1 of 4 colors for each pixel */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 16); - for (y = 0; y < 8; y++) { /* get the next set of 8 2-bit flags */ - int flags = bytestream_get_le16(&s->stream_ptr); + int flags = bytestream2_get_le16(&s->stream_ptr); for (x = 0; x < 8; x++, flags >>= 2) *pixel_ptr++ = P[flags & 0x03]; pixel_ptr += s->line_inc; @@ -736,9 +671,7 @@ static int ipvideo_decode_block_opcode_0x9_16(IpvideoContext *s) uint32_t flags; /* 1 of 4 colors for each 2x2 block */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 4); - - flags = bytestream_get_le32(&s->stream_ptr); + flags = bytestream2_get_le32(&s->stream_ptr); for (y = 0; y < 8; y += 2) { for (x = 0; x < 8; x += 2, flags >>= 2) { @@ -755,9 +688,7 @@ static int ipvideo_decode_block_opcode_0x9_16(IpvideoContext *s) uint64_t flags; /* 1 of 4 colors for each 2x1 or 1x2 block */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); - - flags = bytestream_get_le64(&s->stream_ptr); + flags = bytestream2_get_le64(&s->stream_ptr); if (!(P[2] & 0x8000)) { for (y = 0; y < 8; y++) { for (x = 0; x < 8; x += 2, flags >>= 2) { @@ -784,25 +715,25 @@ static int ipvideo_decode_block_opcode_0x9_16(IpvideoContext *s) static int ipvideo_decode_block_opcode_0xA_16(IpvideoContext *s) { int x, y; - uint16_t P[4]; + uint16_t P[8]; int flags = 0; uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; + for (x = 0; x < 4; x++) + P[x] = bytestream2_get_le16(&s->stream_ptr); + /* 4-color encoding for each 4x4 quadrant, or 4-color encoding on * either top and bottom or left and right halves */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 24); - - if (!(AV_RL16(s->stream_ptr) & 0x8000)) { + if (!(P[0] & 0x8000)) { /* 4-color encoding for each quadrant */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 48); - for (y = 0; y < 16; y++) { // new values for each 4x4 block if (!(y & 3)) { - for (x = 0; x < 4; x++) - P[x] = bytestream_get_le16(&s->stream_ptr); - flags = bytestream_get_le32(&s->stream_ptr); + if (y) + for (x = 0; x < 4; x++) + P[x] = bytestream2_get_le16(&s->stream_ptr); + flags = bytestream2_get_le32(&s->stream_ptr); } for (x = 0; x < 4; x++, flags >>= 2) @@ -815,20 +746,17 @@ static int ipvideo_decode_block_opcode_0xA_16(IpvideoContext *s) } else { // vertical split? - int vert = !(AV_RL16(s->stream_ptr + 16) & 0x8000); - uint64_t flags = 0; + int vert; + uint64_t flags = bytestream2_get_le64(&s->stream_ptr); + + for (x = 4; x < 8; x++) + P[x] = bytestream2_get_le16(&s->stream_ptr); + vert = !(P[4] & 0x8000); /* 4-color encoding for either left and right or top and bottom * halves */ for (y = 0; y < 16; y++) { - // load values for each half - if (!(y & 7)) { - for (x = 0; x < 4; x++) - P[x] = bytestream_get_le16(&s->stream_ptr); - flags = bytestream_get_le64(&s->stream_ptr); - } - for (x = 0; x < 4; x++, flags >>= 2) *pixel_ptr++ = P[flags & 0x03]; @@ -837,6 +765,12 @@ static int ipvideo_decode_block_opcode_0xA_16(IpvideoContext *s) // switch to right half if (y == 7) pixel_ptr -= 8 * s->stride - 4; } else if (y & 1) pixel_ptr += s->line_inc; + + // load values for second half + if (y == 7) { + memcpy(P, P + 4, 8); + flags = bytestream2_get_le64(&s->stream_ptr); + } } } @@ -850,11 +784,9 @@ static int ipvideo_decode_block_opcode_0xB_16(IpvideoContext *s) uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; /* 64-color encoding (each pixel in block is a different color) */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 128); - for (y = 0; y < 8; y++) { for (x = 0; x < 8; x++) - pixel_ptr[x] = bytestream_get_le16(&s->stream_ptr); + pixel_ptr[x] = bytestream2_get_le16(&s->stream_ptr); pixel_ptr += s->stride; } @@ -868,14 +800,12 @@ static int ipvideo_decode_block_opcode_0xC_16(IpvideoContext *s) uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; /* 16-color block encoding: each 2x2 block is a different color */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 32); - for (y = 0; y < 8; y += 2) { for (x = 0; x < 8; x += 2) { pixel_ptr[x ] = pixel_ptr[x + 1 ] = pixel_ptr[x + s->stride] = - pixel_ptr[x + 1 + s->stride] = bytestream_get_le16(&s->stream_ptr); + pixel_ptr[x + 1 + s->stride] = bytestream2_get_le16(&s->stream_ptr); } pixel_ptr += s->stride * 2; } @@ -891,12 +821,10 @@ static int ipvideo_decode_block_opcode_0xD_16(IpvideoContext *s) uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; /* 4-color block encoding: each 4x4 block is a different color */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 8); - for (y = 0; y < 8; y++) { if (!(y & 3)) { - P[0] = bytestream_get_le16(&s->stream_ptr); - P[1] = bytestream_get_le16(&s->stream_ptr); + P[0] = bytestream2_get_le16(&s->stream_ptr); + P[1] = bytestream2_get_le16(&s->stream_ptr); } for (x = 0; x < 8; x++) pixel_ptr[x] = P[x >> 2]; @@ -914,8 +842,7 @@ static int ipvideo_decode_block_opcode_0xE_16(IpvideoContext *s) uint16_t *pixel_ptr = (uint16_t*)s->pixel_ptr; /* 1-color encoding: the whole block is 1 solid color */ - CHECK_STREAM_PTR(s->stream_ptr, s->stream_end, 2); - pix = bytestream_get_le16(&s->stream_ptr); + pix = bytestream2_get_le16(&s->stream_ptr); for (y = 0; y < 8; y++) { for (x = 0; x < 8; x++) @@ -960,19 +887,16 @@ static void ipvideo_decode_opcodes(IpvideoContext *s) av_dlog(NULL, "------------------ frame %d\n", frame); frame++; + bytestream2_skip(&s->stream_ptr, 14); /* data starts 14 bytes in */ if (!s->is_16bpp) { /* this is PAL8, so make the palette available */ memcpy(s->current_frame.data[1], s->pal, AVPALETTE_SIZE); s->stride = s->current_frame.linesize[0]; - s->stream_ptr = s->buf + 14; /* data starts 14 bytes in */ - s->stream_end = s->buf + s->size; } else { s->stride = s->current_frame.linesize[0] >> 1; - s->stream_ptr = s->buf + 16; - s->stream_end = - s->mv_ptr = s->buf + 14 + AV_RL16(s->buf+14); - s->mv_end = s->buf + s->size; + s->mv_ptr = s->stream_ptr; + bytestream2_skip(&s->mv_ptr, bytestream2_get_le16(&s->stream_ptr)); } s->line_inc = s->stride - 8; s->upper_motion_limit_offset = (s->avctx->height - 8) * s->current_frame.linesize[0] @@ -1002,9 +926,10 @@ static void ipvideo_decode_opcodes(IpvideoContext *s) } } } - if (s->stream_end - s->stream_ptr > 1) { - av_log(s->avctx, AV_LOG_ERROR, " Interplay video: decode finished with %td bytes left over\n", - s->stream_end - s->stream_ptr); + if (bytestream2_get_bytes_left(&s->stream_ptr) > 1) { + av_log(s->avctx, AV_LOG_ERROR, + "Interplay video: decode finished with %d bytes left over\n", + bytestream2_get_bytes_left(&s->stream_ptr)); } } @@ -1042,8 +967,8 @@ static int ipvideo_decode_frame(AVCodecContext *avctx, return buf_size; s->decoding_map = buf; - s->buf = buf + s->decoding_map_size; - s->size = buf_size - s->decoding_map_size; + bytestream2_init(&s->stream_ptr, buf + s->decoding_map_size, + buf_size - s->decoding_map_size); s->current_frame.reference = 3; if (avctx->get_buffer(avctx, &s->current_frame)) { |