diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index bd52478ce7..e0bc313301 100644 --- a/libavcodec/vp9.c +++ b/libavcodec/vp9.c @@ -1569,6 +1569,8 @@ static int vp9_decode_frame(AVCodecContext *avctx, AVFrame *frame, av_log(avctx, AV_LOG_ERROR, "Requested reference %d not available\n", ref); return AVERROR_INVALIDDATA; } + ff_progress_frame_await(&s->s.refs[ref], INT_MAX); + if ((ret = av_frame_ref(frame, s->s.refs[ref].f)) < 0) return ret; frame->pts = pkt->pts; @@ -1715,10 +1717,8 @@ static int vp9_decode_frame(AVCodecContext *avctx, AVFrame *frame, #endif { ret = decode_tiles(avctx, data, size); - if (ret < 0) { - ff_progress_frame_report(&s->s.frames[CUR_FRAME].tf, INT_MAX); - return ret; - } + if (ret < 0) + goto fail; } // Sum all counts fields into td[0].counts for tile threading @@ -1732,18 +1732,19 @@ static int vp9_decode_frame(AVCodecContext *avctx, AVFrame *frame, ff_thread_finish_setup(avctx); } } while (s->pass++ == 1); - ff_progress_frame_report(&s->s.frames[CUR_FRAME].tf, INT_MAX); if (s->td->error_info < 0) { av_log(avctx, AV_LOG_ERROR, "Failed to decode tile data\n"); s->td->error_info = 0; - return AVERROR_INVALIDDATA; + ret = AVERROR_INVALIDDATA; + goto fail; } if (avctx->export_side_data & AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS) { ret = vp9_export_enc_params(s, &s->s.frames[CUR_FRAME]); if (ret < 0) - return ret; + goto fail; } + ff_progress_frame_report(&s->s.frames[CUR_FRAME].tf, INT_MAX); finish: // ref frame setup @@ -1757,6 +1758,9 @@ finish: } return pkt->size; +fail: + ff_progress_frame_report(&s->s.frames[CUR_FRAME].tf, INT_MAX); + return ret; } static void vp9_decode_flush(AVCodecContext *avctx)