aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2013-03-16 13:08:32 +0100
committerAnton Khirnov <anton@khirnov.net>2013-03-18 15:36:10 +0100
commitce0124acacd9acbfdc267464a4b52947a249b4bd (patch)
tree4dd29d99b6ada89f27f9873e063b4357e6f5719d
parent50c449ac24fbb4c03c15d2e2026cef2204b80385 (diff)
downloadffmpeg-ce0124acacd9acbfdc267464a4b52947a249b4bd.tar.gz
mpeg12: do not fail on zero dimensions in the sequence header.
The total frame size is a combination of the 12 bits in the sequence header and 2 more bits in the the sequence extension. While the specification explicitly forbids the dimensions from the sequence header from being 0 (thus ruling out multiples of 4096), such videos apparrently exist in the wild so we should attempt to decode them. Based on a patch by Michael Niedermayer <michaelni@gmx.at> Fixes Bug 416.
-rw-r--r--libavcodec/mpeg12.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index c32055d609..bd018d377f 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -1974,8 +1974,12 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx,
width = get_bits(&s->gb, 12);
height = get_bits(&s->gb, 12);
- if (width <= 0 || height <= 0)
- return -1;
+ if (width == 0 || height == 0) {
+ av_log(avctx, AV_LOG_WARNING, "Invalid horizontal or vertical size "
+ "value.\n");
+ if (avctx->err_recognition & AV_EF_BITSTREAM)
+ return AVERROR_INVALIDDATA;
+ }
s->aspect_ratio_info = get_bits(&s->gb, 4);
if (s->aspect_ratio_info == 0) {
av_log(avctx, AV_LOG_ERROR, "aspect ratio has forbidden 0 value\n");
@@ -2271,6 +2275,12 @@ static int decode_chunks(AVCodecContext *avctx,
break;
case PICTURE_START_CODE:
+ if (s2->width <= 0 || s2->height <= 0) {
+ av_log(avctx, AV_LOG_ERROR, "Invalid frame dimensions %dx%d.\n",
+ s2->width, s2->height);
+ return AVERROR_INVALIDDATA;
+ }
+
if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_SLICE) && s->slice_count) {
int i;