aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Colwell <acolwell@chromium.org>2011-11-28 07:21:47 -0800
committerRonald S. Bultje <rsbultje@gmail.com>2011-12-02 07:21:08 -0800
commite02dec25aba7fc8b48b235725a311af906818eee (patch)
treec4db9c10ab3659101c619f2d844997f0483c196d
parent7d68f592f6b3b434b4a4c96a3e28c4149ef17060 (diff)
downloadffmpeg-e02dec25aba7fc8b48b235725a311af906818eee.tar.gz
vp8: flush buffers on size changes.
-rw-r--r--libavcodec/vp8.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index d9be734a9b..833819890d 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -51,8 +51,7 @@ static int vp8_alloc_frame(VP8Context *s, AVFrame *f)
int ret;
if ((ret = ff_thread_get_buffer(s->avctx, f)) < 0)
return ret;
- if (s->num_maps_to_be_freed) {
- assert(!s->maps_are_invalid);
+ if (s->num_maps_to_be_freed && !s->maps_are_invalid) {
f->ref_index[0] = s->segmentation_maps[--s->num_maps_to_be_freed];
} else if (!(f->ref_index[0] = av_mallocz(s->mb_width * s->mb_height))) {
ff_thread_release_buffer(s->avctx, f);
@@ -1567,13 +1566,15 @@ static int vp8_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
VP8Context *s = avctx->priv_data;
int ret, mb_x, mb_y, i, y, referenced;
enum AVDiscard skip_thresh;
- AVFrame *av_uninit(curframe), *prev_frame = s->framep[VP56_FRAME_CURRENT];
+ AVFrame *av_uninit(curframe), *prev_frame;
release_queued_segmaps(s, 0);
if ((ret = decode_frame_header(s, avpkt->data, avpkt->size)) < 0)
return ret;
+ prev_frame = s->framep[VP56_FRAME_CURRENT];
+
referenced = s->update_last || s->update_golden == VP56_FRAME_CURRENT
|| s->update_altref == VP56_FRAME_CURRENT;
@@ -1814,6 +1815,7 @@ static int vp8_decode_update_thread_context(AVCodecContext *dst, const AVCodecCo
if (s->macroblocks_base &&
(s_src->mb_width != s->mb_width || s_src->mb_height != s->mb_height)) {
free_buffers(s);
+ s->maps_are_invalid = 1;
}
s->prob[0] = s_src->prob[!s_src->update_probabilities];