X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvp8.c;h=8cf67ba491441ffb81bfadc38169d65f62cf906e;hb=107f55cb01d2333541b8887194c487a6c6bc1ba1;hp=37bdcf75258572f6961cee00419ddcca850c8b11;hpb=6ace8374bacf33e5f3407cb50e928e7533eb5e92;p=ffmpeg diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index 37bdcf75258..8cf67ba4914 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -24,6 +24,7 @@ #include "libavutil/imgutils.h" #include "avcodec.h" +#include "internal.h" #include "vp8.h" #include "vp8data.h" #include "rectangle.h" @@ -50,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); @@ -88,7 +88,7 @@ static void vp8_decode_flush_impl(AVCodecContext *avctx, VP8Context *s = avctx->priv_data; int i; - if (!avctx->is_copy) { + if (!avctx->internal->is_copy) { for (i = 0; i < 5; i++) if (s->frames[i].data[0]) vp8_release_frame(s, &s->frames[i], prefer_delayed_free, can_direct_free); @@ -1567,13 +1567,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 +1816,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];