Commit 6ae03353 authored by Michael Niedermayer's avatar Michael Niedermayer

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: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 0fb9f77a
...@@ -294,6 +294,9 @@ static void free_picture_tables(Picture *pic) ...@@ -294,6 +294,9 @@ static void free_picture_tables(Picture *pic)
{ {
int i; int i;
pic->alloc_mb_width =
pic->alloc_mb_height = 0;
av_buffer_unref(&pic->mb_var_buf); av_buffer_unref(&pic->mb_var_buf);
av_buffer_unref(&pic->mc_mb_var_buf); av_buffer_unref(&pic->mc_mb_var_buf);
av_buffer_unref(&pic->mb_mean_buf); av_buffer_unref(&pic->mb_mean_buf);
...@@ -343,6 +346,9 @@ static int alloc_picture_tables(MpegEncContext *s, Picture *pic) ...@@ -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; return 0;
} }
...@@ -380,8 +386,8 @@ int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared) ...@@ -380,8 +386,8 @@ int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared)
int i, ret; int i, ret;
if (pic->qscale_table_buf) if (pic->qscale_table_buf)
if (pic->mbskip_table_buf->size < s->mb_stride * s->mb_height + 2 || if ( pic->alloc_mb_width != s->mb_width
pic->qscale_table_buf->size < s->mb_stride * (s->mb_height + 1) + 1 + s->mb_stride) || pic->alloc_mb_height != s->mb_height)
free_picture_tables(pic); free_picture_tables(pic);
if (shared) { if (shared) {
...@@ -490,6 +496,9 @@ do {\ ...@@ -490,6 +496,9 @@ do {\
dst->ref_index[i] = src->ref_index[i]; 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; return 0;
} }
......
...@@ -119,6 +119,9 @@ typedef struct Picture{ ...@@ -119,6 +119,9 @@ typedef struct Picture{
AVBufferRef *mc_mb_var_buf; AVBufferRef *mc_mb_var_buf;
uint16_t *mc_mb_var; ///< Table for motion compensated MB variances uint16_t *mc_mb_var; ///< Table for motion compensated MB variances
int alloc_mb_width; ///< mb_width used to allocate tables
int alloc_mb_height; ///< mb_height used to allocate tables
AVBufferRef *mb_mean_buf; AVBufferRef *mb_mean_buf;
uint8_t *mb_mean; ///< Table for MB luminance uint8_t *mb_mean; ///< Table for MB luminance
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment