vp8: force reallocation in update_thread_context after frame size change

Signed-off-by: Janne Grunau <janne-libav@jannau.net>
pull/2/head
Ronald S. Bultje 13 years ago committed by Janne Grunau
parent f05c2fb6eb
commit 5653579381
  1. 28
      libavcodec/vp8.c

@ -33,6 +33,19 @@
# include "arm/vp8.h" # include "arm/vp8.h"
#endif #endif
static void free_buffers(VP8Context *s)
{
av_freep(&s->macroblocks_base);
av_freep(&s->filter_strength);
av_freep(&s->intra4x4_pred_mode_top);
av_freep(&s->top_nnz);
av_freep(&s->edge_emu_buffer);
av_freep(&s->top_border);
av_freep(&s->segmentation_map);
s->macroblocks = NULL;
}
static void vp8_decode_flush(AVCodecContext *avctx) static void vp8_decode_flush(AVCodecContext *avctx)
{ {
VP8Context *s = avctx->priv_data; VP8Context *s = avctx->priv_data;
@ -45,15 +58,7 @@ static void vp8_decode_flush(AVCodecContext *avctx)
} }
memset(s->framep, 0, sizeof(s->framep)); memset(s->framep, 0, sizeof(s->framep));
av_freep(&s->macroblocks_base); free_buffers(s);
av_freep(&s->filter_strength);
av_freep(&s->intra4x4_pred_mode_top);
av_freep(&s->top_nnz);
av_freep(&s->edge_emu_buffer);
av_freep(&s->top_border);
av_freep(&s->segmentation_map);
s->macroblocks = NULL;
} }
static int update_dimensions(VP8Context *s, int width, int height) static int update_dimensions(VP8Context *s, int width, int height)
@ -1750,6 +1755,11 @@ static int vp8_decode_update_thread_context(AVCodecContext *dst, const AVCodecCo
{ {
VP8Context *s = dst->priv_data, *s_src = src->priv_data; VP8Context *s = dst->priv_data, *s_src = src->priv_data;
if (s->macroblocks_base &&
(s_src->mb_width != s->mb_width || s_src->mb_height != s->mb_height)) {
free_buffers(s);
}
s->prob[0] = s_src->prob[!s_src->update_probabilities]; s->prob[0] = s_src->prob[!s_src->update_probabilities];
s->segmentation = s_src->segmentation; s->segmentation = s_src->segmentation;
s->lf_delta = s_src->lf_delta; s->lf_delta = s_src->lf_delta;

Loading…
Cancel
Save