ret = decode_run_i(avctx, ptype, run, &x, &y, clr,
dst, linesize, &lx, &ly,
backstep, off, &cx, &cx1);
- if (run < 0)
+ if (ret < 0)
return ret;
}
return ret;
}
- if ((ret = ff_reget_buffer(avctx, s->current_frame)) < 0)
+ if ((ret = ff_reget_buffer(avctx, s->current_frame, 0)) < 0)
return ret;
bytestream2_init(gb, avpkt->data, avpkt->size);
s->current_frame->linesize[0] / 4);
} else if (type == 17 || type == 33) {
uint32_t clr, *dst = (uint32_t *)s->current_frame->data[0];
- int x, y;
+ int y;
+
+ if (bytestream2_get_bytes_left(gb) < 3)
+ return AVERROR_INVALIDDATA;
frame->key_frame = 1;
bytestream2_skip(gb, 1);
clr = bytestream2_get_le24(gb);
}
for (y = 0; y < avctx->height; y++) {
- for (x = 0; x < avctx->width; x++) {
- dst[x] = clr;
- }
+ dst[0] = clr;
+ av_memcpy_backptr((uint8_t*)(dst+1), 4, 4*avctx->width - 4);
dst += s->current_frame->linesize[0] / 4;
}
} else if (type == 0 || type == 1) {
if (ret < 0)
return ret;
+ if (bytestream2_get_bytes_left(gb) > 5)
+ return AVERROR_INVALIDDATA;
+
if (avctx->bits_per_coded_sample != 16) {
ret = av_frame_ref(data, s->current_frame);
if (ret < 0)
return 0;
}
-AVCodec ff_scpr_decoder = {
+const AVCodec ff_scpr_decoder = {
.name = "scpr",
.long_name = NULL_IF_CONFIG_SMALL("ScreenPressor"),
.type = AVMEDIA_TYPE_VIDEO,