]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/mmvideo.c
pthread_frame: ensure the threads don't run simultaneously with hwaccel
[ffmpeg] / libavcodec / mmvideo.c
index d80c832a3187ed69725e512735bb55f1ebe63255..0736630df72446218ee8ef6c9572b3013bad625b 100644 (file)
@@ -61,6 +61,13 @@ static av_cold int mm_decode_init(AVCodecContext *avctx)
 
     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);
@@ -92,7 +99,8 @@ static int mm_decode_intra(MmContext * s, int half_horiz, int half_vert)
     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);
@@ -106,6 +114,9 @@ static int mm_decode_intra(MmContext * s, int half_horiz, int half_vert)
         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)
@@ -241,5 +252,5 @@ AVCodec ff_mmvideo_decoder = {
     .init           = mm_decode_init,
     .close          = mm_decode_end,
     .decode         = mm_decode_frame,
-    .capabilities   = CODEC_CAP_DR1,
+    .capabilities   = AV_CODEC_CAP_DR1,
 };