aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/mpegvideo.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-03-28 23:46:13 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-03-29 02:11:34 +0100
commit6ae03353de664d670b32c33726f81758646f99e6 (patch)
treef8c4ae41f08c4c1116ca2bce89c088a24e2936ce /libavcodec/mpegvideo.c
parent0fb9f77a39d37264d461180a22e843cf01c7317c (diff)
downloadffmpeg-6ae03353de664d670b32c33726f81758646f99e6.tar.gz
mpegvideo: Make the table reallocation more robust.
This fixes out of array writes after resolution changes No FFmpeg releases are known to be affected by this Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/mpegvideo.c')
-rw-r--r--libavcodec/mpegvideo.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index f4739c43d5..2969a8c25b 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -294,6 +294,9 @@ static void free_picture_tables(Picture *pic)
{
int i;
+ pic->alloc_mb_width =
+ pic->alloc_mb_height = 0;
+
av_buffer_unref(&pic->mb_var_buf);
av_buffer_unref(&pic->mc_mb_var_buf);
av_buffer_unref(&pic->mb_mean_buf);
@@ -343,6 +346,9 @@ static int alloc_picture_tables(MpegEncContext *s, Picture *pic)
}
}
+ pic->alloc_mb_width = s->mb_width;
+ pic->alloc_mb_height = s->mb_height;
+
return 0;
}
@@ -380,8 +386,8 @@ int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared)
int i, ret;
if (pic->qscale_table_buf)
- if (pic->mbskip_table_buf->size < s->mb_stride * s->mb_height + 2 ||
- pic->qscale_table_buf->size < s->mb_stride * (s->mb_height + 1) + 1 + s->mb_stride)
+ if ( pic->alloc_mb_width != s->mb_width
+ || pic->alloc_mb_height != s->mb_height)
free_picture_tables(pic);
if (shared) {
@@ -490,6 +496,9 @@ do {\
dst->ref_index[i] = src->ref_index[i];
}
+ dst->alloc_mb_width = src->alloc_mb_width;
+ dst->alloc_mb_height = src->alloc_mb_height;
+
return 0;
}