From 7d4c0220f18af97857f9f65cb36e2aaa0200220b Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Fri, 14 Feb 2014 22:58:55 +1100 Subject: avcodec/vp8: vp8_find_free_buffer Signed-off-by: Peter Ross Signed-off-by: Michael Niedermayer --- libavcodec/vp8.c | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) (limited to 'libavcodec/vp8.c') diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index 296eb98202..f13228670d 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -110,6 +110,30 @@ static void vp8_decode_flush(AVCodecContext *avctx) vp8_decode_flush_impl(avctx, 0); } +static VP8Frame * vp8_find_free_buffer(VP8Context *s) +{ + VP8Frame *frame = NULL; + int i; + + // find a free buffer + for (i = 0; i < 5; i++) + if (&s->frames[i] != s->framep[VP56_FRAME_CURRENT] && + &s->frames[i] != s->framep[VP56_FRAME_PREVIOUS] && + &s->frames[i] != s->framep[VP56_FRAME_GOLDEN] && + &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2]) { + frame = &s->frames[i]; + break; + } + if (i == 5) { + av_log(s->avctx, AV_LOG_FATAL, "Ran out of free frames!\n"); + abort(); + } + if (frame->tf.f->data[0]) + vp8_release_frame(s, frame); + + return frame; +} + static int update_dimensions(VP8Context *s, int width, int height) { AVCodecContext *avctx = s->avctx; @@ -1866,21 +1890,7 @@ int ff_vp8_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2]) vp8_release_frame(s, &s->frames[i]); - // find a free buffer - for (i = 0; i < 5; i++) - if (&s->frames[i] != prev_frame && - &s->frames[i] != s->framep[VP56_FRAME_PREVIOUS] && - &s->frames[i] != s->framep[VP56_FRAME_GOLDEN] && - &s->frames[i] != s->framep[VP56_FRAME_GOLDEN2]) { - curframe = s->framep[VP56_FRAME_CURRENT] = &s->frames[i]; - break; - } - if (i == 5) { - av_log(avctx, AV_LOG_FATAL, "Ran out of free frames!\n"); - abort(); - } - if (curframe->tf.f->data[0]) - vp8_release_frame(s, curframe); + curframe = s->framep[VP56_FRAME_CURRENT] = vp8_find_free_buffer(s); // Given that arithmetic probabilities are updated every frame, it's quite likely // that the values we have on a random interframe are complete junk if we didn't -- cgit v1.2.3