|
|
|
@ -70,34 +70,34 @@ static int msrle_decode_pal4(AVCodecContext *avctx, AVPicture *pic, |
|
|
|
|
pixel_ptr += stream_byte; |
|
|
|
|
FETCH_NEXT_STREAM_BYTE(); |
|
|
|
|
row_ptr -= stream_byte * row_dec; |
|
|
|
|
} else { |
|
|
|
|
// copy pixels from encoded stream
|
|
|
|
|
odd_pixel = stream_byte & 1; |
|
|
|
|
rle_code = (stream_byte + 1) / 2; |
|
|
|
|
extra_byte = rle_code & 0x01; |
|
|
|
|
if ((row_ptr + pixel_ptr + stream_byte > frame_size) || |
|
|
|
|
(row_ptr < 0)) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, " MS RLE: frame ptr just went out of bounds (1)\n"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// copy pixels from encoded stream
|
|
|
|
|
odd_pixel = stream_byte & 1; |
|
|
|
|
rle_code = (stream_byte + 1) / 2; |
|
|
|
|
extra_byte = rle_code & 0x01; |
|
|
|
|
if ((row_ptr + pixel_ptr + stream_byte > frame_size) || |
|
|
|
|
(row_ptr < 0)) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, " MS RLE: frame ptr just went out of bounds (1)\n"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (i = 0; i < rle_code; i++) { |
|
|
|
|
if (pixel_ptr >= avctx->width) |
|
|
|
|
break; |
|
|
|
|
FETCH_NEXT_STREAM_BYTE(); |
|
|
|
|
pic->data[0][row_ptr + pixel_ptr] = stream_byte >> 4; |
|
|
|
|
pixel_ptr++; |
|
|
|
|
if (i + 1 == rle_code && odd_pixel) |
|
|
|
|
break; |
|
|
|
|
if (pixel_ptr >= avctx->width) |
|
|
|
|
break; |
|
|
|
|
pic->data[0][row_ptr + pixel_ptr] = stream_byte & 0x0F; |
|
|
|
|
pixel_ptr++; |
|
|
|
|
} |
|
|
|
|
for (i = 0; i < rle_code; i++) { |
|
|
|
|
if (pixel_ptr >= avctx->width) |
|
|
|
|
break; |
|
|
|
|
FETCH_NEXT_STREAM_BYTE(); |
|
|
|
|
pic->data[0][row_ptr + pixel_ptr] = stream_byte >> 4; |
|
|
|
|
pixel_ptr++; |
|
|
|
|
if (i + 1 == rle_code && odd_pixel) |
|
|
|
|
break; |
|
|
|
|
if (pixel_ptr >= avctx->width) |
|
|
|
|
break; |
|
|
|
|
pic->data[0][row_ptr + pixel_ptr] = stream_byte & 0x0F; |
|
|
|
|
pixel_ptr++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// if the RLE code is odd, skip a byte in the stream
|
|
|
|
|
if (extra_byte) |
|
|
|
|
stream_ptr++; |
|
|
|
|
// if the RLE code is odd, skip a byte in the stream
|
|
|
|
|
if (extra_byte) |
|
|
|
|
stream_ptr++; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// decode a run of data
|
|
|
|
|