From e10473f13ec6dd7e19eaacc989e92b9616b014af Mon Sep 17 00:00:00 2001 From: James Almer Date: Mon, 6 Oct 2025 10:21:03 -0300 Subject: [PATCH] avformat/matroskadec: relax the check for cropped dimensions There seem to be samples with no Video element on video tracks in the wild, which even if not spec compliant, can be demuxed fine after lavf probes the stream with a decoder/parser. Relax the check to allow tracks with no dimensions to work, and also add a check for strict spec compliance to maintain the current behavior if desired. Fixes issue #20649. Signed-off-by: James Almer --- libavformat/matroskadec.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 6c12e1594c..8b5eda8213 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -3168,11 +3168,20 @@ static int matroska_parse_tracks(AVFormatContext *s) track->default_duration = default_duration; } } - if (track->video.pixel_cropl >= INT_MAX - track->video.pixel_cropr || + int has_dimensions = track->video.pixel_width || track->video.pixel_height; + if ((matroska->ctx->strict_std_compliance >= FF_COMPLIANCE_STRICT && + (!track->video.pixel_width || !track->video.pixel_height)) || + (track->video.pixel_cropl >= INT_MAX - track->video.pixel_cropr || track->video.pixel_cropt >= INT_MAX - track->video.pixel_cropb || - (track->video.pixel_cropl + track->video.pixel_cropr) >= track->video.pixel_width || - (track->video.pixel_cropt + track->video.pixel_cropb) >= track->video.pixel_height) + (track->video.pixel_cropl + track->video.pixel_cropr) >= track->video.pixel_width + !has_dimensions || + (track->video.pixel_cropt + track->video.pixel_cropb) >= track->video.pixel_height + !has_dimensions)) { + av_log(matroska->ctx, AV_LOG_ERROR, + "Invalid coded dimensions %"PRId64"x%"PRId64" [%"PRId64", %"PRId64", %"PRId64", %"PRId64"].\n", + track->video.pixel_width, track->video.pixel_height, + track->video.pixel_cropl, track->video.pixel_cropr, + track->video.pixel_cropt, track->video.pixel_cropb); return AVERROR_INVALIDDATA; + } track->video.cropped_width = track->video.pixel_width - track->video.pixel_cropl - track->video.pixel_cropr; track->video.cropped_height = track->video.pixel_height -