]> git.sesse.net Git - nageru/commitdiff
Fix a buffer overrun when receiving 4K (or 8K etc.) FFmpeg streams.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Mon, 17 Apr 2023 16:19:46 +0000 (18:19 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Mon, 17 Apr 2023 16:24:07 +0000 (18:24 +0200)
Of course, it would be better to just support this than to throw them away,
but at least we avoid a crash.

nageru/ffmpeg_capture.cpp

index 96449214a59c8db7d9955918785276133e7e7838..dd053f89292a409c84f7064c422478d7bfd32990 100644 (file)
@@ -1144,6 +1144,16 @@ UniqueFrame FFmpegCapture::make_video_frame(const AVFrame *frame, const string &
 
                current_frame_ycbcr_format = decode_ycbcr_format(desc, frame, is_mjpeg, &last_colorspace, &last_chroma_location);
        }
+
+       // FIXME: Currently, if the video is too high-res for one of the allocated
+       // frames, we simply refuse to scale it here to avoid crashes. It would be better
+       // if we could somehow signal getting larger frames, especially as 4K is a thing now.
+       if (video_frame->len > FRAME_SIZE) {
+               fprintf(stderr, "%s: Decoded frame would be larger than supported FRAME_SIZE (%zu > %u), not decoding.\n", pathname.c_str(), video_frame->len, FRAME_SIZE);
+               *error = true;
+               return video_frame;
+       }
+
        sws_scale(sws_ctx.get(), frame->data, frame->linesize, 0, frame->height, pic_data, linesizes);
 
        return video_frame;