|
|
|
@ -272,10 +272,14 @@ static int flic_decode_frame_8BPP(AVCodecContext *avctx, |
|
|
|
|
while (compressed_lines > 0) { |
|
|
|
|
if (bytestream2_tell(&g2) + 2 > stream_ptr_after_chunk) |
|
|
|
|
break; |
|
|
|
|
if (y_ptr > pixel_limit) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
line_packets = bytestream2_get_le16(&g2); |
|
|
|
|
if ((line_packets & 0xC000) == 0xC000) { |
|
|
|
|
// line skip opcode
|
|
|
|
|
line_packets = -line_packets; |
|
|
|
|
if (line_packets > s->avctx->height) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
y_ptr += line_packets * s->frame->linesize[0]; |
|
|
|
|
} else if ((line_packets & 0xC000) == 0x4000) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Undefined opcode (%x) in DELTA_FLI\n", line_packets); |
|
|
|
@ -324,6 +328,8 @@ static int flic_decode_frame_8BPP(AVCodecContext *avctx, |
|
|
|
|
case FLI_LC: |
|
|
|
|
/* line compressed */ |
|
|
|
|
starting_line = bytestream2_get_le16(&g2); |
|
|
|
|
if (starting_line >= s->avctx->height) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
y_ptr = 0; |
|
|
|
|
y_ptr += starting_line * s->frame->linesize[0]; |
|
|
|
|
|
|
|
|
@ -564,9 +570,13 @@ static int flic_decode_frame_15_16BPP(AVCodecContext *avctx, |
|
|
|
|
while (compressed_lines > 0) { |
|
|
|
|
if (bytestream2_tell(&g2) + 2 > stream_ptr_after_chunk) |
|
|
|
|
break; |
|
|
|
|
if (y_ptr > pixel_limit) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
line_packets = bytestream2_get_le16(&g2); |
|
|
|
|
if (line_packets < 0) { |
|
|
|
|
line_packets = -line_packets; |
|
|
|
|
if (line_packets > s->avctx->height) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
y_ptr += line_packets * s->frame->linesize[0]; |
|
|
|
|
} else { |
|
|
|
|
compressed_lines--; |
|
|
|
@ -858,9 +868,13 @@ static int flic_decode_frame_24BPP(AVCodecContext *avctx, |
|
|
|
|
while (compressed_lines > 0) { |
|
|
|
|
if (bytestream2_tell(&g2) + 2 > stream_ptr_after_chunk) |
|
|
|
|
break; |
|
|
|
|
if (y_ptr > pixel_limit) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
line_packets = bytestream2_get_le16(&g2); |
|
|
|
|
if (line_packets < 0) { |
|
|
|
|
line_packets = -line_packets; |
|
|
|
|
if (line_packets > s->avctx->height) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
y_ptr += line_packets * s->frame->linesize[0]; |
|
|
|
|
} else { |
|
|
|
|
compressed_lines--; |
|
|
|
|