diff options
author | Peter Ross <pross@xvid.org> | 2014-02-14 22:58:55 +1100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-03-25 13:11:38 +0100 |
commit | 7d4c0220f18af97857f9f65cb36e2aaa0200220b (patch) | |
tree | 947732a1547350911b639b6a4532a0892459533d /libavcodec | |
parent | a81ee2651fafd4412d0f8df159a3a11f6365ba70 (diff) | |
download | ffmpeg-7d4c0220f18af97857f9f65cb36e2aaa0200220b.tar.gz |
avcodec/vp8: vp8_find_free_buffer
Signed-off-by: Peter Ross <pross@xvid.org>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/vp8.c | 40 |
1 files changed, 25 insertions, 15 deletions
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 |