avctx->pix_fmt = AV_PIX_FMT_PAL8;
+ if (!avctx->width || !avctx->height ||
+ (avctx->width & 1) || (avctx->height & 1)) {
+ av_log(avctx, AV_LOG_ERROR, "Invalid video dimensions: %dx%d\n",
+ avctx->width, avctx->height);
+ return AVERROR(EINVAL);
+ }
+
s->frame = av_frame_alloc();
if (!s->frame)
return AVERROR(ENOMEM);
while (bytestream2_get_bytes_left(&s->gb) > 0) {
int run_length, color;
- if (y >= s->avctx->height)
+ // writes one more line when half_vert is true
+ if (y >= s->avctx->height + !!half_vert)
return 0;
color = bytestream2_get_byte(&s->gb);
if (half_horiz)
run_length *=2;
+ if (s->avctx->width - x < run_length)
+ return AVERROR_INVALIDDATA;
+
if (color) {
memset(s->frame->data[0] + y*s->frame->linesize[0] + x, color, run_length);
if (half_vert)
.init = mm_decode_init,
.close = mm_decode_end,
.decode = mm_decode_frame,
- .capabilities = CODEC_CAP_DR1,
+ .capabilities = AV_CODEC_CAP_DR1,
};