|
|
|
@@ -315,14 +315,11 @@ static int cinepak_decode_strip (CinepakContext *s, |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
|
|
|
|
static int cinepak_decode (CinepakContext *s) |
|
|
|
static int cinepak_predecode_check (CinepakContext *s) |
|
|
|
{ |
|
|
|
const uint8_t *eod = (s->data + s->size); |
|
|
|
int i, result, strip_size, frame_flags, num_strips; |
|
|
|
int y0 = 0; |
|
|
|
int num_strips; |
|
|
|
int encoded_buf_size; |
|
|
|
|
|
|
|
frame_flags = s->data[0]; |
|
|
|
num_strips = AV_RB16 (&s->data[8]); |
|
|
|
encoded_buf_size = AV_RB24(&s->data[1]); |
|
|
|
|
|
|
|
@@ -353,6 +350,21 @@ static int cinepak_decode (CinepakContext *s) |
|
|
|
s->sega_film_skip_bytes = 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (s->size < 10 + s->sega_film_skip_bytes + num_strips * 12) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int cinepak_decode (CinepakContext *s) |
|
|
|
{ |
|
|
|
const uint8_t *eod = (s->data + s->size); |
|
|
|
int i, result, strip_size, frame_flags, num_strips; |
|
|
|
int y0 = 0; |
|
|
|
|
|
|
|
frame_flags = s->data[0]; |
|
|
|
num_strips = AV_RB16 (&s->data[8]); |
|
|
|
|
|
|
|
s->data += 10 + s->sega_film_skip_bytes; |
|
|
|
|
|
|
|
num_strips = FFMIN(num_strips, MAX_STRIPS); |
|
|
|
@@ -439,6 +451,11 @@ static int cinepak_decode_frame(AVCodecContext *avctx, |
|
|
|
if (s->size < 10) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
|
|
|
if ((ret = cinepak_predecode_check(s)) < 0) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "cinepak_predecode_check failed\n"); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
if ((ret = ff_reget_buffer(avctx, s->frame)) < 0) |
|
|
|
return ret; |
|
|
|
|
|
|
|
|